PHP 메모리 프로파일 링


95

PHP 페이지의 메모리 사용량을 프로파일 링하는 좋은 방법은 무엇입니까? 예를 들어, 내 데이터가 사용중인 메모리 양 및 / 또는 가장 많은 메모리를 할당하는 함수 호출을 확인합니다.

  • xdebug는 프로파일 링 기능에서 메모리 정보를 제공하지 않는 것 같습니다.

  • xdebug 추적 기능에서이를 제공합니다. 이것은 모든 단일 함수 호출에 대한 메모리 델타를 보여주기 때문에 엄청난 양의 데이터가 압도적이라는 점을 제외하고는 내가 원하는 것과 매우 비슷합니다. GUI 도구를 사용하여 특정 깊이 이하로 호출을 숨길 수 있다면 내 문제를 해결할 수 있습니다.

다른 건 없나요?


"Simple is Hard"라는 Rasmus Lerdorf의 강연 ( 슬라이드의 경우 talks.php.net/show/froscon08 , 동영상의 경우 youtube.com/watch?v=RWRYX5eJbG0 )을 확인하십시오. 그는 "inclued"( pecl.php.net/package/inclued ), xdebug 및 KCacheGrind 와 같은 유용한 도구를 많이 검토합니다 .
TML

프로필에 메모리 정보를 제공 하는 xdebug 패치를 찾았습니다 . 지금까지는 매우 잘 작동하고 있습니다.
JW.

1
말했듯이 xdebug는 함수 추적에 정보를 제공합니다. 운 좋게도이를 해석하는 스크립트도 제공합니다. derickrethans.nl/xdebug-and-tracing-memory-usage.html 은 ... 지금까지 나를 위해 작동하는 것 같군
누가 복음 H

답변:


10

Xdebug 는 Qcachegrind 또는 유사한 도구에서 사용할 수있는 2.6 (2018-01-29) 에서 메모리 추적을 다시 구현했습니다 . 그냥 메모리 옵션을 선택해야합니다 :)

문서에서 :

Xdebug 2.6 이후로 프로파일 러는 사용중인 메모리 양과 메모리 사용량을 증가시킨 Gnd 메소드에 대한 정보도 수집합니다.

나는 파일 형식에 익숙하지 않지만 Qcachegrind가 몇 가지 메모리 문제를 추적하는 데 큰 도움이되었습니다.

qcachegrind 샘플


4
그리고 그들은 심지어 내 티켓을 사용했습니다. :)
JW.

Xdebug는 2.6 릴리스에서 PHP 5에 대한 지원을 중단했습니다.
powtac

누구에게나 도움이된다면 ... php-fpm을 사용할 때 pid는 다른 요청간에 변경되지 않을 수 있습니다. 기본 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"));

마지막으로 KCachegrind로callgrind.out 파일을 엽니 다.

Google gperftools 사용 (권장!)

먼저 https://code.google.com/p/gperftools/ 에서 최신 패키지를 다운로드하여 Google 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 는 아래와 같이 기존 브라우저 세션에 새 창을 만듭니다.

memprof 및 gperftools를 사용한 PHP 메모리 프로파일 링

Xhprof + Xhgui (내 의견으로는 CPU와 메모리를 모두 프로파일 링하는 것이 최고)

XhprofXhgui 그 문제 순간에 있다면 당신은뿐만 아니라하거나 메모리 사용량 CPU 사용량을 프로파일 링 할 수 있습니다. 매우 완벽한 솔루션이며 완전한 제어권을 제공하며 로그는 mongo 또는 파일 시스템 모두에서 작성할 수 있습니다.

자세한 내용 은 여기 내 대답을 참조하십시오 .

검은 화재

Blackfire는 Symfony2 사용자 인 SensioLabs의 PHP 프로파일 러입니다. https://blackfire.io/

puphpet 을 사용 하여 가상 머신을 설정하면 지원된다는 사실에 기뻐할 것입니다 ;-)


어떻게 작동하게 되었습니까? memprof_enable내 PHP 코드 에 넣으려고 시도했는데 PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). gperftools는 현재 소스 코드에서 설치했습니다.
Andrey Pokhilko 2016 년

php -icli 또는 a phpinfo()를 실행 하여 확장이 제대로로드되는지 확인합니다. 거기에 없으면 *.ini파일을 살펴볼 가치가 있습니다.
Francesco Casula 2016 년

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 )
{

이 파일을 755로 chmod하는 것을 잊지 마십시오.

메모리 프로필 파일 (* .xt)을 생성 할 때마다 자동으로 스크립트를 호출하는 루비 감시자 스크립트를 쉽게 생성 할 수 있습니다. 이렇게하면 명령을 반복해서 실행하지 않고도 계속해서 테스트하고 개선 사항을 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.