PHP सत्रों के लिए उबंटू का कचरा संग्रह क्रोन जॉब चलाने में 25 मिनट लगते हैं, क्यों?


13

उबंटू में क्रॉन जॉब सेट है जो पुराने PHP सत्रों को खोजता और हटाता है:

# Look for and purge old sessions every 30 minutes
09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] \
   && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 \
   -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir \
   fuser -s {} 2> /dev/null \; -delete

मेरी समस्या यह है कि इस प्रक्रिया को चलाने में बहुत समय लग रहा है, बहुत सारे डिस्क IO के साथ। यहाँ मेरा CPU उपयोग ग्राफ है:

सीपीयू उपयोग ग्राफ

क्लीनअप रनिंग को टीले स्पाइक्स द्वारा दर्शाया गया है। अवधि की शुरुआत में, PHP की सफाई की नौकरियों को डिफ़ॉल्ट 09 और 39 मिनट के समय पर निर्धारित किया गया था। 15:00 बजे मैंने क्रोन से 39 मिनट का समय निकाल दिया, इसलिए एक सफाई काम दो बार आकार आधे से अधिक बार चलता है (आप देख सकते हैं कि चोटियों को दो बार चौड़ा और आधे के रूप में अक्सर मिलता है)।

यहाँ IO समय के लिए इसी ग्राफ हैं:

IO समय

और डिस्क संचालन:

डिस्क संचालन

चरम पर जहां लगभग 14,000 सत्र सक्रिय थे, सफाई को पूरे 25 मिनट तक चलाने के लिए देखा जा सकता है, जाहिरा तौर पर सीपीयू के एक कोर के 100% का उपयोग करके और पूरी अवधि के लिए डिस्क आईओ का 100% लगता है। यह इतना गहन संसाधन क्यों है? एक lsसत्र निर्देशिका की /var/lib/php5एक दूसरी मात्र एक अंश लेता है। तो पुराने सत्रों को ट्रिम करने में पूरे 25 मिनट क्यों लगते हैं? क्या ऐसा कुछ है जो मैं इसे तेज कर सकता हूं?

इस उपकरण के लिए फाइलसिस्टम वर्तमान में ext4 है, जो Ubuntu Precise 12.04 64-बिट पर चल रहा है।

संपादित करें: मुझे संदेह है कि लोड असामान्य प्रक्रिया "फ्यूज़र" के कारण है (क्योंकि मैं एक सरल rmहोने की उम्मीद करता हूं कि मैं जिस प्रदर्शन को देख रहा हूं, उससे भी तेज गति से लहराता हूं)। मैं फ्यूज़र का उपयोग हटाने जा रहा हूं और देखता हूं कि क्या होता है।


आपकी वेब साइट को कितने सत्रों के लिए ट्रैफ़िक प्राप्त होता है?
माइकल हैम्पटन

जवाबों:


9

हटाने में fuserमदद करनी चाहिए। यह जॉब fuserमिली हुई प्रत्येक सत्र फ़ाइल के लिए एक कमांड (अगर कोई फ़ाइल वर्तमान में खुली है) चलाती है , जो 14k सत्रों के साथ व्यस्त सिस्टम पर आसानी से कई मिनट ले सकती है। यह एक डेबियन बग था (उबंटू डेबियन पर आधारित है)।

मेमकेड के बजाय आप सत्र फ़ाइलों के लिए tmpfs (मेमोरी में एक फाइल सिस्टम) का उपयोग करने का प्रयास कर सकते हैं। मेमेकटेड की तरह यह रीबूट पर सत्रों को अमान्य कर देगा (इसे इस स्क्रिप्ट को कहीं शटडाउन स्क्रिप्ट में और स्टार्टअप स्क्रिप्ट में पुनर्स्थापित करके काम किया जा सकता है), लेकिन इसे सेटअप करना बहुत आसान होगा। लेकिन यह fuserसमस्या के साथ मदद नहीं करेगा ।


ऐसा लगता है कि फ्यूज़र में बग था कि पहले वाला संस्करण कांटा गया था, लेकिन फिर पूरा होने पर कभी नहीं लगाया गया था fuser, जो एक ज़ोंबी की खपत करने वाली ज़ोंबी स्थिति में हजारों प्रक्रियाओं को छोड़ देता है, जिससे सर्वर क्रैश हो जाता है। मुझे लगता है कि पहले से ही मैं उपयोग कर रहे हैं कि psmisc के संस्करण में तय किया गया है।
तत्पश्चात

वह एक और बग है। आपको हजारों fuserप्रक्रियाओं को शुरू करने की एक सरल समस्या है, जो सभी को /proc/खुली फाइलों के लिए पूरी खोज करनी चाहिए ।
Tometzky

9

एक लोकप्रिय वेब साइट होने और इसे सभी समय के लिए आभासी मशीन पर चालू रखने के लिए बधाई।

क्या तुम सच में प्रति दिन दो लाख पृष्ठदृश्य में खींच रहे हैं, तो आप फाइल सिस्टम में पीएचपी सत्र का एक बहुत ऊपर ढेर करने जा रहे हैं, और वे कोई फर्क नहीं पड़ता कि क्या आप का उपयोग को नष्ट करने के लिए एक लंबे समय लेने के लिए जा रहे हैं fuserया rmया एक वैक्यूम क्लीनर।

इस बिंदु पर मैं आपको अपने सत्रों को संग्रहीत करने के वैकल्पिक तरीकों पर ध्यान देने की सलाह दूंगा:

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

