अपाचे प्रदर्शन नाटकीय रूप से ~ 256 एक साथ अनुरोधों से ऊपर है


14

मैं एक अपेक्षाकृत कम-ट्रैफ़िक साइट चला रहा हूं जो साइट अपडेट के बाद सप्ताह में एक बार आगंतुकों में एक बड़ी स्पाइक का अनुभव करती है। सप्ताह के बाकी दिनों की तुलना में इस स्पाइक के दौरान साइट का प्रदर्शन बेहद खराब है। सर्वर पर वास्तव में लोड बहुत कम रहता है, मज़बूती से 10% सीपीयू के तहत और 30% रैम के तहत (हार्डवेयर वास्तव में हम क्या कर रहे हैं इसके लिए ओवरकिल होना चाहिए), लेकिन किसी कारण के लिए अपाचे मात्रा का सामना करने में असमर्थ प्रतीत होता है अनुरोधों का। हम आरएचईएल 5.7, कर्नेल 2.6.18-274.7.1.el5, x86_64 पर अपाचे 2.2.3 चला रहे हैं।

अब के साथ बंद घंटों के दौरान इस व्यवहार को पुन: पेश करने का प्रयास कर रहा हूं, मैं लगभग 256 उपयोगकर्ताओं से अधिक होने पर प्रदर्शन में एक बड़ी गिरावट पा रहा हूं। सबसे छोटे संभव उपयोग मामले के साथ परीक्षण चलाना, मैं (स्थिर पाठ फ़ाइल को पुनः प्राप्त किया जा सकता है, कुल 223 बाइट्स) प्रदर्शन 245 सामान्य अनुरोधों के साथ लगातार सामान्य है:

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       15   25   5.8     24      37
Processing:    15   65  22.9     76      96
Waiting:       15   64  23.0     76      96
Total:         30   90  27.4    100     125

Percentage of the requests served within a certain time (ms)
  50%    100
  66%    108
  75%    111
  80%    113
  90%    118
  95%    120
  98%    122
  99%    123
 100%    125 (longest request)

लेकिन जैसे ही मैं एक साथ 265 अनुरोधों पर शाबाशी देता हूं, उनमें से एक उपसमुच्चय को पूरा करने के लिए एक बेतुकी राशि लेना शुरू कर देता है:

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       13  195 692.6     26    3028
Processing:    15   65  21.3     72     100
Waiting:       15   65  21.3     71      99
Total:         32  260 681.7    101    3058

Percentage of the requests served within a certain time (ms)
  50%    101
  66%    108
  75%    112
  80%    116
  90%    121
  95%   3028
  98%   3040
  99%   3044
 100%   3058 (longest request)

ये परिणाम कई रनों में बहुत सुसंगत हैं। चूंकि उस बॉक्स में अन्य ट्रैफ़िक जा रहा है, इसलिए मुझे यकीन नहीं है कि हार्ड कटऑफ कहाँ होगा, अगर वहाँ एक है, लेकिन यह संदिग्ध रूप से 256 के करीब लगता है।

स्वाभाविक रूप से, मैंने यह माना कि यह प्रीफ़ॉर्क में थ्रेड लिमिट के कारण हो रहा था, इसलिए मैंने उपलब्ध थ्रेड की संख्या को दोगुना करने और थ्रेड के पूल को बढ़ने से रोकने और अनावश्यक रूप से सिकुड़ने से कॉन्फ़िगरेशन को समायोजित किया:

<IfModule prefork.c>
StartServers     512
MinSpareServers  512
MaxSpareServers  512
ServerLimit      512
MaxClients       512
MaxRequestsPerChild  5000
</IfModule>

mod_status पुष्टि करता है कि मैं अब 512 उपलब्ध थ्रेड्स के साथ चल रहा हूं

8 requests currently being processed, 504 idle workers

हालाँकि, 265 युगपत अनुरोधों का प्रयास अभी भी पहले के समान परिणाम देता है

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       25  211 714.7     31    3034
Processing:    17   94  28.6    103     138
Waiting:       17   93  28.5    103     138
Total:         57  306 700.8    138    3071

Percentage of the requests served within a certain time (ms)
  50%    138
  66%    145
  75%    150
  80%    161
  90%    167
  95%   3066
  98%   3068
  99%   3068
 100%   3071 (longest request)

प्रलेखन (और स्टैक एक्सचेंज) के परिमार्जन के बाद मुझे इस अड़चन को दूर करने के प्रयास के लिए आगे की कॉन्फ़िगरेशन सेटिंग्स के लिए नुकसान हो रहा है। क्या कुछ ऐसा है जो मुझे याद आ रहा है? क्या मुझे अपाचे के बाहर जवाब ढूंढना शुरू करना चाहिए? क्या किसी और ने इस व्यवहार को देखा है? किसी भी तरह की सहायता का स्वागत किया जाएगा।

संपादित करें:

