मिस्टर टाइम टू फर्स्ट बाइट का अजीब मामला


14

मुझे एक वेबसर्वर मिला है जो लिनोइड 1024 वीपीएस पर आधारित है

  • उबंटू 11.10
  • नगनेक्स 1.0.5
  • PHP 5.3.6 (PHP-FPM, APC के साथ)
  • वार्निश 3.0.2

और वहाँ कुछ ब्लॉग्स वर्डप्रेस 3.3.1 पर आधारित हैं। उनमें से एक एक सादा ब्लॉग है, जिसमें सर्वर का परीक्षण करने के लिए डिफ़ॉल्ट कॉन्फिग, थीम और सिर्फ "हैलो वर्ल्ड" पोस्ट है। अन्य एक ब्लॉग है जो लगभग 10k पदों और 10k टिप्पणियों के साथ अन्य सर्वर से क्लोन किया गया है। इस ब्लॉग में प्रति दिन 5k प्राचीन वस्तुएं हैं।

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

सामान्य ऑपरेशन में होने पर हॉप भी एक "सामान्य" भार दिखाता है , लेकिन एब परीक्षण के दौरान असामान्य बड़ा भार

एक और विचित्र बात हो रही है (मेरे लिए सबसे महत्वपूर्ण): टाइम टू फर्स्ट बाइट बहुत अधिक है , लेकिन इसके बाद साइट की लोडिंग वास्तव में तेज हो जाती है। इसे tools.phatt.com जैसी सेवाओं के साथ आसानी से जांचा जा सकता है, जिससे यह परिणाम मिलता है । कृपया उस पीले क्षेत्र पर ध्यान दें जिसका अर्थ है "समय प्रतीक्षा करें"।

ये क्यों हो रहा है? संभावित विचार:

  • खराब PHP-FPM विन्यास
  • Linode DNS प्रतिक्रिया समय भयानक है। बकवास-परीक्षण परीक्षण ब्लॉग DNS ठीक हल करता है, TTFB शानदार है
  • खराब नग्नेक्स विन्यास

मामले में किसी को अधिक जानकारी की आवश्यकता है,

  • यहां आपको वर्तमान क्लोन किया गया ब्लॉग nginx कॉन्फ़िग फ़ाइल ( /etc/nginx/sites-available/muycomputerpro.com ) मिला है
  • यहां आपको वर्तमान my.cnf config ( /etc/mysql/my.cnf ) मिल गया है (मुझे पता है, कैशिंग नहीं करने के लिए, यह अतीत पर TTFB पर कोई फर्क नहीं पड़ता है)
  • यहां आपको वर्तमान PHP-FPM कॉन्फिगर ( /etc/php5/fpm/pool.d/www.conf ) मिला है

मुझे लगता है कि यह नगीनेक्स विन्यास में कंटेनर में if -fआपके उपयोग के निर्देश के साथ कुछ करना हो सकता है location। यहाँ जो मैं पढ़ रहा हूँ, उसके आधार पर wiki.nginx.org/Pitashes , मुझे लगता है कि -fफ़ाइल के लिए एक अक्षम खोज कर रहा है, जिससे टाइम टू फ़र्स्ट बाइट का मुद्दा पैदा हो सकता है, खासकर अगर आपके पास बड़ी संख्या में निर्देशिकाएं हों फ़ाइलें।
d34dh0r53

1
कुछ विचार: क) ब्लॉग से मूल सर्वर से क्या अंतर हैं (जैसे कि यह उसी स्टैक को चलाता है?) बी) यदि आप कर सकते हैं, तो लोकलहोस्ट और पोर्ट का उपयोग करके सर्वर से सीधे एब चलाएं। वार्निश के माध्यम से पहुंचने की कोशिश करें, और फिर सीधे नंगेक्स तक पहुंचें)। c) MySQL और PHP-FPM स्लो लॉग को इनेबल करें। d) mysqltuner.pl चलाएं और देखें कि क्या आप अपने MySQL के प्रदर्शन में सुधार कर सकते हैं (जो कि ब्लॉग - या प्लगइन्स के बीच सबसे स्पष्ट अंतर होगा)। ई) आपके द्वारा पोस्ट किया गया PHP-FPM कॉन्फिग नग्नेक्स (/var/run/php5-fpm-tpnet.sock! = /var/run/php5-fpm-www-data.sock) द्वारा उपयोग किया गया प्रतीत नहीं होता है
साइबरबरी

