अपाचे वेबसर्वर सर्वर-स्थिति के साथ अनुत्तरदायी है जो कनेक्शन के लिए प्रतीक्षा कर रहे सभी बाल प्रक्रियाओं को दिखा रहा है [बंद]


10

मेरा सेटअप: मेरे पास 3 समान वेबसर्वर मशीनें हैं जो डीएनएस पर सरल भार संतुलन के साथ एक ही उच्च भारित डायनामिक वेबसाइट की सेवा प्रदान करती हैं। सेवा एक ही अपाचे विन्यास के साथ दो साल से अधिक समय से काम कर रही है: Apache2, php5, ubuntu 8.04 linux 2.6.24-29-server।

मेरी समस्या: लगभग दो सप्ताह पहले से मैं इस विन्यास की समस्याओं का सामना कर रहा हूँ। लगभग हर दिन मेरे पास लगभग 5 मिनट के लिए एक छोटा पल होता है, जिसमें वेबसाइट उपलब्ध नहीं है। मैं अभी भी ssh पर सर्वर में लॉगिन करने में सक्षम हूं। अगर मैं दौड़ता htopहूं, तो मैं देखता हूं कि मशीन कुछ नहीं कर रही है। मेरे पास लगभग 1000 अपाचे प्रक्रियाएं चल रही हैं, लेकिन कोई सीपीयू गतिविधि नहीं है।

मैंने इस स्थिति को डीबग करने के लिए अपाचे mod_status का उपयोग किया है। प्रक्रिया स्कोरबोर्ड इस तरह दिखता है:

_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

इसलिए अधिकांश प्रक्रियाएं केवल कनेक्शन की प्रतीक्षा कर रही हैं। लगभग 5 मिनट के बाद स्थिति सामान्य हो जाएगी: मेरे पास प्रत्येक मशीन पर बहुत कम प्रक्रियाएं हैं, अधिकांश श्रमिकों के पास "" है - स्थिति (वे एक अनुरोध को संसाधित करने के लिए खुले हैं) और निश्चित रूप से वेबसाइट उपलब्ध नहीं है!

इसलिए मैं लॉग में कुछ खोजने की कोशिश कर रहा हूं, लेकिन बस कुछ भी नहीं है ... अपाचे एक्सेस लॉग लगभग 4 मिनट के लिए चुप है, वही त्रुटि लॉग के लिए है। मैं भी अन्य सिस्टम लॉग में कुछ भी गलत नहीं समझ सकता।

सभी 3 वेबसर्वर्स पर स्थिति समान है (उन सभी में यह लोड पीक और एक ही समय में अनुत्तरदायी स्थिति है), इसलिए मुझे नहीं लगता कि यह हार्डवेयर से संबंधित है। लेकिन मुझे लगता है, यह कुछ नेटवर्क (tcp) समस्या से संबंधित हो सकता है।

कोई विचार?

संपादित करें: कुछ और जानकारी, जो मैंने अभी खोजी है:

यह बस फिर से हुआ है और मैं यह सत्यापित करने में सक्षम था कि यह समस्या होने पर मैं स्थानीय रूप से कनेक्ट करने में सक्षम नहीं हूं।

मैंने ऐसा होने के बाद निम्नलिखित कमांड के साथ कुछ कनेक्शन आँकड़े बनाए हैं: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c

  • 109 CLOSE_WAIT
  • 2652 की स्थापना की
  • 2 FIN_WAIT1
  • 11 LAST_ACK
  • 12 लिस्टेन
  • 91 SYN_RECV
  • 1 SYN_SENT
  • 16 TIME_WAIT

अगर मैं कुछ समय बाद उसी कमांड को निष्पादित करता हूं, तो मेरे पास कुछ इस तरह है:

  • 4 बंद
  • 108 स्थापित किया गया
  • 18 FIN_WAIT1
  • 182 FIN_WAIT2
  • 37 LAST_ACK
  • 12 लिस्टेन
  • 50 SYN_RECV
  • 11276 TIME_WAIT

