2011-05-27 10 views
6

मैं वर्तमान में एक सर्वर सेटअप की लोड क्षमता का परीक्षण कर रहा हूं जिसे मैं एक साथ रख रहा हूं। Apache2 सर्वर पर PHP 5.X स्थापित है, और यह एक अलग मशीन पर एक मास्टर डेटाबेस से कनेक्ट होता है, और फिर 1 से 2 गुलाम सर्वर से पढ़ने के लिए।PHP जनरेटिंग पेज, लेकिन उन्हें उपयोगकर्ता को तुरंत वापस नहीं लौट रहा

मेरा टेस्ट पेज उत्पन्न होता है। 2 सेकंड उत्पन्न करने के लिए अगर मैं इसे स्वयं कहता हूं। मैंने एक अलग सर्वर पर एक php स्क्रिप्ट बनाई है जो परीक्षण पृष्ठ पर 65 एक साथ कॉल बनाता है। परीक्षण पृष्ठ पूरे पृष्ठ में माइक्रोटाइम बेंचमार्क लेता है ताकि मुझे यह बताने के लिए कि प्रत्येक अनुभाग कितना समय ले रहा है। जैसा कि अपेक्षित था - कम से कम मेरे लिए, यदि किसी के पास इस पर राय या सुझाव हैं, तो टिप्पणी करने में संकोच न करें- पृष्ठ के एसक्यूएल भाग को पहले जोड़े के अनुरोधों के लिए थोड़ी सी मात्रा लगती है और फिर गिरावट आती है क्योंकि शेष प्रश्न ढेर और इंतजार करना है। मैंने सोचा कि यह एक डिस्क आईओ मुद्दा हो सकता है, लेकिन एक ठोस व्यवहार ड्राइव पर परीक्षण करते समय वही व्यवहार किया गया।

मेरी समस्या यह है कि लगभग 30 या 65 पृष्ठ बनाए गए हैं, और मेरी टेस्ट स्क्रिप्ट द्वारा लोड की गई मुझे उम्मीद है। मेरे बेंचमार्क ने कहा कि पृष्ठ उदाहरण के लिए 3 सेकंड में बनाया गया था, और मेरी टेस्ट स्क्रिप्ट ने कहा कि इसे पृष्ठ को 3.1 सेकंड में पूर्ण मिला है। अंतर ज्यादा नहीं था। समस्या यह है कि अन्य अनुरोधों के लिए, मेरा बेंचमार्क कहता है कि पृष्ठ 3 सेकंड में लोड किए गए थे, लेकिन परीक्षण स्क्रिप्ट को पृष्ठ को 6 सेकंड तक पूर्ण नहीं मिला था। यह अपाचे सर्वर द्वारा उत्पन्न किए जा रहे पृष्ठ के बीच एक पूर्ण 3 सेकंड है और इसे मेरी टेस्ट स्क्रिप्ट पर वापस भेजा गया है जिसने अनुरोध किया है। यह सुनिश्चित करने के लिए कि यह परीक्षण स्क्रिप्ट के साथ कोई समस्या नहीं थी, मैंने पृष्ठ को स्थानीय ब्राउज़र में लोड करते समय लोड करने का प्रयास किया, और क्रोम में टाइमलाइन विंडो के माध्यम से उसी देरी की पुष्टि की।

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

मुझे यह उल्लेख करना चाहिए कि स्क्रिप्ट के दौरान मैंने संसाधनों की निगरानी की थी, और सीपीयू ने अधिकतम 9% भार मारा और हमेशा कम से कम 1 गीगा रैम मुक्त था।

मैं यह भी उल्लेख करूंगा कि वही प्रकार की चीज तब होती है जब मैं पूछताछ कर रहा हूं एक स्थिर HTML पृष्ठ है। पहला जोड़ा .X सेकंड लेता है, और फिर यह धीरे-धीरे 3 सेकंड तक रैंप करता है।

LockFile ${APACHE_LOCK_DIR}/accept.lock 
PidFile ${APACHE_PID_FILE} 
Timeout 120 
MaxClients   150 
KeepAlive On 
KeepAliveTimeout 4 
MaxKeepAliveRequests 150 

Header always append x-frame-options sameorigin 

    StartServers   50 
    MinSpareServers  25 
    MaxSpareServers  50 
    MaxClients   150 
    MaxRequestsPerChild 0 


User ${APACHE_RUN_USER} 
Group ${APACHE_RUN_GROUP} 
AccessFileName .httpdoverride 

    Order allow,deny 