1
निश्चित रूप से एक PHP मुद्दा। Wordpress वास्तव में धीमा है। आप इसके लिए एक कैशिंग प्लगइन चाहते हैं, जब आपके पास इतना कंटेंट हो।
मार्टिन फॉर्डोर्ड्वाल्ड

2
आपने कहा कि 'आप लोकलहोस्ट पर ab चला सकते हैं और 4k req / s प्राप्त कर सकते हैं' - आप किस लोकलहोस्ट (पिछले / वर्तमान) का उल्लेख कर रहे हैं? यदि वह मूल्य आपके वर्तमान सर्वर से है - उच्च TTFB के साथ - तो आपकी समस्या अभी बहुत अधिक रोचक है - चूंकि आपने PHP, MySQL और अपने वेब सर्वर को प्रभावी रूप से समाप्त कर दिया है। TTFB में DNS, राउंड ट्रिप टाइम और प्रोसेसिंग टाइम शामिल हैं। एक लंबी TTFB आमतौर पर प्रोसेसिंग (उदाहरण PHP / MySQL) के कारण होती है। Nginx के खिलाफ सीधे ab चलाने का बिंदु अन्य घटकों को खत्म करना है। इसके अलावा, वार्निश, यदि सेटअप सही है, तो बैकएंड को बायपास करना चाहिए, एक बहुत ही उच्च रेक्स / एस दे रहा है।
साइबरबरी

1
आपके लोकलहोस्ट परीक्षण मान्य नहीं लगते - आपने वास्तव में अपना ब्लॉग पुनर्प्राप्त नहीं किया था। पृष्ठ आकार में अंतर पर ध्यान दें: 7500bytes जब डोमेन से एक्सेस किया जाता है, तो लोकलहोस्ट से 151 बाइट्स। चूंकि आपके पास संभवतः कई वर्चुअलहोस्टेस हैं, इसलिए आपको होस्ट हेडर को अब तक पास करना होगा। ab -n 1000 -c 100 -H 'Host: mysite.com' http://127.0.0.1/कहा कि - कैश्ड (वार्निश) बनाम अनकैप्ड परिणामों में अंतर उस स्थिति को मान्य करने के लिए पर्याप्त है जो समस्या नेटवर्क, डीएनएस इत्यादि से असंबंधित है और प्रसंस्करण में निहित है, जैसा कि अपेक्षित था।
साइबरबरी

जवाबों:


24

सबसे पहले, यह एक जवाब नहीं है, इतना एक नैदानिक ​​दृष्टिकोण के रूप में।

यह किसी भी तरह से व्यापक नहीं है - या यहां तक ​​कि कुछ भी करीब है, यह सिर्फ एक शुरुआती बिंदु है।

फर्स्ट बाइट का समय

पहली बाइट के समय (TTFB) में कई घटक होते हैं:

  • DNS लुकअप: डोमेन का आईपी पता ढूंढें (संभावित सुधार: अधिक कई / वितरित / उत्तरदायी DNS सर्वर)
  • कनेक्शन का समय: सर्वर के लिए एक सॉकेट खोलें, कनेक्शन पर बातचीत करें (विशिष्ट मूल्य 'पिंग' समय के आसपास होना चाहिए - एक गोल यात्रा आमतौर पर आवश्यक होती है - अनुवर्ती बाद के अनुरोधों के लिए मदद करनी चाहिए)
  • प्रतीक्षा करना: पहले बाइट से पहले आवश्यक प्रारंभिक प्रसंस्करण भेजा जा सकता है (उसका वह स्थान है जहां आपका सुधार होना चाहिए - यह गतिशील सामग्री के लिए सबसे महत्वपूर्ण होगा।

जब आप ApacheBench आउटपुट को देखते हैं, तो आप यह भी देखते हैं:

  • प्रसंस्करण: यह सामग्री के प्रतीक्षा (पूर्ण स्थानांतरण) का योग है (यदि हस्तांतरण का समय, डेटा की मात्रा को डाउनलोड करने की अपेक्षा से अधिक लंबा होगा, तो आगे की प्रक्रिया (पहले बाइट के बाद) प्राप्त हो रही है) (जैसे पृष्ठ है) उपलब्ध होने पर फ्लशिंग सामग्री)

घटकों की तुलना करना

कुछ अपवादों के साथ, आपकी समस्या बैकएंड प्रसंस्करण में झूठ बोलने वाली है, जो आमतौर पर अत्यधिक जटिल / अक्षम कोड, या खराब तरीके से कॉन्फ़िगर किए गए MySQL के लिए नीचे आती है।

