[php] PHP 메모리 프로파일 링

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

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

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

다른 건 없나요?



답변

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

문서에서 :

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

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

qcachegrind 샘플


답변

아시다시피 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 을 사용 하여 가상 머신을 설정하면 지원된다는 사실에 기뻐할 것입니다 😉


답변

글쎄, 이것은 정확히 당신이 찾고있는 것이 아닐 수도 있지만 PHP에는 메모리 사용량을 출력하는 몇 가지 기능이 내장되어 있습니다. 함수 호출이 얼마나 많은 메모리를 사용하고 있는지 알고 싶다면 호출 전후에 memory_get_peak_usage () 를 사용 하여 차이를 얻을 수 있습니다.

매우 유사한 memory_get_usage ()를 사용하여 데이터에 대해 동일한 기술을 사용합니다 .

매우 정교하지 않은 접근 방식이지만 코드 조각을 확인하는 빠른 방법입니다. 나는 xdebug mem deltas가 너무 장황해서 가끔 유용하지 않을 수 있다는 데 동의한다. 그래서 나는 종종 그것을 코드 섹션으로 좁히기 위해 사용하고 작은 조각에 대한 특정 메모리 사용량을 수동으로 덤프한다.


답변

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)을 생성 할 때마다 자동으로 스크립트를 호출하는 루비 감시자 스크립트를 쉽게 생성 할 수 있습니다. 이렇게하면 명령을 반복해서 실행하지 않고도 계속해서 테스트하고 개선 사항을 확인할 수 있습니다.


답변