PHP मेमोरी प्रोफाइलिंग


95

PHP पृष्ठ के मेमोरी उपयोग को प्रोफाइल करने का एक अच्छा तरीका क्या है? उदाहरण के लिए, यह देखने के लिए कि मेरा डेटा कितनी मेमोरी का उपयोग कर रहा है, और / या कौन से फ़ंक्शन कॉल सबसे अधिक मेमोरी आवंटित कर रहे हैं।

  • xdebug अपने प्रोफाइलिंग फीचर में मेमोरी की जानकारी नहीं देता है।

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

क्या कुछ और है?


बाहर रस्मुस लेर्दोर्फ़ की बात कहा जाता है (चेक "सरल हार्ड कि" talks.php.net/show/froscon08 स्लाइड के लिए, youtube.com/watch?v=RWRYX5eJbG0 वीडियो के लिए)। वह बहुत सारे उपयोगी उपकरणों जैसे " झुकाव " ( pecl.php.net/package/inclued ), xdebug, और KCacheGrind पर चला जाता है।
टीएमएल

मुझे xdebug में एक पैच मिला , जो प्रोफाइल में मेमोरी की जानकारी प्रदान करता है। अब तक यह बहुत अच्छा काम कर रहा है।
जेडब्ल्यू।

1
जैसा कि आप कहते हैं, xdebug फ़ंक्शन निशान में जानकारी प्रदान करता है। सौभाग्य से, वे इसकी व्याख्या करने के लिए एक स्क्रिप्ट भी प्रदान करते हैं। derickrethans.nl/xdebug-and-tracing-memory-usage.html यह मेरे लिए अब तक काम कर रहा लगता है ...
ल्यूक एच

जवाबों:


10

Xdebug ने 2.6 (2018-01-29) में मेमोरी ट्रेसिंग को फिर से लागू किया, जिसका उपयोग Qcachegrind या इसी तरह के टूल में किया जा सकता है। बस मेमोरी विकल्प का चयन करना सुनिश्चित करें :)

डॉक्स से:

Xdebug 2.6 के बाद से, प्रोफाइलर इस बात की भी जानकारी एकत्र करता है कि मेमोरी का कितना उपयोग किया जा रहा है, और कौन-से फ़ंक्शंस में मेमोरी के उपयोग में वृद्धि हुई है।

मैं फ़ाइल के प्रारूप से परिचित नहीं हूँ, लेकिन यह Qcachegrind ने युगल स्मृति मुद्दों को ट्रेस करने में मेरे लिए बहुत अच्छा काम किया है।

qcachegrind नमूना


4
और उन्होंने मेरे टिकट का भी इस्तेमाल किया। :)
जेडब्ल्यू।

Xdebug ने 2.6 रिलीज में PHP 5 के लिए समर्थन छोड़ दिया।
पौव्टक

अगर यह किसी की मदद करता है ... php-fpm का उपयोग करते समय, विभिन्न अनुरोधों के बीच pid नहीं बदल सकता है। डिफ़ॉल्ट profiler_output_name के साथ, यह पिछले डेटा को अधिलेखित करने के लिए xdebug की ओर जाता है। Xdebug.org/docs/all_settings#trace_output_name
aligot

अब qcachegrind का उपयोग करने की कोशिश कर रहा हूँ और समझ में नहीं आ रहा है कि मैं क्या देख रहा हूँ। मुझे कहीं भी मेमोरी नंबर नहीं दिख रहे हैं। प्रत्येक चर कितनी मेमोरी लेता है? मैं कुछ ऐसा चाहता हूं जो निष्पादन का पता लगा सके और प्रत्येक बिंदु पर मेमोरी दिखा सके, और कौन-से चर उस मेमोरी को ले रहे हैं। मुझे इस पर और जानकारी कहां से मिल सकती है?
जॉन ktejik

72

जैसा कि आप शायद जानते हैं, Xdebug ने 2. * संस्करण के बाद से मेमोरी प्रोफाइलिंग समर्थन को गिरा दिया। कृपया यहां "हटाए गए कार्यों" स्ट्रिंग की खोज करें: http://www.xdebug.org/updates.php

निकाले गए कार्य

मेमोरी प्रोफाइलिंग के लिए हटाए गए समर्थन को ठीक से काम नहीं किया।

इसलिए मैंने एक और उपकरण की कोशिश की है और यह मेरे लिए अच्छा काम करता है।

https://github.com/arnaud-lb/php-memory-profiler

इसे मैंने अपने Ubuntu सर्वर पर सक्षम करने के लिए किया है:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart

और फिर मेरे कोड में:

<?php

memprof_enable();

// do your stuff

memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));

अंत में KCachegrind केcallgrind.out साथ फाइल खोलें

Google gperftools का उपयोग करना (अनुशंसित!)