इस समस्या से संपर्क करने का एक अच्छा तरीका तुलनाओं की एक श्रृंखला है जो आपके सेटअप के विभिन्न पहलुओं को समाप्त कर देगा। एक अच्छी तुलना को समस्या को कम करने में मदद करने के लिए यथासंभव स्थिर रखना चाहिए। वर्तमान में, आपने निम्नलिखित तुलनाएं प्रदान की हैं:

  1. पुराने सर्वर और नए सर्वर पर चल रही समान (क्लोन) साइट:
    • अंतर: सर्वर
    • परिणाम: पुराना सर्वर तेज है; नया सर्वर धीमा है
    • नोट: आपको यहाँ क्या ज़रूरत है इन सर्वरों के बीच के अंतर को निर्धारित करने के लिए - दोनों का उपयोग किए गए स्टैक (Nginx, आदि) और हार्डवेयर के संदर्भ में (क्या यह अधिक शक्तिशाली मशीन है क्योंकि पुराना सर्वर तेजी से पुराना है?)
    • निष्कर्ष: कोड सही सेटअप पर तेजी से चलने में सक्षम हो सकता है
  2. नए सर्वर पर टेस्ट साइट बनाम पूरी साइट
    • अंतर: सामग्री, थीम, प्लगइन्स, आदि
    • परिणाम: परीक्षण साइट तेज है, पूर्ण साइट धीमी है
    • नोट्स: सिद्धांत रूप में, इस परीक्षण से आपको अपने सेटअप के कई पहलुओं - DNS, नेटवर्क, यहां तक ​​कि आपके nginx / php / mysql सेटअप को खत्म करने में मदद मिल सकती है - हालाँकि, यह काफी 'उचित' नहीं है।
    • निष्कर्ष: अतिरिक्त सामग्री प्रदर्शन पर महत्वपूर्ण प्रभाव डाल रही है

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

कुछ भी बदले बिना, कुछ अन्य तुलनाएं हैं जो आप कर सकते हैं:

  • एक दूरस्थ स्थान बनाम स्थानीय से परीक्षण - यह पहचानने में मदद करेगा कि क्या नेटवर्क, विलंबता, डीएनएस आदि का कारण है
    • आपने पहले ही (कुछ हद तक) ऐसा कर लिया है और ज्यादातर यह निष्कर्ष निकाला है कि आपको नेटवर्क की समस्या नहीं है।
  • वार्निश (यानी पोर्ट 80) बनाम नंगेक्स (पोर्ट 8080) के माध्यम से परीक्षण करें - परीक्षणों के बीच अपने कॉन्फ़िगरेशन को बदलने की कोशिश न करें - बस सही पोर्ट का उपयोग करें। यह आपको वार्निश के प्रभाव को दिखाएगा। चूंकि वार्निश एक कैशिंग परत है, इसलिए इसे पहले एक के बाद सभी अनुरोधों को जल्दी से पूरा करना चाहिए - अनिवार्य रूप से, इसे बैकएंड और प्रसंस्करण को बायपास करना चाहिए जो एक गतिशील पृष्ठ उत्पन्न करने के लिए आवश्यक है, और कैश्ड कॉपी की बहुत जल्दी सेवा करता है।
    • आपने यह (हालांकि, स्थानीय रूप से नहीं) किया है और यह प्रदर्शित किया है कि वार्निश का आपके प्रदर्शन पर महत्वपूर्ण सकारात्मक प्रभाव है।

अपने बैकएंड को ट्यूनिंग

इस बिंदु तक आपको या तो समस्या का पता लगाना चाहिए या यह निष्कर्ष निकालना चाहिए कि यह आपके बैकएंड में निहित है। जो आपको Nginx, PHP, या MySQL छोड़ देता है।

(मैं यहाँ उल्लेख करना चाहिए, यह हमेशा करता है, तो अपने टोंटी सीपीयू, रैम, या मैं / हे है पता करने के लिए उपयोगी है कि - के बीच sar, top, iostat, vmstat, free।, आदि आप इस पर कुछ निष्कर्ष पर आने के लिए सक्षम होना चाहिए)

nginx

