एक उच्च लोड अपाचे सर्वर ट्यूनिंग


12

मैं कुछ सर्वर प्रदर्शन समस्याओं को समझ रहा हूँ जिन्हें मैं (हमारे लिए) भारी लोड वाले वेब सर्वर के साथ देख रहा हूँ। पर्यावरण इस प्रकार है:

  • डेबियन लेनी (सभी स्थिर पैकेज + सुरक्षा अपडेट के लिए तैयार)
  • अपाचे 2.2.9
  • PHP 5.2.6
  • अमेज़न EC2 बड़े उदाहरण

जो व्यवहार हम देख रहे हैं वह यह है कि वेब आमतौर पर उत्तरदायी लगता है, लेकिन एक अनुरोध को संभालने में थोड़ी देरी के साथ - कभी-कभी हमारे उपयोग के समय में 2-3 सेकंड का एक अंश, कभी-कभी 2-3 सेकंड। सर्वर पर वास्तविक लोड बहुत अधिक बताया जा रहा है - अक्सर 10.xx या 20.xx द्वारा रिपोर्ट किया जाता है top। इसके अलावा, इन समयों के दौरान भी सर्वर पर अन्य चीजें चलाना viबहुत धीमी गति से होता है, इसलिए लोड निश्चित रूप से बढ़ जाता है। तात्कालिक रूप से पर्याप्त अपाचे उस प्रारंभिक देरी के अलावा, बहुत संवेदनशील है।

हमने अपाचे को निम्नानुसार कॉन्फ़िगर किया है, प्रीफ़ॉर्क का उपयोग करते हुए:

StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients          150
MaxRequestsPerChild   0

और के रूप में KeepAlive:

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

सर्वर-स्टेटस पेज को देखते हुए, यहां तक ​​कि भारी लोड के इन समय में भी हम शायद ही कभी क्लाइंट कैप को मार रहे हैं, आमतौर पर 80-100 अनुरोधों और रखवाले राज्य के कई लोगों के बीच सेवा कर रहे हैं। यह मुझे "हैंडलर की प्रतीक्षा" के रूप में शुरुआती अनुरोध सुस्ती का शासन करने के लिए कहता है, लेकिन मैं गलत हो सकता हूं।

अमेज़ॅन की क्लाउडवॉच मॉनिटरिंग मुझे बताती है कि जब हमारा ओएस> 15 का लोड रिपोर्ट कर रहा है, तब भी हमारे उदाहरण सीपीयू का उपयोग 75-80% के बीच है।

उदाहरण से आउटपुट top:

top - 15:47:06 up 31 days,  1:38,  8 users,  load average: 11.46, 7.10, 6.56
Tasks: 221 total,  28 running, 193 sleeping,   0 stopped,   0 zombie
Cpu(s): 66.9%us, 22.1%sy,  0.0%ni,  2.6%id,  3.1%wa,  0.0%hi,  0.7%si,  4.5%st
Mem:   7871900k total,  7850624k used,    21276k free,    68728k buffers
Swap:        0k total,        0k used,        0k free,  3750664k cached

अधिकांश प्रक्रियाएँ ऐसी दिखती हैं:

24720 www-data  15   0  202m  26m 4412 S    9  0.3   0:02.97 apache2                                                                       
24530 www-data  15   0  212m  35m 4544 S    7  0.5   0:03.05 apache2                                                                       
24846 www-data  15   0  209m  33m 4420 S    7  0.4   0:01.03 apache2                                                                       
24083 www-data  15   0  211m  35m 4484 S    7  0.5   0:07.14 apache2                                                                       
24615 www-data  15   0  212m  35m 4404 S    7  0.5   0:02.89 apache2            

उदाहरण आउटपुट ऊपर से vmstatउसी समय से:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 8  0      0 215084  68908 3774864    0    0   154   228    5    7 32 12 42  9
 6 21      0 198948  68936 3775740    0    0   676  2363 4022 1047 56 16  9 15
23  0      0 169460  68936 3776356    0    0   432  1372 3762  835 76 21  0  0
23  1      0 140412  68936 3776648    0    0   280     0 3157  827 70 25  0  0
20  1      0 115892  68936 3776792    0    0   188     8 2802  532 68 24  0  0
 6  1      0 133368  68936 3777780    0    0   752    71 3501  878 67 29  0  1
 0  1      0 146656  68944 3778064    0    0   308  2052 3312  850 38 17 19 24
 2  0      0 202104  68952 3778140    0    0    28    90 2617  700 44 13 33  5
 9  0      0 188960  68956 3778200    0    0     8     0 2226  475 59 17  6  2
 3  0      0 166364  68956 3778252    0    0     0    21 2288  386 65 19  1  0

और अंत में, अपाचे से उत्पादन server-status:

