पता करें कि वास्तव में उच्च CPU उपयोग अपाचे प्रक्रिया क्या कर रही है?


18

वर्तमान में हमारे सर्वर के साथ कुछ समस्याएँ हैं, जहाँ, रुक-रुक कर, हमें अपाचे प्रक्रियाएँ मिल रही हैं, जो सिर्फ 100 जीबी सीपीयू लेकर चलती हैं और चलती हैं।

शीर्ष पर चलने पर, हम निम्नलिखित देखते हैं:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20788 www-data  20   0  318m  18m 3984 R  100  0.0  40:29.21 /usr/sbin/apache2 -k start
23523 www-data  20   0  319m  20m 4684 R  100  0.0   4:12.36 /usr/sbin/apache2 -k start

मैं यह जानने की कोशिश करना चाहता हूं कि कौन सी स्क्रिप्ट (या जो कुछ भी है) यह पैदा कर रही है, इसलिए मैंने कोशिश की:

 strace -p 20788

लेकिन यह बिल्कुल भी कोई आउटपुट नहीं दिखाता है (मैंने इसे लगभग 10 मिनट के लिए छोड़ दिया है, और यह कुछ भी नहीं दिखाता है)। मेरी समझ से, इसका मतलब यह हो सकता है कि यह एक अनंत लूप में फंस गया है, और दिखाने के लिए कोई "सिस्टम कॉल" नहीं है।

क्या कुछ और है जो मैं दिखा सकता हूं कि क्या चल रहा है?

धन्यवाद

संपादित करें - उल्लेख करना भूल गए, यह किसी भी समय कुछ सौ उपयोगकर्ताओं के साथ एक लाइव सर्वर है! इसलिए मैं वास्तव में स्वतंत्र रूप से कॉन्फ़िगर विकल्प बदलने और अपाचे को पुनः आरंभ करने का प्रयास नहीं कर सकता।

2 संपादित करें - gdb से backtrace (bt) PHP के साथ कॉन्फ़िगर नहीं किए जाने पर यह सब उपयोगी नहीं लगता है - यह डीबग-डिबग के साथ कॉन्फ़िगर नहीं किया जाता है - यह केवल "निष्पादित ()" दिखाता है, लेकिन मुझे यह जानना होगा कि PHP स्क्रिप्ट क्या है वास्तव में चल रहा है .. क्या कोई और तरीका है?

#0  0x00007f6c143fb0c5 in ?? () from /usr/lib/apache2/modules/libphp5.so
#1  0x00007f6c143b040b in execute () from /usr/lib/apache2/modules/libphp5.so
#2  0x00007f6c1438b970 in zend_execute_scripts () from     /usr/lib/apache2/modules/libphp5.so
#3  0x00007f6c14337fe3 in php_execute_script () from     /usr/lib/apache2/modules/libphp5.so
#4  0x00007f6c1441ae7d in ?? () from /usr/lib/apache2/modules/libphp5.so
#5  0x00007f6c18912508 in ap_run_handler ()
#6  0x00007f6c1891297e in ap_invoke_handler ()
#7  0x00007f6c18922570 in ap_process_request ()
#8  0x00007f6c1891f398 in ?? ()
#9  0x00007f6c18918fa8 in ap_run_process_connection ()
#10 0x00007f6c189271d0 in ?? ()
#11 0x00007f6c1892793a in ?? ()
#12 0x00007f6c189284e7 in ap_mpm_run ()
#13 0x00007f6c188fd4a4 in main ()

1
अपाचे "सुशोभित" पुनरारंभ का समर्थन करता है, तो आप क्यों नहीं करेंगे?
22

1
मुझे लगता है कि जब हमने इसे पहले कोशिश की थी, तो यह "अटक" अपाचे प्रक्रियाओं के कारण इनायत से पुनः आरंभ नहीं कर सका ... हालांकि यह गलत हो सकता है, यह कुछ समय पहले था।
BT643

एक और चाल अलग बंदरगाह पर अपाचे का एक और उदाहरण चलाने के लिए है, इसके लिए नए कनेक्शन को पुनर्निर्देशित करना।
पोइज

जवाबों:


9

ठीक है, अगर आप बहादुर महसूस कर रहे हैं:

gdb -p 20788

इसके बाद btस्टैक-फ्रेम देखने के लिए जारी करें, उदाहरण के लिए

और BTW, वहाँ भी ltraceउल्लेख करने के लिए है - यह भी प्रयास करें।

युपीडी। : ठीक है, ठीक है, क्योंकि अब हमें इस बात का अंदाजा है कि अपाचे वास्तव में कुछ चल रहा है, तो आप mod_statusआउटपुट को क्यों नहीं देखेंगे - विस्तारित ?


gdb स्थापित नहीं है :( इंतजार करना होगा जब तक मैं कल काम करने के लिए वापस जाने के लिए यह देखने के लिए कि क्या मैं इसे किसी भी मुद्दे को पैदा किए बिना स्थापित कर सकता हूं .. ltraceया तो कोई आउटपुट नहीं दिखा।
BT643

बस प्रारंभिक पोस्ट में जीडीबी बीटी से परिणाम जोड़े गए .. वास्तव में मुझे बिल्कुल नहीं बताएं!
BT643

ओह, यह देखकर खुशी हुई कि मैंने सही दिशा सुझाई है। )
पोएज

