การสร้างโปรไฟล์หน่วยความจำ PHP


96

วิธีที่ดีในการกำหนดโปรไฟล์การใช้หน่วยความจำของหน้า PHP คืออะไร? ตัวอย่างเช่นหากต้องการดูว่าข้อมูลของฉันใช้หน่วยความจำเท่าใดและ / หรือการเรียกใช้ฟังก์ชันใดจัดสรรหน่วยความจำมากที่สุด

  • xdebug ดูเหมือนจะไม่ให้ข้อมูลหน่วยความจำในคุณสมบัติการทำโปรไฟล์

  • xdebug ไม่ให้มันในลักษณะของการติดตาม นี่ค่อนข้างใกล้เคียงกับที่ฉันต้องการยกเว้นปริมาณข้อมูลที่แท้จริงจะล้นหลามเนื่องจากแสดงเดลต้าหน่วยความจำสำหรับการเรียกใช้ฟังก์ชันทุกครั้ง หากเป็นไปได้ที่จะซ่อนการโทรที่ต่ำกว่าระดับความลึกที่กำหนดอาจใช้เครื่องมือ GUI บางอย่างนั่นจะช่วยแก้ปัญหาของฉันได้

มีอะไรอีกมั้ย?


ลองดูคำพูดของ Rasmus Lerdorf ที่เรียกว่า "Simple is Hard" ( talks.php.net/show/froscon08สำหรับสไลด์youtube.com/watch?v=RWRYX5eJbG0สำหรับวิดีโอ) เขามีเครื่องมือที่มีประโยชน์มากมายเช่น "รวม" ( pecl.php.net/package/inclued ), xdebug และ KCacheGrind
TML

ฉันพบโปรแกรมแก้ไขสำหรับ xdebugซึ่งให้ข้อมูลหน่วยความจำในโปรไฟล์ จนถึงตอนนี้มันใช้งานได้ดีมาก
.

1
อย่างที่คุณพูด xdebug ให้ข้อมูลในการติดตามฟังก์ชัน โชคดีที่พวกเขายังมีสคริปต์เพื่อตีความสิ่งนั้น derickrethans.nl/xdebug-and-tracing-memory-usage.htmlดูเหมือนว่าจะใช้ได้ผลสำหรับฉันจนถึงตอนนี้ ...
Luke H

คำตอบ:


11

Xdebug นำ การติดตามหน่วยความจำมาใช้ใหม่ใน 2.6 (2018-01-29) ซึ่งสามารถใช้ใน Qcachegrind หรือเครื่องมือที่คล้ายกัน เพียงให้แน่ใจว่าจะเลือกตัวเลือกหน่วยความจำ :)

จากเอกสาร:

ตั้งแต่ Xdebug 2.6 ผู้สร้างโปรไฟล์ยังรวบรวมข้อมูลเกี่ยวกับจำนวนหน่วยความจำที่ใช้อยู่และฟังก์ชันใดที่เมธอด aGnd เพิ่มการใช้หน่วยความจำ

ฉันไม่คุ้นเคยกับรูปแบบของไฟล์ แต่ Qcachegrind ทำงานได้ดีสำหรับฉันในการติดตามปัญหาเกี่ยวกับหน่วยความจำสองสามข้อ

qcachegrind ตัวอย่าง


4
และพวกเขายังใช้ตั๋วของฉัน :)
.

Xdebug ยกเลิกการรองรับ PHP 5 ในรุ่น 2.6
powtac

หากช่วยใคร ... เมื่อใช้ php-fpm pid อาจไม่เปลี่ยนแปลงระหว่างคำขอที่แตกต่างกัน ด้วย default profiler_output_name สิ่งนี้จะทำให้ xdebug เขียนทับข้อมูลก่อนหน้านี้ เปลี่ยนค่านี้โดยใช้อย่างอื่นจากxdebug.org/docs/all_settings#trace_output_name
aligot

ตอนนี้ฉันพยายามใช้ qcachegrind และไม่เข้าใจว่าฉันกำลังมองหาอะไร ฉันไม่เห็นหมายเลขหน่วยความจำที่ใดเลย หน่วยความจำแต่ละตัวแปรใช้เวลาเท่าไหร่? ฉันต้องการสิ่งที่สามารถติดตามการดำเนินการและแสดงหน่วยความจำในแต่ละจุดและตัวแปรใดที่ใช้หน่วยความจำนั้น ฉันสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่ไหน?
john 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"));

ในที่สุดเปิดcallgrind.outไฟล์ด้วยKCachegrind