Server uptime: 31 days 2 hours 18 minutes 31 seconds
Total accesses: 60102946 - Total Traffic: 974.5 GB
CPU Usage: u209.62 s75.19 cu0 cs0 - .0106% CPU load
22.4 requests/sec - 380.3 kB/second - 17.0 kB/request
107 requests currently being processed, 6 idle workers

C.KKKW..KWWKKWKW.KKKCKK..KKK.KKKK.KK._WK.K.K.KKKKK.K.R.KK..C.C.K
K.C.K..WK_K..KKW_CK.WK..W.KKKWKCKCKW.W_KKKKK.KKWKKKW._KKK.CKK...
KK_KWKKKWKCKCWKK.KKKCK..........................................
................................................................

अपने सीमित अनुभव से मैं निम्नलिखित निष्कर्ष / प्रश्न तैयार करता हूं:

  • हम बहुत अधिक KeepAliveअनुरोधों की अनुमति दे सकते हैं

  • मैं देख रहा हूं कि कुछ समय आईओएम के इंतजार में व्यतीत हो रहा है, हालांकि लगातार नहीं और बहुत कुछ नहीं (मुझे लगता है?) तो मुझे यकीन नहीं है कि यह एक बड़ी चिंता है या नहीं, मैं vmstat के साथ कम अनुभवी हूं

  • इसके अलावा, मैं कुछ पुनरावृत्तियों में कई प्रक्रियाओं को देखता हूं, जो सेवा के इंतजार में हैं, जो कि मैं अपने वेब सर्वर पर प्रारंभिक पेज लोड देरी के लिए जिम्मेदार हूं, संभवतः गलत तरीके से

  • हम स्थिर सामग्री (75% या अधिक) और स्क्रिप्ट सामग्री के मिश्रण की सेवा करते हैं, और स्क्रिप्ट सामग्री अक्सर काफी प्रोसेसर गहन होती है, इसलिए दोनों के बीच सही संतुलन खोजना महत्वपूर्ण है; दीर्घकालिक हम दोनों सर्वरों का अनुकूलन करने के लिए स्टेटिक्स को कहीं और ले जाना चाहते हैं लेकिन हमारा सॉफ्टवेयर आज के लिए तैयार नहीं है

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


+1 खूनी महान प्रश्न, अच्छी तरह से शब्द और विचार किया गया। आशा है कि आपको जवाब मिल गया है कि यह हकदार है!
डेव रिक्स

जवाबों:


7

मैं यह स्वीकार करना शुरू करूंगा कि मैं बादलों में सामान चलाने के बारे में बहुत कुछ नहीं करता - लेकिन मेरे अनुभव के आधार पर, मैं कहूंगा कि यह वेबसर्वर कॉन्फिग काफी कम मात्रा में यातायात को दर्शाता है। यह रनक्यू इतना बड़ा है कि इससे निपटने के लिए पर्याप्त सीपीयू उपलब्ध नहीं है। रनवे में और क्या है?

हम बहुत अधिक KeepAlive अनुरोधों की अनुमति दे सकते हैं

नहीं - कीप्लीव अभी भी प्रदर्शन में सुधार करता है, आधुनिक ब्राउज़र यह जानने के बारे में बहुत स्मार्ट हैं कि पाइप लाइन में कब और कब समानांतर में अनुरोध चलाने के लिए, हालांकि 5 सेकंड का समय समाप्त होना अभी भी उच्च है, और आपको बहुत से सर्वर प्रतीक्षा कर रहे हैं - जब तक आप ' मुझे लगता है कि मैं इसे 2-3 से नीचे क्रैंक करने की सलाह दूंगा, बड़ी विलंबता समस्याएं मिलीं। यह रनकी को थोड़ा छोटा करना चाहिए।

यदि आपको पहले से mod_deflate वेबसर्वर पर स्थापित नहीं हुआ है - तो मैं आपको ऐसा करने की सलाह दूंगा - और अपनी PHP स्क्रिप्ट में ob_gzhandler () जोड़ें। आप इसे ऑटो-प्रीपेंड के रूप में कर सकते हैं:

if(!ob_start("ob_gzhandler")) ob_start();

(हाँ, मैथुन अधिक सीपीयू का उपयोग करता है - लेकिन आपको सर्वर को रनवे से तेज़ी से निकालकर / कम टीसीपी पैकेट को संभालने से बचाना चाहिए - और एक बोनस के रूप में, आपकी साइट भी तेज़ है)।

