2016-07-28 15 views
8

मैंने देखा है कि top या ps PHP प्रक्रिया के लिए स्मृति उपयोग के रूप में रिपोर्ट के बारे में काफी अंतर है, इसकी प्रक्रिया की तुलना में प्रक्रिया क्या है (memory_get_usage के साथ)।PHP वास्तव में कितनी मेमोरी का उपयोग कर रहा है?

वास्तव में प्रक्रिया का उपयोग कितनी मेमोरी है?

मेरी क्षुधा में से एक के साथ निम्न कोड चलाते समय:

echo "Memory usage: " . pretty_bytes(memory_get_usage()) . PHP_EOL; 
echo "Peak memory usage: " . pretty_bytes(memory_get_peak_usage()) . PHP_EOL; 
echo "'Actual' memory usage: " . pretty_bytes(memory_get_usage(true)) . PHP_EOL; 
echo "'Actual' peak memory usage: " . pretty_bytes(memory_get_peak_usage(true)) . PHP_EOL; 

$ps_output = exec("ps --pid " . getmypid() . " --no-headers -o rss"); 

echo "'Memory usage according to ps: " . pretty_bytes(intval($ps_output) * 1000); 

एक यादृच्छिक बिंदु पर उत्पादन किया गया था: क्योंकि मैं

Memory usage: 4.77 MB 
Peak memory usage: 4.99 MB 
'Actual' memory usage: 5.00 MB 
'Actual' peak memory usage: 5.00 MB 
Memory usage according to ps: 17.66 MB 

मेरी विशेष मामले में, यह चिंता का विषय है मैं कुछ श्रमिकों और डेमॉन चला रहा हूँ।

जब मैं PHP स्मृति सीमा को उदा। इनमें से प्रत्येक डेमॉन के लिए 128 एमबी, पीएचपी के अपने माप के अनुसार 128 एमबी तक पहुंचने के बाद ही प्रक्रियाएं मारे जाएंगी। हालांकि, ps के अनुसार, प्रक्रिया उस समय लगभग 200 एमबी का उपयोग कर रही होगी।

उत्तर

2

इस बात पर बल दिया जाना चाहिए वास्तव में क्याद्वारा रिपोर्ट किए गए मान 0 और memory_get_usage(true) हैं।

ps -o rss वास्तविक निवासी सेट आकार की रिपोर्ट करता है। इस मूल्य पर निर्भर करना काफी गड़बड़ है, क्योंकि इसमें अंततः स्मृति को बदल दिया नहीं गया है। आम तौर पर, आप यूएसएस, अद्वितीय सेट आकार चाहते हैं, जो मूल रूप से अनशोधित स्मृति है (इसके लिए smem(8) पर एक नज़र डालें)। यह अनसुलझा स्मृति की मात्रा है जो कर्नेल ने वास्तव में उस प्रक्रिया के लिए पृष्ठों को मैप किया है, यानी भौतिक रूप से रैम या स्वैपफ़ाइल में अनशोधित स्मृति मौजूद है। यह उतना करीब है जितना आप "वास्तविक" स्मृति उपयोग के लिए प्राप्त कर सकते हैं। [विस्तृत विवरण के लिए /proc/$PID/smaps का भी उल्लेख करें, जैसा कि आईवीओ जीईएलओवी द्वारा दिए गए उत्तर में बताया गया है, जहां आप तकनीकी रूप से उस वर्चुअल फ़ाइल को पार्स करके अपनी गिनती करना चाहते हैं।]

memory_get_usage() के संबंध में, यह वास्तव में PHP के आंतरिक मेमोरी मैनेजर का उपयोग कर सिस्टम द्वारा आवंटित ढेर स्मृति की रिपोर्ट करता है। इसका मतलब है, पुस्तकालय जो सीधे सिस्टम के अन्य मेमोरी प्रबंधकों का उपयोग करते हैं (mmap(2) या malloc(3)) यहां उनके मेमोरी उपयोग का पर्दाफाश न करें। [इस उदाहरण क्यों mysqlnd ज्यादा स्मृति के उपयोग को दिखाने जबकि libmysqlclient नहीं करता है के लिए है -। उत्तरार्द्ध malloc() आंतरिक रूप से उपयोग करता है]