ใช้ 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จะสร้างหน้าต่างใหม่ในเซสชันเบราว์เซอร์ที่มีอยู่ของคุณโดยมีสิ่งที่แสดงด้านล่าง:

การสร้างโปรไฟล์หน่วยความจำ PHP ด้วย memprof และ gperftools

Xhprof + Xhgui (ดีที่สุดในความคิดของฉันสำหรับโปรไฟล์ทั้ง cpu และหน่วยความจำ)

ด้วยXhprofและXhguiคุณสามารถกำหนดโปรไฟล์การใช้งาน cpu ได้เช่นกันหรือเพียงแค่การใช้หน่วยความจำหากนั่นเป็นปัญหาของคุณในขณะนี้ เป็นโซลูชันที่สมบูรณ์แบบมากช่วยให้คุณสามารถควบคุมได้อย่างเต็มที่และบันทึกสามารถเขียนได้ทั้งบน mongo หรือในระบบไฟล์

สำหรับรายละเอียดเพิ่มเติมดูคำตอบของฉันที่นี่

แบล็คไฟร์

Blackfire เป็นผู้สร้างโปรไฟล์ PHP โดย SensioLabs ซึ่งเป็นพวก Symfony2 https://blackfire.io/

หากคุณใช้puphpetเพื่อตั้งค่าเครื่องเสมือนของคุณคุณยินดีที่จะรู้ว่ามันรองรับ ;-)


คุณทำให้มันทำงานได้อย่างไร? ผมพยายามที่จะใส่memprof_enableลงไปในโค้ด PHP PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable()ของฉันและฉันได้รับ ฉันทำ gperftools ทำการติดตั้งจากซอร์สโค้ดปัจจุบันของพวกเขา
Andrey Pokhilko

เรียกใช้php -iบน cli หรือ a phpinfo()เพื่อดูว่าคุณโหลดส่วนขยายอย่างถูกต้องหรือไม่ หากคุณไม่มีมันอาจจะคุ้มค่าที่จะดู*.iniไฟล์ของคุณ
Francesco Casula

5
หมายเหตุ: เวอร์ชันล่าสุดรองรับ php7 เท่านั้น หากคุณใช้ php5 ให้ติดตั้งด้วยsudo pecl install memprof-1.0.0.
Djizeus

18

นี่อาจไม่ใช่สิ่งที่คุณกำลังมองหา แต่ PHP มีฟังก์ชันสองสามอย่างในตัวซึ่งจะส่งผลการใช้งานหน่วยความจำ หากคุณต้องการเพียงแค่ดูว่าหน่วยความจำที่เรียกใช้ฟังก์ชันนั้นใช้หน่วยความจำเท่าใดคุณสามารถใช้memory_get_peak_usage ()ก่อนและหลังการโทรและรับความแตกต่าง

คุณสามารถใช้เทคนิคเดียวกันรอบข้อมูลของคุณโดยใช้ที่คล้ายกันมากmemory_get_usage ()

วิธีการที่ค่อนข้างไม่ซับซ้อน แต่เป็นวิธีที่รวดเร็วในการตรวจสอบโค้ด ฉันยอมรับว่า xdebug mem deltas สามารถใช้งานได้ละเอียดเกินไปในบางครั้งดังนั้นฉันจึงมักใช้เพื่อ จำกัด ส่วนของโค้ดให้แคบลงจากนั้นจึงทิ้งการใช้หน่วยความจำเฉพาะสำหรับชิ้นส่วนเล็ก ๆ


0

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

ฉันใช้ Mac ดังนั้นหากคุณใช้ Windows คุณจะต้องทดสอบสิ่งนี้ แต่มันใช้ได้กับฉัน

ฉันแก้ไขไฟล์ tracefile-analyzer.php ของฉันและเพิ่มพา ธ ไปยังไบนารี PHP ที่ด้านบนเพื่อให้คุณสามารถเรียกมันในเทอร์มินัลเป็นสคริปต์ยูนิกซ์ปกติ

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

อย่าลืม chmod ไฟล์นี้เป็น 755

คุณสามารถสร้างสคริปต์ Ruby watchr เพื่อเรียกสคริปต์โดยอัตโนมัติทุกครั้งที่สร้างไฟล์โปรไฟล์หน่วยความจำ (* .xt) ด้วยวิธีนี้คุณจะสามารถทดสอบและดูการปรับปรุงได้โดยไม่ต้องดำเนินการคำสั่งซ้ำแล้วซ้ำเล่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.