इसलिए सामान्य स्थिति में मेरे पास इस क्षण में अपाचे द्वारा नियंत्रित किए जा रहे ग्राहकों द्वारा केवल 100-200 खुले कनेक्शन हैं। जब मेरे पास यह "क्रैश" होता है, तो मेरे पास बहुत अधिक कनेक्शन होते हैं। इसका विश्लेषण करने का सबसे अच्छा तरीका क्या है?

EDIT2: Apache2.conf में महत्वपूर्ण लाइनें हैं:

KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit           920
StartServers          30
MinSpareServers       80
MaxSpareServers      120
MaxClients          920
MaxRequestsPerChild   700
</IfModule>

यह php_mod के साथ एक अपाचे 2 प्रीफ़ॉर्क है।

सर्वर में 8 जीबी रैम और 4 जीबी स्वैप विभाजन है।


जब आप स्थानीय होस्ट या सर्वर (यदि वे एक ही नेटवर्क पर हों) के बीच वेब साइट को चलाते समय एक ही लक्षण दिखाते हैं, तो क्या आप वैसा ही लक्षण दिखाते हैं?
एलेक्स फोर्ब्स

हो सकता है कि एक ट्रैफ़िक डंप ( tcpdump) आपको समस्या की जड़ तक पहुंचने में मदद करे ... btw आपकी स्मृति उपयोग और फ़ायरवॉल नीतियाँ क्या हैं?
drcelus

@ al4 पिछली बार इस खुशी के लिए मैं स्थानीय होस्ट से सर्वर-स्थिति पृष्ठ से कनेक्ट करने में सक्षम था, जबकि मैं बाहर से वेबपेज से कनेक्ट करने में असमर्थ था। मुझे यकीन नहीं है, क्योंकि यह एक यादृच्छिक चीज भी हो सकती है, जबकि कुछ कार्यकर्ता उपलब्ध हो गए। अगली बार समस्या होने पर मैं इसका परीक्षण करूंगा। आपका सुझाव क्या होगा, अगर मैं बाहर और स्थानीय कनेक्शन के बीच किसी भी अंतर की पुष्टि कर सकता हूं?
जेफ

यदि आप यह पुष्टि कर सकते हैं कि यह स्थानीय रूप से काम करता है, लेकिन बाहर से यह नेटवर्क के लिए मामला मजबूत नहीं करता है, तो इसका मतलब है - आपको चाहिए कि tcpdumps और wirehark के साथ दोनों सिरों पर परीक्षण करना चाहिए, यह देखने के लिए कि क्या हो रहा है, बजाय apache प्रक्रियाओं को strace'ing करने के। यदि संभव हो तो मैं उसी लैन पर एक मेजबान से भी परीक्षण करूंगा। और देखने के लिए dmesg की जाँच करें कि क्या कोई संदेश है जो संबंधित हो सकता है, लेकिन लगता है कि आपने पहले ही ऐसा कर लिया है।
एलेक्स फोर्ब्स

यह अभी फिर से हुआ है। और मैं यह सत्यापित करने में सक्षम था कि जब यह समस्या उत्पन्न होती है तो मैं स्थानीय रूप से कनेक्ट करने में सक्षम नहीं हूं। मैंने netstat के साथ कुछ कनेक्शन आँकड़े भी बनाए हैं: प्रश्न पाठ देखें
जेफ

जवाबों:


2