आप, पहले पैरामीटर के रूप true पार कर लेते हैं यानी memory_get_usage(true), यह स्मृति पीएचपी के आंतरिक स्मृति प्रबंधक की कुल राशि देता है सिस्टम से पूछा है। सामान्य रूप से यह संख्या थोड़ा है, लेकिन memory_get_usage(false) से अधिक नहीं है। यह वह संख्या भी है जो memory_limit आईएनआई सेटिंग की तुलना में की जाती है।

यदि आप देखना चाहते हैं कि आप कितने श्रमिक चला सकते हैं, तो ध्यान दें कि PHP अधिक मेमोरी साझा नहीं करता है, सिवाय इसके कि कर्नेल लाइब्रेरी मेमोरी और ओपेकैच साझा कर सकता है, जो संरचनाओं (ऑपोड्स, क्लास इन्फो इत्यादि) साझा करता है। इस प्रकार साझा स्मृति आपके लिए महत्वपूर्ण नहीं होनी चाहिए। इस प्रकार आपके लिए सबसे महत्वपूर्ण मूल्य यूएसएस होना चाहिए।

+0

धन्यवाद @ बोवेबी। यह और इवो के उत्तर ने हमें समस्या में अंतर्दृष्टि का पर्याप्त स्तर दिया है हाथ से इस मुद्दे से निपटने के लिए। – Robbert

6

memory_get_usage आपकी स्क्रिप्ट चलाने के लिए PHP प्रक्रिया द्वारा आवंटित स्मृति की रिपोर्ट करता है। ps PHP प्रक्रिया द्वारा उपयोग की जाने वाली स्मृति की रिपोर्ट करता है, जिसमें आपकी स्क्रिप्ट के लिए उपयोग की गई स्मृति शामिल है। PHP प्रक्रिया कई बाहरी पुस्तकालयों का उपयोग करती है, जो सभी PHP स्मृति प्रक्रिया के बारे में जागरूक होने के बिना अपनी स्मृति आवंटित कर सकते हैं।

तो memory_get_usage और ps स्वाभाविक रूप से विभिन्न चीजों को मापते हैं और विभिन्न संख्याओं की रिपोर्ट करनी चाहिए। यह सब नीचे आता है कि आप "वास्तविक स्मृति उपयोग" को कैसे परिभाषित करते हैं। मैं समझता हूं कि आपके मामले में आप PHP प्रक्रिया के स्मृति उपयोग में अधिक रुचि रखते हैं। फिर ps का आउटपुट आपके लिए अधिक प्रासंगिक है। लेकिन आप आसानी से पता लगा सकते हैं कि ps द्वारा आरएसएस मूल्य की रिपोर्ट भी आधुनिक ऑपरेटिंग सिस्टम और साझा यादों की दुनिया में इतनी काला और सफेद नहीं है।

यह भी देखें:

+0

धन्यवाद एर्की। यह एक सहायक शुरुआत थी, लेकिन हम अभी भी कुछ स्तर के विस्तार से गुम हो गए थे कि @ बोवेबी अपने जवाब में प्रदान करने में सक्षम था। – Robbert

2

आप दिलचस्प बातें हो सकता है कि इन आदेशों का मुद्दा एक:

cat /proc/PID_NUMBER/smaps 
pmap -d PID_NUMBER 
+0

व्याख्या के बिना कुछ गुप्त परिणाम (हालांकि संभावित रूप से शिक्षित) शायद एसओ के लिए सही दृष्टिकोण नहीं है। ; ओ) – Jakumi

+0

अतिरिक्त जानकारी –

+0

जैसी कई जगहों पर उपलब्ध है जो बहुत अच्छी तरह से हो सकती हैं, लेकिन जब तक कि आप उन कई स्थानों से लिंक नहीं करते हैं, तो आपका उत्तर स्वयं ही कोई अंतर्दृष्टि प्रदान नहीं करता है। – Jakumi

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