मैं MaxRequestsPerChild पर एक ऊपरी सीमा निर्धारित करने की सलाह देता हूं - 500 की तरह कुछ कहो। यह सिर्फ प्रक्रियाओं में कुछ टर्नओवर की अनुमति देता है यदि आपको कहीं स्मृति रिसाव मिला है। आपकी httpd प्रक्रिया बड़ी दिखती है - सुनिश्चित करें कि आपने किसी भी अपाचे मॉड्यूल को हटा दिया है जिसकी आपको आवश्यकता नहीं है और सुनिश्चित करें कि आप अच्छी कैशिंग जानकारी के साथ स्थिर सामग्री की सेवा कर रहे हैं।

यदि आप अभी भी समस्याएं देख रहे हैं, तो समस्या संभवतः PHP कोड के भीतर है (यदि आप fastCGI का उपयोग करने के लिए स्विच करते हैं, तो यह बिना किसी प्रमुख प्रदर्शन दंड के स्पष्ट होना चाहिए)।

अपडेट करें

यदि स्थैतिक सामग्री पृष्ठों में बहुत भिन्न नहीं होती है, तो इसके साथ प्रयोग करने के लायक भी हो सकता है:

if (count($_COOKIE)) {
    header('Connection: close');
}

PHP स्क्रिप्ट पर भी।


विभिन्न प्रकार के अच्छे उत्तरों के बीच मैं इसे स्वीकार कर रहा हूं क्योंकि आपने स्पष्ट रूप से कहा था कि यह एक सीपीयू-बाउंड समस्या थी (मोटे तौर पर हमारे द्वारा चलाए जा रहे खराब एप्लिकेशन के कारण) और यह निश्चित रूप से मामला था। मैंने 2xlarge EC2 उदाहरणों (बड़े से ऊपर) पर सब कुछ फिर से तैयार किया और अधिकांश समस्याएं दूर हो गईं, हालांकि अन्य प्रदर्शन विशेषताओं में से कई अभी भी हैं। हमारे पास इन सर्वरों पर केवल एकल ऐप चल रहा है, और यह केवल बदसूरत है।
भविष्य

4

आपको एक एसिंक्रोनस रिवर्स प्रॉक्सी स्थापित करने पर विचार करना चाहिए, क्योंकि डब्ल्यू राज्य में कई प्रक्रियाएं बहुत अधिक हैं। आपकी अपाचे प्रक्रियाओं को नेटवर्क पर धीमे ग्राहकों को सामग्री भेजने में बहुत समय लगता है, जो उस पर अवरुद्ध हो रहा है। अपने अपाचे सर्वर के लिए एक दृश्य के रूप में Nginx या lighttpd नाटकीय रूप से डब्ल्यू राज्य में कई प्रक्रियाओं को कम कर सकता है। और हाँ, आपको कई प्रकार के रखने योग्य अनुरोधों को सीमित करना चाहिए। संभवतः यह मुख्य रूप से बंद रखने की कोशिश करने के लायक है।

BTW, 107 अपाचे प्रक्रियाएं 22 आरपीएस के लिए बहुत अधिक हैं, मैं केवल 5 अपाचे प्रक्रियाओं का उपयोग करके 100-120 आरपीएस की सेवा करने में सक्षम था। शायद, अगला कदम आपके आवेदन को प्रोफाइल करना है।


हाँ, निश्चित रूप से सहमत हैं कि आवेदन समस्या का एक बड़ा हिस्सा है। यह आउटसोर्स किया गया था और तब से यह बहुत सारे पैच और व्हाट्सएप के अधीन है जिसने इसे और बदतर बना दिया है, और एक रीडिज़ाइन प्रयास जारी है। मैंने आज रात KeepAlive को बिना किसी वास्तविक प्रभाव के बंद करने की कोशिश की, और मेरा अगला कदम उस रिवर्स प्रॉक्सी की कोशिश करना है, शायद मैंने जो पढ़ा है, उसके आधार पर nginx के साथ।
भविष्य

अनुवर्ती कार्रवाई के लिए, मैंने रिवर्स प्रॉक्सी के साथ प्रयोग करना शुरू कर दिया है और संभवतः निकट भविष्य में इसे उत्पादन में तैनात करूंगा। धन्यवाद (और अन्य लोगों ने जो इसे सुझाया है) विचार के लिए, यह ऐसा कुछ नहीं है जिसे मैंने पहले कभी नहीं सोचा था, लेकिन मुझे लगता है कि यह तब तक प्रभाव डालेगा जब तक कि हम एक पूर्ण रीडिजाइन नहीं कर सकते।
भविष्य

1

आपके vmstat में आपकी दो पंक्तियाँ हैं जो आपके CPU प्रतीक्षा समय को काफी अधिक दिखाती हैं, और उन के आसपास, आप उचित संख्या में राइट्स (io - bo) और संदर्भ स्विचिंग करते हैं। मैं देखूंगा कि ब्लॉक क्या लिख ​​रहा है, और उस प्रतीक्षा को कैसे खत्म किया जाए। मुझे लगता है कि आपकी डिस्क IO को बेहतर बनाने में सबसे अधिक सुधार पाया जा सकता है। Syslog चेक करें - इसे async लिखने के लिए सेट करें। सुनिश्चित करें कि आपके नियंत्रक का लेखन कैश काम कर रहा है (इसे जांचें - आपके पास खराब बैटरी हो सकती है)।