Nginx केवल अनुरोध ले रहा है और या तो स्थिर सामग्री परोस रहा है या PHP-FPM के अनुरोधों को शिफ्ट कर रहा है - आमतौर पर एल्गिनएक्स के साथ अनुकूलन करने के लिए बहुत कुछ नहीं है।

  • कार्यकर्ता = # सीपीयू कोर सेट करें
  • सक्षम रखें (10-15 का मान अच्छा है)
  • अनावश्यक लॉगिंग अक्षम करें
  • जरूरत पड़ने पर बफर साइज बढ़ाएं
  • यदि कथनों से बचें (जहाँ संभव हो, regexes के बजाय स्थिर नामों का उपयोग करें, अनावश्यक एक्सटेंशन को समाप्त करें)

आदर्श रूप से, आपके परीक्षण ब्लॉग और क्लोन किए गए ब्लॉग में समान कॉन्फ़िगरेशन हैं, इस मामले में, आपने समस्या के रूप में प्रभावी रूप से Nginx को समाप्त कर दिया है।

आवेदन

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

  • MySQL स्लो लॉग को सक्षम करें और PHP-FPM स्लो लॉग अपने बेंचमार्क को चलाएं और देखें कि क्या धीमा चल रहा है।

माई एसक्यूएल

  • अपने कैश को बढ़ाएं और एक अच्छा प्रारंभिक बिंदु प्राप्त करने के लिए mysqltuner.pl चलाएं ।

पीएचपी

  • अनावश्यक एक्सटेंशन अक्षम करें,
  • अक्षम रजिस्टर_ग्लोबल्स, मैजिक_क्वाट्स_ *, एक्सपोज_फैप, रजिस्टर_रग_रग्व, हमेशा_पॉपलेट_राव_पोस्ट_डाटा
  • memory_limit बढ़ाएं
  • Open_basedir और safe_mode के महत्वपूर्ण प्रदर्शन निहितार्थ हैं, लेकिन रक्षा की एक अतिरिक्त परत भी प्रदान कर सकते हैं। परीक्षण और उनके बिना, यह निर्धारित करने के लिए कि प्रदर्शन पर उनका प्रभाव सहनीय है या नहीं।

पीएचपी-एफ पी एम

  • दोपहर समायोजित करें। * मान - उच्च भार से निपटने के लिए उन्हें बढ़ाएं

यह ध्यान देने योग्य है कि आपके htop के परिणाम CPU-बल्क के उपभोग के रूप में php-fpm दिखाते हैं - और आपकी समस्या सीधे इस से संबंधित प्रतीत होती है।

कैशिंग

एक बार जब आप प्रत्येक संभावित अड़चन को अनुकूलित कर लेते हैं, तो कैशिंग शुरू करें।

  • आपके पास पहले से ही एक opCode कैश (APC) है - यह सुनिश्चित करें कि यह काम कर रहा है (यह एक परीक्षण फ़ाइल के साथ आता है) - अपने कैश हिट दरों की जांच करें, और यदि संभव हो तो डिस्क के बजाय APC कैश को मेमोरी में रखें।
  • अपने कोड को कैश पर सेट करें (उदाहरण के लिए वर्डप्रेस जैसे W3TC के लिए प्लगइन का उपयोग करके)
  • Nginx के साथ आप FastCGI कैशिंग सेटअप कर सकते हैं - लेकिन जब से आपके पास वार्निश है, यह सबसे अच्छा बचा जाता है।
  • एक कैशिंग लेयर सेट करें, जैसे वार्निश (जो आप पहले ही कर चुके हैं) - और यह सुनिश्चित करें कि यह काम कर रहा है (जैसे वार्निशस्ट का उपयोग करें, एक उच्च हिट्रेट प्राप्त करना पढ़ें )
  • अपनी साइट के घटकों के लिए और अधिक कैशिंग जोड़ें - जैसे मेमकेच्ड यदि लागू हो

कभी-कभी, आपके एप्लिकेशन और हार्डवेयर की सीमाओं को देखते हुए, आप बैकएंड के प्रदर्शन को सुधारने में सक्षम नहीं हो सकते हैं - हालांकि, यह कैशिंग का बिंदु है - बैकेंड के उपयोग को कम करने के लिए।

आगे की पढाई


2
यह विश्लेषण करने के लिए अंकों का शानदार सारांश है। टिप्पणी के लिए बहुत-बहुत धन्यवाद, मैं इन सभी सुझावों के साथ एक भारी परीक्षा देने की कोशिश करूंगा-जैसे कि आपने कहा है, पहले से ही स्पष्ट हैं- और देखें कि क्या मैं अंत में समस्या का पता लगा सकता हूं। सादर, सायबर x 86
जविपस

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