मेमकेच्ड निश्चित रूप से एक विकल्प है, हालांकि यह हमारे मुख्य मेमकास्टेड उदाहरण से एक अलग पूल होना होगा, अन्यथा सत्र हमारे कैश दबाव से बेतरतीब ढंग से बेदखल हो जाएंगे। मुझे यकीन नहीं है कि 14,000 फ़ाइलों को हटाने में 25 मिनट लगने चाहिए। लगता है कि मेरे लिए बहुत धीमा है। मैं कुछ घंटों का इंतजार करने जा रहा हूं और देखूंगा कि एक साधारण rmका प्रदर्शन कैसा है।
तत्कालीन

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

आप memcache.session_redundancy = 2 को सेट करके अतिरेक के लिए मेमकेच्ड सर्वर को पूल कर सकते हैं। Serverfault.com/questions/164350/… देखें । यदि आप दृढ़ता और SQL डेटाबेस स्टोर की तुलना में बहुत तेजी से चिंतित हैं, तो Redis एक अच्छा विकल्प है।
jfountain

4

इसलिए, उपयोगकर्ताओं द्वारा सुझाए गए मेमकाटेड और डेटाबेस सत्र भंडारण विकल्प प्रदर्शन को बढ़ाने के लिए दोनों अच्छे विकल्प हैं, प्रत्येक अपने स्वयं के लाभ और कमियों के साथ।

लेकिन प्रदर्शन परीक्षण से, मैंने पाया कि fuserक्रोन जॉब में कॉल करने के लिए इस सत्र के रख-रखाव की विशाल प्रदर्शन लागत लगभग पूरी तरह से कम है । यहां पर नेटी / वनैरिक क्रॉन जॉब जो कि पुराने सत्रों को ट्रिम करने के rmबजाय उपयोग करता है, स्विच करने के बाद प्रदर्शन का ग्राफ fuser2:30 बजे होता है।

सि पि यु का उपयोग

बीता हुआ IO समय

डिस्क संचालन

आप देख सकते हैं कि उबंटू के PHP सत्र सफाई के कारण आवधिक प्रदर्शन में गिरावट लगभग पूरी तरह से हटा दी गई है। डिस्क ऑपरेशंस ग्राफ में दिखाए गए स्पाइक्स अब परिमाण में बहुत छोटे हैं, और स्किनी के बारे में जैसा कि यह ग्राफ संभवतः माप सकता है, एक छोटा, छोटा विघटन दिखा रहा है जहां पहले 25 मिनट के लिए सर्वर प्रदर्शन काफी कम हो गया था। अतिरिक्त CPU उपयोग पूरी तरह से समाप्त हो गया है, यह अब एक IO- बाध्य कार्य है।

(एक असंबंधित IO जॉब 05:00 बजे चलती है और CPU जॉब 7:40 पर चलती है जो दोनों इन ग्राफ्स पर अपनी खुद की स्पाइक्स का कारण बनते हैं)

अब मैं जो संशोधित क्रॉन जॉब चला रहा हूं वह है:

09 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && \
   [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 \
   -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 \
   | xargs -n 200 -r -0 rm

-print0 | xargs ...आवश्यक नहीं है - आप बस -deleteवहाँ छोड़ सकते हैं। लेकिन यह तुलनीय गति के साथ दोनों तरीकों से काम करेगा।
Tometzky

1

सत्रों पर कुछ शोध करते समय मैं इस पद पर आया। जबकि स्वीकृत उत्तर बहुत अच्छा है (और fuser कॉल को कुछ समय के लिए gc स्क्रिप्ट से हटा दिया गया है) मुझे लगता है कि इसके लायक कुछ और ध्यान देने के अलावा किसी और को भी इसी तरह के मुद्दे पर आना चाहिए।

वर्णित परिदृश्य में, ओपी ext4 का उपयोग कर रहा था। एक htree डेटाबेस प्रारूप में ext4 स्टोर फ़ाइल डेटा में निर्देशिकाएँ - जिसका अर्थ है कि एक ही निर्देशिका में बहुत सारी फ़ाइलों को रखने की तुलना में नगण्य प्रभाव है जो उन्हें म्यूटेंटरी निर्देशिका में वितरित करने की तुलना में है। यह सभी फाइल सिस्टम का सच नहीं है। PHP में डिफ़ॉल्ट हैंडलर आपको सत्र फ़ाइलों के लिए कई उप-निर्देशिकाओं का उपयोग करने की अनुमति देता है (लेकिन ध्यान दें कि आपको जांचना चाहिए कि नियंत्रण प्रक्रिया उन निर्देशिकाओं में पुनरावृत्ति कर रही है - ऊपर क्रोन कार्य नहीं करता है)।

ऑपरेशन की बहुत अधिक लागत (फ्यूज़र को कॉल हटाने के बाद) उन फ़ाइलों को देखने से उत्पन्न होती है जो अभी तक बासी नहीं हैं। (उदाहरण के लिए) उपनिर्देशिकाओं के एक स्तर का उपयोग करना, और प्रत्येक उप निर्देशिका (16 /, 1 /, ... डी /, ई /, एफ /) में देख रहे 16 क्रोन नौकरियों से उत्पन्न होने वाले भार में आसानी होगी।

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


0

उस तरह के ट्रैफ़िक के साथ आपको सत्र नहीं लगाना चाहिए। आपको मेमेचे जैसे कुछ का उपयोग करना चाहिए। आपको बस सेटअप php करना है और कोई कोड परिवर्तन की आवश्यकता नहीं होगी। उदाहरण के लिए देखें

http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/

जिस कारण से यह इतना लंबा समय ले रहा है, वह यह है कि फाइलों की विशाल मात्रा के कारण यह देखना पड़ता है कि कौन सी चीजें डिलीट की जा सकती हैं। Memcache आपके द्वारा अपने कोड में निर्धारित सत्र की लंबाई को समाप्त कर सकता है।

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