लगातार PHP-FPM को पुनः लोड करना होगा


27

हमारे पास एक बहुत ही भारी लोडेड सर्वर है, जो कि nginx और PHP-FPM चल रहा है। हमारे पास इस सर्वर पर 6 वेबसाइट हैं, जो PHP-FPM और nginx चला रही हैं। सॉफ्टवेयर सभी vBulletin 3.8 और वर्डप्रेस है। डेटाबेस एक अलग सर्वर पर हैं।

अब, क्योंकि ये अत्यधिक लोकप्रिय वेबसाइट हैं, हमारे पास आम तौर पर एक समय में ऑनलाइन 7-8,000 आगंतुक आते हैं, जिनमें से प्रत्येक पृष्ठ अधिकांश भाग के लिए डेटाबेस को हिट करता है। मेरा मानना ​​है कि यह हमारी समस्याओं का कारण है।

क्योंकि हमारे पास MySQL सर्वर पर इतने बड़े डेटाबेस हैं, और क्योंकि प्रश्न, ईमानदारी से, सॉफ्टवेयर में बहुत बेहतर हो सकते हैं, मुझे लगता है कि MySQL कभी-कभी PHP को समय पर ढंग से परिणाम वापस करने में विफल होगा, अंततः एक कैस्केड प्रभाव पैदा करेगा। जब तक हम PHP-FPM को पुनः लोड नहीं करते, तब तक सब कुछ रुक जाता है। जब हम ऐसा करते हैं, तो चीजें फिर से ठीक होने लगती हैं।

इसका कारण मुझे समस्याएँ हो रही हैं क्योंकि मैं वास्तव में लॉग से कुछ भी नहीं समझ सकता हूँ। MySQL स्लो क्वेरी लॉग में, डाउनटाइम होने पर मुझे कुछ भी दिलचस्पी नहीं दिखाई देती है। नगनेक्स लॉग में, मैं हजारों प्रविष्टियों को यह कहते हुए देखता हूं कि रीड रिक्वेस्ट टाइम आउट हो गई है या कनेक्शन टाइम आउट हो गया है (TO PHP-FPB)। और PHP-FPM लॉग्स में, मुझे बहुत सी रेखाएं दिखाई देती हैं जो कहती हैं "निष्पादन समय से बाहर (31 सेकंड), समाप्त करना

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

अभी के लिए मेरे पास हर 10 मिनट में php5-fpm पुनः लोड करने के लिए एक कॉन्ट्राब है, जो दुर्घटनाग्रस्त समस्या का ख्याल रखता है। बेशक, जब PHP पुनः लोड होता है, तो nginx 502 गेटवे त्रुटि फेंकता है, इसलिए यह बहुत अधिक समाधान नहीं है।

PHP एपीसी कैश चला रहा है, अगर यह मायने रखता है। मैंने कुछ स्थानों पर पढ़ा है कि APC कुछ परिस्थितियों में फांसी का कारण बन सकता है।

कोई संकेत सहायक होगा। मैं वास्तव में हर समय इस मशीन के बारे में चिंता नहीं करना चाहूंगा।

अधिक जानकारी प्रदान की जा सकती है। बस मुझे यह बताना चाहिए कि आपको क्या चाहिए।

अद्यतन: मैं बस एक वेब रूट के लिए apc.php पर कॉपी किया और हमारे आँकड़े को देखने के लिए इसे एक्सेस किया। चीजें अच्छी लग रही थीं। फिर मैंने उपयोगकर्ता आँकड़े पर जाने के लिए लिंक पर क्लिक किया और सर्वर को तुरंत लटका दिया। मैंने php-fpm को पुनः लोड किया और फिर उपयोगकर्ता आँकड़े पृष्ठ को पुनः लोड किया और यह ठीक हो गया। एक मिनट इंतजार किया, फिर से लोड किया गया, सर्वर फिर से लटका।

तो यह निश्चित रूप से एपीसी से संबंधित है। सवाल है - हम इसे कैसे ठीक करते हैं?

APC कॉन्फ़िगरेशन:

[apc]
apc.enabled="1"
apc.stat = "1"
apc.max_file_size = "2M"
apc.localcache = "1"
apc.localcache.size = "256"
apc.shm_segments = "1"
apc.ttl = "3600"
apc.user_ttl = "7200"
apc.gc_ttl = "3600"
apc.cache_by_default = "1"
apc.filters = ""
apc.write_lock = "1"
apc.num_files_hint= "10000"
apc.user_entries_hint="10000"
apc.shm_size = "1G"
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.include_once_override = "0"
apc.file_update_protection="2"
apc.canonicalize = "1"
apc.report_autofilter="0"
apc.stat_ctime="0"

अपडेट 2: हमने इस पर कुछ प्रगति की है। यह पता चला है कि वर्डप्रेस कैशिंग प्लगइन (W3 कुल कैश) वह है जो दुर्घटनाओं का कारण बन रहा था। हम अभी भी नहीं जानते कि क्यों, लेकिन इसके साथ अक्षम होने के बाद, हम लगभग 4 घंटे के लिए PHP चला रहे हैं अब कोई पुनः लोड नहीं, कोई मंदी नहीं, कोई क्रैश नहीं। हम अभी भी vBulletin मंचों पर APC का उपयोग कर रहे हैं और वहां कोई समस्या नहीं है। क्या कोई तरीका है जिससे हम यह निर्धारित कर सकते हैं कि APC दुर्घटनाग्रस्त क्यों हो रहा है? मैं इसे अपने वर्डप्रेस इंस्टॉलेशन पर उपयोग करना पसंद करूंगा, लेकिन एक नाजुक प्रणाली की कीमत पर नहीं।