लादादादा की सलाह के अनुसार, मैंने अपाचे के खिलाफ स्ट्रेस चलाया। मैंने कुछ बार -T और -T के साथ प्रयास किया और सामान्य से कुछ भी नहीं खोज सका। मैंने तब स्ट्रेस -c चलाने की कोशिश की, जो वर्तमान में चल रही सभी अपाचे प्रक्रियाओं के खिलाफ है, और यह मिला:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 22.09    0.317836           5     62128      4833 open
 19.91    0.286388           4     65374      1896 lstat
 13.06    0.187854           0    407433           pread
 10.70    0.153862           6     27076           semop
  7.88    0.113343           3     38598           poll
  6.86    0.098694           1    100954     14380 read

(... abdridged)

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

संपादित करें 2:

जैसा कि कई लोगों ने सुझाव दिया, मैंने वेब सर्वर पर फिर से परीक्षण चलाया (पहले यह परीक्षण एक तटस्थ इंटरनेट स्थान से चलाया गया था)। परिणाम आश्चर्यजनक थे:

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   11   6.6     12      21
Processing:     5  247 971.0     10    4204
Waiting:        3  245 971.3      7    4204
Total:         16  259 973.3     21    4225

Percentage of the requests served within a certain time (ms)
  50%     21
  66%     23
  75%     24
  80%     24
  90%     26
  95%   4225
  98%   4225
  99%   4225
 100%   4225 (longest request)

निचला-रेखा का समय इंटरनेट-आधारित परीक्षण के समान है, लेकिन स्थानीय रूप से चलाने पर यह लगातार थोड़ा खराब हो जाता है। अधिक दिलचस्प बात यह है कि प्रोफ़ाइल नाटकीय रूप से बदल गई है। जबकि लंबे समय से चल रहे अनुरोधों के थोक समय को "कनेक्ट" करने में खर्च किया गया था, अब अड़चन प्रसंस्करण या प्रतीक्षा में प्रतीत होती है। मुझे संदेह है कि यह वास्तव में एक अलग मुद्दा हो सकता है जिसे पहले नेटवर्क सीमाओं द्वारा नकाब पहना जा रहा था।

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

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    2   0.8      2       4
Processing:    13  118  99.8    205     222
Waiting:       13  118  99.7    204     222
Total:         15  121  99.7    207     225

Percentage of the requests served within a certain time (ms)
  50%    207
  66%    219
  75%    220
  80%    221
  90%    222
  95%    224
  98%    224
  99%    225
 100%    225 (longest request)

ये दोनों परीक्षण एक साथ कई सवाल खड़े करते हैं, लेकिन इससे अलग, एक निश्चित मात्रा में लोड के तहत होने वाले कुछ प्रकार के गंभीर नेटवर्क अड़चन के लिए एक सम्मोहक मामला है। मुझे लगता है कि अगले कदम अलग से नेटवर्क परत की जांच करेंगे।


विचार करने के लिए विकल्प: CloudFlare, drupal.org/project/boost , CDN, वार्निश कैश।
सिजयोज़

आप हमें कुछ भी नहीं बता रहे हैं कि यह सर्वर HTTP अनुरोधों को पूरा करने के अलावा क्या कर रहा है। क्या कोई डेटाबेस (या कुछ अन्य सामान्य संसाधन जो लॉक विवाद से पीड़ित हो सकते हैं) शामिल है? समस्या पर अचानक यदि ऐसा होता है बिल्कुल 256 अनुरोध (ठीक 255 में) वहाँ शायद कुछ बाहरी संसाधन बहुत लादा जा रहा है। (एक स्थैतिक पृष्ठ पर आपकी छलांग निश्चित रूप से असामान्य है - लड्डूदास का जवाब कुछ डिबगिंग टिप्स के लिए देखें)
voretaq7

ceejayoz: मैं सुझावों की सराहना करता हूं, लेकिन मूल रूप से मेरा मानना ​​है कि अपाचे को यह धीमा नहीं होना चाहिए। समस्या के प्रभाव को कम करने के लिए हम बहुत कुछ कर सकते हैं, लेकिन मैं इसे ठीक करने या कम से कम इसे समझने के लिए बहुत कुछ करूंगा।
cmckendry

voretaq7: मैं शुरुआत में इन्हीं लाइनों के साथ सोच रहा था, क्योंकि एक विशिष्ट अनुरोध में php / mysql भी शामिल होगा, लेकिन समस्या पूरी तरह से स्थिर सामग्री की सेवा करते समय भी समान सीमा पर बनी रहती है।
19ck में cmckendry

1
यह एक वास्तविक सर्वर या एक वीएम है? क्या आप अपना परीक्षण लोकलहोस्ट, स्थानीय नेटवर्क या इंटरनेट से करते हैं? 100ms रेंज में न्यूनतम प्रतिक्रिया समय इंटरनेट से परीक्षण का सुझाव देता है। स्थानीयहोस्ट से परीक्षण करने का प्रयास करें - हो सकता है कि आपका प्रदाता सिर्फ आपको थ्रॉटल कर रहा हो।
Tometzky