DefaultType text/plain 
HostnameLookups Off 
ErrorLog ${APACHE_LOG_DIR}/error.log 
LogLevel warn 
Include mods-enabled/*.load 
Include mods-enabled/*.conf 
Include httpd.conf 
Include ports.conf 

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined 
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
LogFormat "%h %l %u %t \"%r\" %>s %O" common 
LogFormat "%{Referer}i -> %U" referer 
LogFormat "%{User-agent}i" agent 
Include conf.d/ 
Include sites-enabled/ 
AddType application/x-httpd-php .php 
AddType application/x-httpd-php-source .phps 



    SecRuleEngine On 
    SecRequestBodyAccess On 
    SecResponseBodyAccess Off 
    SecUploadKeepFiles Off 
    SecDebugLog /var/log/apache2/modsec_debug.log 
    SecDebugLogLevel 0 
    SecAuditEngine RelevantOnly 
    SecAuditLogRelevantStatus ^5 
    SecAuditLogParts ABIFHZ 
    SecAuditLogType Serial 
    SecAuditLog /var/log/apache2/modsec_audit.log 
    SecRequestBodyLimit 131072000 
    SecRequestBodyInMemoryLimit 131072 
    SecResponseBodyLimit 524288000 
     ServerTokens Full 
     SecServerSignature "Microsoft-IIS/5.0" 

अद्यतन: यह प्रतिक्रियाओं के बहुत तथ्य यह है कि एसक्यूएल दोषी है पर ध्यान केंद्रित कर रहे हैं कर रहे हैं। तो मैं यहां बता रहा हूं कि वही व्यवहार एक स्थिर HTML पृष्ठ पर होता है। बेंचमार्किंग के परिणाम नीचे सूचीबद्ध हैं।

 
Concurrency Level:  10 
Time taken for tests: 5.453 seconds 
Complete requests:  1000 
Failed requests:  899 
    (Connect: 0, Receive: 0, Length: 899, Exceptions: 0) 
Write errors:   0 
Total transferred:  290877 bytes 
HTML transferred:  55877 bytes 
Requests per second: 183.38 [#/sec] (mean) 
Time per request:  54.531 [ms] (mean) 
Time per request:  5.453 [ms] (mean, across all concurrent requests) 
Transfer rate:   52.09 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 21 250.7  0 3005 
Processing: 16 33 17.8  27  138 
Waiting:  16 33 17.8  27  138 
Total:   16 54 253.0  27 3078 

Percentage of the requests served within a certain time (ms) 
    50%  27 
    66%  36 
    75%  42 
    80%  46 
    90%  58 
    95%  71 
    98%  90 
    99% 130 
100% 3078 (longest request) 

मैं यह भी बताया जाएगा कि मैं PHP और microtime() कि अंतराल से पहले पेज बनाई जा रही है क्या हो रहा है के उपयोग के माध्यम से निर्धारित। मैंने पृष्ठ को उत्पन्न होने और मेरे टेस्ट स्क्रिप्ट को प्राप्त करने के बीच के अंतर के बीच इसे निर्धारित किया। अंतर का अर्थ यह है कि जब तक मेरा टेस्ट पेज प्राप्त नहीं होता है, तब तक पेज को तब तक उत्पन्न किया जाता है जब तक कि मेरा अनुरोध पृष्ठ प्राप्त न हो, चाहे कोई भी अनुरोध कितना समय लगे।

उन सभी को धन्यवाद जिन्होंने जवाब दिया है। सभी अच्छे अंक हैं, मैं बस यह नहीं कह सकता कि उनमें से किसी ने भी इस मुद्दे को हल किया है।

+0

उच्च स्टार्टसेवर और मिनीस्पियर सर्वर का प्रयास करें। मेरे अनुभव में, यातायात के अचानक विस्फोट के साथ मारा जाने पर अपाचे के अतिरिक्त थ्रेड शुरू करने में कुछ समय लग सकता है। चीजों की ग्रैंडर स्कीम में, कनेक्शन को तेजी से और अपाचे थ्रेड को तेज़ी से मुक्त करने के लिए एक तेज रिवर्स प्रॉक्सी (nginx) के माध्यम से प्रॉक्सी। यहां तक ​​कि बेहतर, स्किड/वार्निश वाले कैश पेज ताकि आप सैकड़ों बार सटीक उसी सामग्री को उत्पन्न करने वाले संसाधनों को बर्बाद न करें। –

+0

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

+0

अच्छा सवाल, बस एक अलग साइट पर है। –

उत्तर

1

सटीक क्या है जो ड्रॉप-ऑफ़ से पहले लोड होने वाले पृष्ठों की संख्या है? आपने बताया कि आप एकल, बाहरी स्क्रिप्ट से 65 एक साथ अनुरोध बना रहे थे। आपके पास cmipconn सक्षम नहीं है जो एक आईपी या कुछ से एन कनेक्शन के बाद चीजों को सीमित करेगा? क्या यह हमेशा 30 (या जो कुछ भी) कनेक्शन है और फिर देरी हो रही है?

+0

यह हमेशा बंद होने से पहले एक यादृच्छिक राशि है। यदि मैं एक साथ अनुरोधों को वापस स्केल करता हूं, तो कभी-कभी इसे 3 सेकंड लगने से पहले 1000 पेज लोड होंगे। – Andrew

2

कई अन्य कारक हैं, लेकिन मैं वास्तव में अनुमान लगा रहा हूं कि आप 30-40 या तो प्रत्येक का उपयोग करके 30-40 प्रक्रियाओं को तेजी से बढ़ा रहे हैं और अपनी मशीनों को सीमित स्मृति को मार रहे हैं, फिर नए लोगों को उगाना जारी रखना और स्वैप करना, सब कुछ धीमा कर रहा है।

रैम के 2 जी के साथ, 150 पर मैक्सक्लिएंट्स और मैक्सआरक्वेट्स पार्चेल्ड 0 पर सर्वर संसाधन संभवत: स्वैच्छिक हो रहे हैं भले ही आपका डीबी एक ही भौतिक सर्वर पर न हो।

असल में, वेब सर्वर प्रदर्शन के लिए आप कभी भी स्वैप नहीं करना चाहते हैं। अपने परीक्षण चलाने और फिर तुरंत एक साथ वेब सर्वर पर स्मृति की जाँच:

free -m 

यह एमबी और स्वैप के उपयोग में आप स्मृति उपयोग दे देंगे। आपको आदर्श रूप से 0 या 0 के करीब स्वैप देखना चाहिए। यदि ज़िलच या बहुत कम स्वैप उपयोग नहीं है, तो समस्या केवल स्मृति चल रही है और इसलिए आपका सर्वर धीमा प्रतिक्रिया समय के परिणामस्वरूप CPU को बर्बाद कर रहा है।

आपको कुछ संख्याएं निश्चित करने की आवश्यकता है, लेकिन पहले 'टॉप' करें और Shift-M दबाएं जबकि शीर्ष मेमोरी द्वारा सॉर्ट करने के लिए चल रहा है। अगली बार जब आप अपने परीक्षण चलाते हैं और प्रत्येक httpd प्रक्रिया के लिए% MEM की रिपोर्ट की जा रही है तो एक बॉलपार्क संख्या पाएं। यह अलग-अलग होगा, इसलिए उच्चतम लोगों को सबसे बुरी स्थिति के लिए अपनी मार्गदर्शिका के रूप में उपयोग करना सबसे अच्छा है। मेरे पास एक ही सर्वर पर एक वर्डप्रेस, एक ड्रूपल और एक custome साइट है जो नियमित रूप से 20 एम प्रति http प्रक्रिया को प्रारंभ से आवंटित करती है और अंततः समय में ऊपर बढ़ती है - अगर प्रत्येक 100 एम के अनचेक किए गए हैं।

उदाहरण के लिए मेरे बट से कुछ संख्याएं खींचना उदाहरण के लिए, यदि मेरे पास 2 जी और लिनक्स, कोर सेवाएं, और माइस्क्ल 800 एम का उपयोग कर रहे थे, तो मैं स्मृति के लिए अपेक्षाओं को रखता हूं, मैं अपाचे मज़े के लिए उपलब्ध होना चाहता हूं 1G। इसके साथ, अगर मेरी अपाचे प्रक्रियाएं 20 मीटर की औसत ऊंचाई पर उपयोग कर रही थीं, तो मेरे पास केवल 50 मैक्सक्लिंट्स हो सकते थे। वास्तविक जीवन में एक बहुत ही रूढ़िवादी संख्या है, मैं मैक्स को 40 तक छोड़ दूंगा या सुरक्षित रहूंगा। स्मृति को चुटकी करने की कोशिश न करें ... यदि आप 40 एक साथ कनेक्शन के लिए पर्याप्त ट्रैफ़िक की सेवा कर रहे हैं, तो मैक्स सर्वर को अपनाने से पहले 4 जी पर जाने के लिए $ 100 को टोन करें। यह उन लोगों में से एक है, एक बार जब आप लाइन को पार करते हैं तो सबकुछ शौचालय से नीचे जाता है, इसलिए अपनी याददाश्त सीमा के तहत सुरक्षित रहें!

इसके अलावा, php के साथ मैं MaxRequestsPerChild को 100 या तो रखना चाहता हूं ... आप सीपीयू बाध्य वेब पृष्ठों की सेवा नहीं कर रहे हैं, इसलिए नई बाल प्रक्रिया को बढ़ाने वाले कुछ मिलीसेकंडों को बचाने के बारे में चिंता न करें। इसे 0 पर सेट करने का मतलब असीमित अनुरोध है और जब तक कुल क्लाइंट मैक्सस्पियर सर्वर से अधिक नहीं हो जाते हैं तब तक उन्हें कभी नहीं मारा जाता है। यह आम तौर पर एपीएसी श्रमिकों का उपयोग करके PHP के साथ बहुत खराब बात है क्योंकि वे केवल तब तक बढ़ते रहते हैं जब तक कि वे खराब नहीं होते हैं (जैसे कि आपके सर्वर को कड़ी मेहनत करना मुश्किल है क्योंकि आप लॉग इन नहीं कर सकते हैं क्योंकि सभी मेमोरी का उपयोग अपाचे का उपयोग नहीं कर सकता है और एसएसएच काम नहीं कर सकता बिना समय के बाहर)।

शुभकामनाएं!

+0

मुझे नहीं लगता था कि यह स्वैप में चला गया था, मैं उपयोग की निगरानी कर रहा था। मुझे अब 4 गीगा रैम मिल गया है, इसलिए जब मैं यह देखने के लिए समय निकालता हूं कि परिणाम अलग-अलग हैं तो मैं परीक्षण दोहरा दूंगा। – Andrew

संबंधित मुद्दे