यदि आपके सामने कोई कैश नहीं चल रहा है तो आप अपनी संपूर्ण समस्या का कारण नहीं हैं, तो इससे आपको कनेक्शन सेटअप पर समय की बचत होती है। आप MaxSpareServers को थोड़ा टक्कर दे सकते हैं ताकि एक क्रंच में आप सभी कांटे का इंतजार न करें।


अपाचे के तहत अतुल्यकालिक लिखों के लिए इसे कैसे सेट किया जाए, यह जानने के लिए मैं पर्याप्त परिचित नहीं हूं, हालांकि मैं निश्चित रूप से इसे खोजूंगा और खोजूंगा। मैंने आज रात कोई बदलाव नहीं करने के लिए KeepAlive और MaxSpareServers से संबंधित कुछ बदलाव किए हैं, मैं इस बात से सहमत हूं कि अधिक पुर्जों को छोड़ने के बारे में, मैं चूक गया था। हमारे आवेदन की एक (खराब) गुणवत्ता यह है कि यह उपयोगकर्ता सत्र फ़ाइलों (हां, फाइलें) पर भारी लिखता है, जहां मुझे लगता है कि हम पीड़ित हैं। मेरे पास सत्र प्रबंधन को डेटाबेस में ले जाने का विकल्प है, जिसे मैं अगले प्रयास की संभावना है।
फ्यूचर

हाँ, मैं सहमत हूँ कि आपका सत्र लिखता है समस्या का स्रोत है। यदि आप php सत्र का उपयोग कर रहे हैं तो आप सत्र डिस्क को खो सकते हैं - memcache स्थापित करें, और PHP के सत्र को सेट करें। save_handler को memcache, और session.save_path को tcp में सेट करें। : //127.0.0.1: 11211 (या जहाँ भी आप मेमेचे सेट करते हैं)। अपाचे की लॉगिंग डिफ़ॉल्ट रूप से async है, लेकिन कभी-कभी वेब ऐप्स syslog का उपयोग कर सकते हैं, या syslog चैट कर सकते हैं और यह हर पंक्ति के लिए एक सिंक कर रहा है। ऐसा लगता नहीं है कि यह आपके मामले में समस्या होगी, आखिरकार। आप फ़ाइल प्रविष्टि लाइनों को उप-सिंकिंग से हटाने के लिए syslog.conf में '-' के साथ उपसर्ग कर सकते हैं।
बीन्स

0

आप पहली कोशिश के रूप में रखने के विचारशील बंद करना चाहिए ...

107 अनुरोध के साथ संसाधित मैं MaxSpareServers उच्च रखेंगे तो आप क्या सेट ...

स्थिर सामग्री के लिए रिवर्स प्रॉक्सी के रूप में दीर्घकालिक nginx में IMHO को ध्यान में रखा जाना चाहिए


0

पहला सुझाव: निष्क्रिय रखवाले। मुझे केवल कभी इसकी आवश्यकता होती है जब मैं एक विशिष्ट स्थिति की पहचान कर सकता हूं जो प्रदर्शन में वृद्धि हुई है, लेकिन सामान्य अनुरोधों में / सेकलेबल को सक्षम रखने के साथ घटाया गया है।

दूसरा सुझाव: एक MaxRequestsPerChild सेट करें। मैं यहां सिंबियन की गूंज करता हूं, यह मेमोरी रिसाव के मामले में प्रक्रिया रोलओवर के साथ मदद करेगा। 500 एक अच्छा प्रारंभिक बिंदु है।

तीसरा सुझाव: मैक्सक्लेयर्स बढ़ाएँ। इसके लिए एक बॉलपार्क गणना है (भौतिक मेमोरी - गैर-httpd प्रक्रिया द्वारा उपयोग की जाने वाली मेमोरी) / प्रत्येक httpd प्रक्रिया का आकार। Httpd को कैसे संकलित किया गया था, इस पर निर्भर करते हुए, यह संख्या 255 पर अधिकतम हो जाती है। मैं अपने सार्वजनिक सर्वर के लिए 250 का उपयोग google / yahoo / MS सिस्टम को क्रॉल करने के लिए करता हूं।

फोर्थ सुझाव: बढ़ाएँ MaxSpareServers: 4-5x MinSpareServers जैसा कुछ।

उन सुझावों को विफल करते हुए, मैं डीबी के लिए रिवर्स-प्रॉक्सी या मेमकेच के साथ लोड-बैलेंसिंग को देखूंगा।

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