क्या आपके पास कोई एपीसी संबंधित सेटिंग्स पोस्ट कर सकते हैं?
काइल

हाँ, अच्छा विचार है। किया हुआ।
केविन

इस मशीन पर आपके पास कितना राम और स्वैप है? मरने के बाद इसका उपयोग कितना किया जाता है?
काइल

2
एपीसी एक भयानक रूप से छोटी गाड़ी दुःस्वप्न है, और वर्षों से मेरी एक वेब साइट पर इस तरह से दुर्घटनाओं का एकमात्र स्रोत था । मैंने अंत में इसे पूरी तरह से छुटकारा पा लिया; और PHP अब ठोस है। यदि आप कैशिंग करना चाहते हैं, तो Zend Opcache का प्रयास करें, जो PHP 5.5 से डिफ़ॉल्ट कैश भी है।
माइकल हैम्पटन

1
हां, यह APC होने के कारण समाप्त हो गया जो PHP को क्रैश कर रहा था। जब हमने APC को निष्क्रिय कर दिया, तो हमने लगातार PHP को पुनरारंभ करना बंद कर दिया।
केविन

जवाबों:


27

आप php-fpm का उपयोग कर रहे हैं, इसलिए मैं सुझाव देता हूं कि php-fpm के बच्चों को कितने समय तक रहने दिया जाए। आपको जल्द ही जीवित धागे / बच्चों और स्थिरता के बीच मधुर स्थान खोजने की जरूरत है। Php-fpm डिफॉल्ट किसी भी उत्पादन प्रणाली, IMHO के लिए उदार का तरीका है।

मैं आपके उत्पादन पूल के लिए pm.max_requests की संख्या कम कर दूँगा । मुझे लगता है कि डिफ़ॉल्ट 200 है। मैं 50 से शुरू करूंगा और देखूंगा कि आपको कहां ले जाता है।

इसके लिए असफल / पूरक, आप इन वैश्विक विकल्पों को भी आज़मा सकते हैं (AFAIK वे सभी डिफ़ॉल्ट रूप से अक्षम हैं):

emergency_restart_threshold=3
emergency_restart_interval=1m
process_control_timeout=5s

इसका क्या मतलब है? अगर 3 PHP-FPM चाइल्ड प्रोसेस 1 मिनट के भीतर SIGSEGV या SIGBUS (यानी क्रैश) से बाहर निकल जाते हैं तो PHP-FPM अपने आप रीस्टार्ट होने वाला है। मास्टर से संकेतों पर प्रतिक्रिया के लिए बच्चे की प्रक्रिया 5s की प्रतीक्षा करती है।

यह PHP कार्यकर्ता धागे के अपने पूल को अच्छा, ताजा और साफ रखना चाहिए। किसी कार्यकर्ता को अनुरोधों को प्रस्तुत करने की अनुमति दी जाती है, अधिक अस्थिर यह प्राप्त होगा। मेमोरी लीक का एक उच्च जोखिम भी है।

यहाँ मेरे द्वारा बताए गए सभी विन्यास विकल्पों का अच्छा अवलोकन है, साथ ही साथ अन्य: http://myjeeva.com/php-fpm-configuration-101.html

आशा है कि ये टिप्स आपकी मदद करेंगे! ट्वीक करना और अवलोकन करना, दुर्भाग्य से इस सब के लिए अंगूठे का एक नियम नहीं लगता है, बहुत सारे चर हैं जो PHP के व्यवहार और स्थिरता को प्रभावित करते हैं।


1
हर घंटे php5-fpm को पुनः आरंभ करने के लिए क्रोन का उपयोग करने पर आपकी क्या राय है?
CMCDragonkai

2
यह करने का एक कठिन तरीका है, और यह बिल्कुल काम नहीं कर सकता है। PHP-FPM में कई सारे ट्विक्‍स बिल्‍ट-इन हैं, इसलिए उस ट्विकेबिलिटी का उपयोग करना बेहतर है।
रूबेन

1
इस जवाब ने मुझे सही दिशा में इशारा किया। मैं अपने आप को इस तरह ने वही समस्या को देखा, मेरे लिए समाधान को बदलने के लिए था pmसे dynamicकरने के लिए ondemandऔर सभी अन्य सभी मूलभूत मूल्यों के साथ अब भव्य काम कर रहा है।
लालटेन

(php-fpm.conf में) यह कुंजी और मूल्य को अलग करने के बजाय '=' होना चाहिए। इमर्जेंसी_रस्टार्ट_थ्रेशल्ड = ३ इमरजेंसी_स्टार्ट_थर्नवेल = १ मी प्रोसेस_कंट्रोल_टाइमआउट = ५ एस
जस्टी १६'१

मैं मिल रहा हूँERROR: [/etc/php/7.0/fpm/pool.d/www.conf:135] unknown entry 'emergency_restart_threshold'
Deweydb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.