वर्तमान मेजबानों और अनुरोधों पर नजर रखने के लिए आपको mod_status ( http://httpd.apache.org/docs/2.2/mod/mod_status.html#extendedstatus ) की विस्तारित स्थिति को सक्षम करना चाहिए । मुझे लगता है कि एक स्क्रिप्ट (एस) / पृष्ठ (एस) है जो कनेक्शन जारी करने में बहुत अधिक समय लेता है और यह कनेक्शन को स्टैकिंग बनाता है।


1

पहला: Max open filesप्रक्रिया पर अपनी सीमा की जाँच करें । एक सक्रिय सॉकेट कनेक्शन एक खुली फ़ाइल के रूप में गिना जाता है। cat /proc/###/limitsएक और प्रक्रिया के लिए प्रभावी मूल्य की जांच करने का एक अच्छा तरीका है। आप उन खुली फ़ाइलों की सूची प्राप्त कर सकते हैं lsof -p ###जहाँ ### आपके वेब सर्वर की प्रोसेस आईडी है। आप यह lsof -p ### | wc -lदेखने के लिए तुलना कर सकते हैं कि आप सीमा के कितने करीब पहुंच रहे हैं। यदि आप सीमा को मार रहे हैं तो आपको अपाचे के एरर_लॉग में भी संदेश देखना चाहिए।

आपको प्रत्येक सॉकेट कनेक्शन के लिए फ़ाइल हैंडल की आवश्यकता होती है, और प्रत्येक cgi स्क्रिप्ट या डेटा फ़ाइल संदर्भ के लिए भी। 920 MaxClients के लिए, आपको httpd प्रक्रिया के लिए कम से कम 4,000 फ़ाइलों को कॉन्फ़िगर करना चाहिए। आप निम्न सामग्री के साथ /etc/security/limits.d/ में फ़ाइल जोड़कर फ़ाइलों की संख्या बढ़ा सकते हैं। उपयोगकर्ता नाम सुनिश्चित करें कि आप अपने वेब सर्वर के लिए क्या उपयोग कर रहे हैं।

apache soft nofile 10000
apache hard nofile 10000

दूसरा: यदि पोर्ट थकावट आपकी समस्या है, तो आप /etc/sysctl.conf में कुछ आईपी सेटिंग्स समायोजित कर सकते हैं। (शुरुआत के साथ net.ipv4.tcp_fin_timeout)। यह आमतौर पर बहुत छोटे कनेक्शन के साथ ही एक समस्या है। कई TIME_WAIT सॉकेट इस में से एक सूचक है, लेकिन इस बंदरगाह थकावट केवल जब के बारे में syslog में त्रुटियों के साथ इंगित करता है possible SYN floodingऔर Sending cookies। आपको यह भी सुनिश्चित करना चाहिए कि आपका सर्वर एक फ़ायरवॉल के पीछे है जो दुर्भावनापूर्ण SYN हमलों को विफल कर सकता है।


0

यह भी ध्यान रखें कि प्रीफ़ॉर्क MPM में, प्रत्येक प्रक्रिया में PHP अपनी मेमोरी स्पेस (इसकी मेमोरी लिमिट सेटिंग क्या है?) में होगी। आप कार्यकर्ता MPM को बदलने की कोशिश करना पसंद कर सकते हैं, जिसके लिए थोड़ा अलग PHP मॉड्यूल की आवश्यकता हो सकती है।

इसके अलावा दूरदराज के कान की बाली अपने अपाचे विन्यास के बाहर के मॉड्यूल को ट्रिम करने के लिए

मेरे अनुभव में, खोज इंजन क्रॉलर जैसी चीज़ों या ARP टकराव जैसी चीज़ों से ऐसी चीज़ों की शुरुआत होती है। या नेटवर्क के कुछ संबंधित हिस्से में ट्रैफ़िक का स्तर।

आप अच्छी तरह से 'सर' को उपयोगी पा सकते हैं ... सबसे अनुकूल नहीं, लेकिन निश्चित रूप से उपयोगी।

संभवतः io संबंधित भी। सर आपको बता सकते हैं (यदि आप इसे डिस्क गतिविधि रिकॉर्ड करने के लिए कॉन्फ़िगर करते हैं), औसत io प्रतीक्षा समय क्या है। आप शीर्ष में IO प्रतीक्षा समय को भी देख सकते हैं (जो कि प्रतिशत है, वास्तव में इसका क्या अर्थ है, इस पर पढ़ें)। यह महत्वपूर्ण हो सकता है यदि आप एक SAN या आभासी वातावरण का उपयोग कर रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.