सबसे पहले यहाँ नवीनतम पैकेज डाउनलोड करके Google gperftools स्थापित करें: https://code.google.com/p/gperftools/

फिर हमेशा की तरह:

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install

अब आपके कोड में:

memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

फिर अपना टर्मिनल खोलें और लॉन्च करें:

pprof --web /tmp/profile.heap

नीचे दिखाए गए जैसे कुछ के साथ आपके मौजूदा ब्राउज़र सत्र में pprof एक नई विंडो बनाएगा:

यादगार और gperftools के साथ PHP मेमोरी प्रोफाइलिंग

Xhprof + Xhgui (cpu और मेमोरी दोनों को प्रोफाइल करने के लिए मेरी राय में सबसे अच्छा)

साथ Xhprof और Xhgui तुम भी या सिर्फ स्मृति उपयोग cpu उपयोग प्रोफ़ाइल सकता है अगर उस समय आपके मुद्दा है। यह एक बहुत ही पूर्ण समाधान है, यह आपको पूर्ण नियंत्रण देता है और लॉग को मोंगो या फाइलसिस्टम पर लिखा जा सकता है।

अधिक जानकारी के लिए मेरा जवाब यहां देखें

तंबाकू से होने वाली बीमारी

Blackfire SensioLabs द्वारा एक PHP प्रोफाइलर है, सिम्फनी 2 लोग https://blackfire.io/

यदि आप अपने वर्चुअल मशीन को सेट करने के लिए प्यूपेट का उपयोग करते हैं, तो आपको यह जानकर खुशी होगी कि यह समर्थित है ;-)


आपने इसे काम करने के लिए कैसे बनाया? मैंने memprof_enableअपने PHP कोड में डालने की कोशिश की और मुझे मिल गया PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable()। मैं gperftools किया उनमें से वर्तमान स्रोत कोड से स्थापित करें।
एंड्री पोखिल्को

यह देखने के लिए कि क्या आप एक्सटेंशन को ठीक से लोड कर रहे हैं php -i, क्ली या ए पर चलाएं phpinfo()। यदि आपके पास यह नहीं है तो शायद यह आपकी *.iniफ़ाइलों पर एक नज़र डालने लायक है ।
फ्रांसेस्को कासुला

5
नोट: नवीनतम संस्करण केवल php7 का समर्थन करता है। यदि आप php5 का उपयोग करते हैं, के साथ स्थापित करें sudo pecl install memprof-1.0.0
जिउयूस

18

ठीक है, यह वही नहीं हो सकता है जिसे आप खोज रहे हैं, लेकिन PHP में कुछ फ़ंक्शन हैं जो अंतर्निहित मेमोरी उपयोग का उत्पादन करेंगे। यदि आप केवल यह देखना चाहते हैं कि किसी फ़ंक्शन कॉल का उपयोग करने के लिए मेमोरी कितनी है, तो आप कॉल करने से पहले और बाद में memory_get_peak_usage () का उपयोग कर सकते हैं और अंतर ले सकते हैं।

आप अपने डेटा के चारों ओर समान तकनीक का उपयोग करते हुए बहुत समान मैमोरी_गेट_सैज () का उपयोग करते हैं ।

सुंदर अपरिष्कृत दृष्टिकोण, लेकिन यह कोड का एक टुकड़ा बाहर की जाँच करने का एक त्वरित तरीका है। मैं मानता हूं कि xdebug मेम डेल्टास कभी-कभी उपयोगी होने के लिए बहुत अधिक क्रिया हो सकती है, इसलिए मैं अक्सर इसे कोड के एक हिस्से तक संकीर्ण करने के लिए उपयोग करता हूं, फिर मैन्युअल रूप से छोटे टुकड़ों के लिए विशिष्ट मेमोरी उपयोग को डंप कर देता हूं।


0

http://geek.michaelgrace.org/2012/04/tracing-php-memory-usage-using-xdebug-and-mamp-on-mac/

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

मैंने अपनी ट्रेसफाइल-एनालाइज़र.php फ़ाइल को संशोधित किया और शीर्ष पर PHP बाइनरी के लिए रास्ता जोड़ा ताकि आप इसे टर्मिनल में एक सामान्य यूनिक्स स्क्रिप्ट के रूप में कह सकें।

#!/Applications/MAMP/bin/php5.3/bin/php
<?php
if ( $argc <= 1 || $argc > 4 )
{

इस फाइल को 755 पर भेजने की भूल न करें।

आप आसानी से एक रूबी वॉच स्क्रिप्ट बना सकते हैं स्क्रिप्ट को स्वचालित रूप से कॉल करने के लिए हर बार जब यह मेमोरी प्रोफाइल फाइल (* .xt) बनाता है। इस तरह से आप कमांड को बार-बार निष्पादित किए बिना अपने सुधार को देख सकते हैं और देख सकते हैं।

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