जवाबों:


4

इस स्थिति में मैं क्या करूंगा, यह चलाया जाता है

strace -f -p <PID> -tt -T -s 500 -o trace.txt

जब तक आप धीमी प्रतिक्रियाओं में से एक पर कब्जा नहीं करते तब तक एब परीक्षण के दौरान आपकी अपाचे प्रक्रियाओं में से एक। फिर के माध्यम से एक नज़र है trace.txt

-ttऔर -Tविकल्प आप मदद करने के लिए शुरू करने और प्रत्येक प्रणाली कॉल की अवधि के timestamps धीमी गति से लोगों की पहचान देते हैं।

हो सकता है कि आपको एक धीमा सिस्टम कॉल मिल सकता है जैसे कि open()या इसके बाद stat()आपको एक त्वरित कॉल मिल सकती है (संभवतः एकाधिक) poll()कॉल सीधे। यदि आप एक फ़ाइल या नेटवर्क कनेक्शन (काफी संभावना) पर काम कर रहे हैं, तो जब तक आपको वह फ़ाइल या कनेक्शन हैंडल नहीं मिल जाता है, तब तक ट्रेस के माध्यम से पीछे देखें। उसी हैंडल पर पहले की कॉल आपको यह अंदाजा देती है कि किस बात poll()का इंतजार था।


अच्छा विचार -cविकल्प देख रहा है । क्या आपने यह सुनिश्चित किया है कि आप जिस अपाचे बच्चे को ट्रेस कर रहे थे, उस समय के कम से कम अनुरोधों में से एक को परोसा जाए? (मुझे यह भी निश्चित नहीं है कि आप straceसभी बच्चों पर एक साथ चलने के अलावा यह कैसे करेंगे ।)

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

चूंकि आपने कहा था कि सीपीयू का उपयोग कम रहता है, इसलिए सिस्टम कॉल के बीच शायद यह बहुत अधिक नहीं होता है लेकिन यह जांचने लायक है।


से उत्पादन पर अधिक बारीकी से देख रहे हैं ab:

प्रतिक्रिया समय में अचानक कूदना (ऐसा लगता है कि 150ms और 3000ms के बीच कहीं भी कोई प्रतिक्रिया समय नहीं है) बताता है कि कहीं एक विशिष्ट टाइमआउट हो रहा है जो लगभग 256 एक साथ कनेक्शन से ऊपर ट्रिगर हो जाता है। यदि आप RAM या CPU चक्रों से सामान्य IO से बाहर निकल रहे हैं, तो एक स्मूद गिरावट की उम्मीद की जाएगी।

दूसरे, धीमी abप्रतिक्रिया से पता चलता है कि connectचरण में 3000ms खर्च किए गए थे । लगभग सभी ने लगभग 30ms का समय लिया लेकिन 5% ने 3000ms लिया। यह बताता है कि नेटवर्क समस्या है।

तुम कहाँ abसे भाग रहे हो? क्या आप इसे अपाचे मशीन के समान नेटवर्क से आज़मा सकते हैं?

अधिक डेटा के लिए, tcpdumpकनेक्शन के दोनों सिरों पर चलने की कोशिश करें (अधिमानतः ntpदोनों सिरों पर चलने के साथ ताकि आप दो कैप्चर को सिंक कर सकें।) और किसी भी tcp रिट्रांसमिशन की तलाश करें। Wireshark डंप का विश्लेषण करने के लिए विशेष रूप से अच्छा है क्योंकि यह एक अलग रंग में tcp रिट्रांसमिशन को उजागर करता है, जिससे उन्हें ढूंढना आसान हो जाता है।

यह आपके द्वारा एक्सेस किए जाने वाले किसी भी नेटवर्क डिवाइस के लॉग को देखने के लायक भी हो सकता है। मैं हाल ही में हमारे एक फायरवॉल के साथ एक समस्या में भाग गया था जहां यह kb / s के संदर्भ में बैंडविड्थ को संभाल सकता था लेकिन यह प्रति सेकंड पैकेट की संख्या को संभाल नहीं सकता था जो इसे प्राप्त कर रहा था। यह 140,000 पैकेट प्रति सेकंड के हिसाब से टॉप पर रहा। आपके abरन पर कुछ त्वरित गणित मुझे विश्वास दिलाता है कि आप प्रति सेकंड लगभग 13,000 पैकेट देख रहे होंगे (धीमे अनुरोधों के 5% की अनदेखी)। हो सकता है कि यही वह अड़चन हो जो आप तक पहुंची हो। तथ्य यह है कि यह 256 के आसपास होता है विशुद्ध रूप से एक संयोग हो सकता है।

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