@ BT643, UPD देखें।
गरीब

4
वास्तविक mod_status पहले से ही डिफ़ॉल्ट रूप से सक्षम था, यह केवल 127.0.0.1 से एक्सेस तक सीमित था। मैं बस एसएसएच के माध्यम से लॉग इन करता हूं और आउटपुट को फाइल में पाइप करता हूं curl domain.com/server-status > randomfile.html- फिर फाइल देखी। यह एक पुराने डेवलपर्स कोड एक पाश (PHP फ़ाइल) में फंस रही थी बाहर कर दिया! सभी अब छँट गए। मदद के लिए धन्यवाद :)
BT643

2

उपयोग करने के लिए एक बहुत ही आसान तरीका है htop। आप उच्च CPU प्रक्रियाओं के लिए सॉर्ट कर सकते हैं और फिर उपयोग कर सकते हैं

  • के लिए है straceएक प्रक्रिया
  • एल lsofप्रक्रियाओं की खुली फाइलों को देखने के लिए
  • एल को ltrace

मैंने पाया कि कम से कम एक विकल्प उस स्क्रिप्ट को ढूंढता है जो लोड उत्पन्न करता है और आप निश्चित रूप से डिबग करने के लिए उत्पादन वेब सर्वर पर इसका उपयोग कर सकते हैं।


1

तुम कोशिश कर सकते हो:

  • iotop (सिस्टम पर I / O दिखा रहा है)
  • netstat -t (कनेक्शन दिखा रहा है)
  • एपाचे लॉगफाइल्स पर एक नज़र डालें और पता करें कि सर्वर ने क्या किया था
  • Apache प्रक्रिया के लिए कुछ RLimits सेट करें। जब ये सीमाएँ समाप्त हो जाती हैं, तो आपको कुछ और जानकारी देते हुए प्रक्रिया को मार दिया जाएगा

0

आपका आदेश कार्य करना चाहिए बशर्ते आप एक HTTP अनुरोध करें जो उस पीआईडी ​​को ट्रिगर करता है।

शायद आप केवल एक बच्चे की प्रक्रिया के साथ अपाचे को अस्थायी रूप से फिर से कॉन्फ़िगर करना चाहते हैं?


ध्यान रखें कि केवल एक बच्चे की प्रक्रिया का मतलब है कि अपाचे केवल एक अनुरोध की सेवा कर सकता है, और यदि वह एकल बच्चा फंस गया है, तो अपाचे किसी भी अनुरोध को पूरा करने में सक्षम नहीं होगा।
स्टीफन लासिवस्की

ऐसा नहीं कर सकते क्योंकि यह सैकड़ों समवर्ती उपयोगकर्ताओं के साथ एक लाइव सर्वर है (इसे ओपी में जोड़ा है क्योंकि यह पहले स्पष्ट नहीं था)
BT643

0

उस अपाचे की पीआईडी ​​कम है, यह सभी का पिता हो सकता है। यह निश्चित रूप से उच्च सीपीयू उपयोग की व्याख्या करेगा (यह चारों ओर रहता है, दूसरों को लोड के अनुसार याद किया जाता है और याद किया जाता है)। बहुत संचित सीपीयू समय का मतलब यह हो सकता है कि यह लंबे समय से चल रहा हो। से कोई उत्पादन strace(1)सिर्फ साधन यह कोई सिस्टम कॉल किया था। हां, यह एक तंग लूप में हो सकता है, लेकिन अपाचे अनिवार्य रूप से 'नेट' पर I / O है, इसलिए मुझे लगता है कि यह कुछ उपयोगी नहीं है। किसी भी स्थिति में, एक सीपीयू का 100% अजीब।


कम पीआईडी ​​जरूरी नहीं है कि यह एक पुरानी प्रक्रिया है। पीआईडी ​​का अधिकतम मूल्य है, और कम पीआईडी ​​का उपयोग करके नई प्रक्रियाओं को बनाया जा सकता है।
ऑस्ट्रेलियाई जूल 7'15

0

इसे इस्तेमाल करे:

1) दिनांक / समय, PHP स्क्रिप्ट और PID का उपयोग करके लॉग शुरू करें getmypid()

2) इसके बाद अपने सर्वर को देखें top

3) जब आप अपाचे प्रक्रिया को उच्च होते हुए देखते हैं, तो उसी तिथि / समय की खोज करें और अपने लॉग में पीआईडी। आपको समस्याग्रस्त स्क्रिप्ट ढूंढने में सक्षम होना चाहिए।


यह एक दिलचस्प समाधान है, लेकिन मैं इसे और अधिक संसाधनों को लेने के लायक देख सकता हूं, यह देखते हुए कि mod_statusइसका काम काफी अच्छा है।
ऑस्ट्रेलियाई जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.