php-memprof는 메모리 누수의 원인을 찾는 데 사용할 수 있는 빠르고 정확한 PHP용 메모리 프로파일링 확장입니다.
확장 프로그램은 메모리 블록의 할당 및 해제를 추적하여 프로그램의 모든 함수, 메서드 또는 파일에 의해 누수된 메모리 양을 보고합니다.
프로그램의 임의 지점에서 해제되지 않은 메모리를 보고합니다.
callgrind, pprof 또는 원시 배열 형식으로 프로필을 덤프합니다.
네이티브 malloc뿐만 아니라 PHP 자체에서 할당된 메모리를 추적할 수 있습니다.
php-memprof는 libjudy와 sys/queue.h에 의존합니다.
Debian 기반 배포판에서는 다음을 사용하여 종속성을 설치할 수 있습니다.
# Debian or Ubuntu: apt install libjudy-dev
알파인에서:
# Alpine apk add judy-dev bsd-compat-headers
MacOS의 경우:
# install libjudy dependency: brew install traildb/judy/judy
종속성을 설치했는지 확인한 후 다음을 수행하십시오.
pecl install memprof
MacOS: JUDY_DIR=$(brew --prefix traildb/judy/judy) pecl install memprof
참고 libjudy가 비표준 경로(/usr, /usr/local 아님)에 설치되어 있는 경우에는 아래의 수동 설치 방법을 이용하시기 바랍니다.
종속성을 설치했는지 확인한 후 다음을 수행하십시오.
소스를 다운로드하고 소스 디렉터리에서 다음 명령을 실행합니다.
phpize ./configure make make install
참고 libjudy가 비표준 경로(/usr 또는 /usr/local 아님)에 설치된 경우 다음과 같이 지정할 수 있습니다.
./configure --with-judy-dir=/opt/homebrew/Cellar/judy/1.0.5
Arch Linux 사용자는 makepkg
또는 선호하는 AUR 도우미를 사용하여 비공식 php-memprof 패키지를 설치하는 것을 선호할 수 있습니다. 예를 들어 yay
사용하는 경우:
yay -S php-memprof
AUR 페이지에서 이 패키지와 관련된 문제를 보고하십시오.
확장은 하나의 스크립트에 대해서만 명령줄에서 로드할 수 있습니다.
php -dextension=memprof.so script.php
또는 php.ini에서 영구적으로:
extension=memprof.so
확장 프로그램은 프로파일링하지 않을 때 오버헤드가 없으므로 개발 환경에서 기본적으로 로드될 수 있습니다.
memprof
사용하는 가장 간단한 방법은 프로그램의 메모리 제한이 초과될 때 메모리 프로필을 저장하도록 하는 것입니다.
dump_on_limit
모드에서 프로파일링 활성화 다음 중 하나에 해당하면 요청 시작 시 dump_on_limit
모드의 프로파일링이 활성화됩니다.
환경 변수 MEMPROF_PROFILE
은 dump_on_limit
와 같습니다.
$_GET["MEMPROF_PROFILE"]
은 dump_on_limit
와 같습니다.
$_POST["MEMPROF_PROFILE"]
은 dump_on_limit
와 같습니다.
명령줄 스크립트의 경우 환경 변수를 설정할 수 있습니다.
MEMPROF_PROFILE=dump_on_limit php test.php
웹 스크립트의 경우 $_GET
변수를 설정할 수 있습니다.
curl http://127.0.0.1/test.php?MEMPROF_PROFILE=dump_on_limit
또는 $_POST
변수:
curl -d MEMPROF_PROFILE=dump_on_limit http://127.0.0.1/test.php
참고
memprof_enabled_flags()
함수를 호출하여 현재dump_on_limit
모드에서 프로파일링이 활성화되어 있는지 확인할 수 있습니다.
이 모드에서 memprof
프로그램이 메모리 제한을 초과하면 자동으로 프로필을 저장합니다(PHP가 Fatal error: Allowed memory size of 15728640 bytes exhausted (tried to allocate 1024 bytes)
오류와 같은 오류를 발생시키는 경우).
기본적으로 프로필은 /tmp
또는 C:WindowsTemp
에 memprof.callgrind.*
라는 파일에 저장됩니다.
결과를 시각화하는 권장 방법은 Kcachegrind(Linux) 또는 Qcachegrind(MacOS, Windows)를 사용하는 것입니다. Google Perftools도 지원됩니다. memprof_dump_callgrind()
및 변형 문서를 참조하세요.
대부분의 배포판에는 설치할 준비가 된 kcachegrind
패키지가 있습니다.
예를 들어 Ubuntu 또는 Debian은 다음과 같습니다.
sudo apt install kcachegrind
다른 배포판에도 설치할 수 있는 패키지가 있을 가능성이 높습니다.
홈브루 사용: https://formulae.brew.sh/formula/qcachegrind
https://sourceforge.net/projects/qcachegrindwin/에서 다운로드하세요.
다음 중 하나에 해당하면 요청 시작 시 프로파일링이 활성화됩니다.
환경 변수 MEMPROF_PROFILE
이 비어 있지 않습니다.
$_GET["MEMPROF_PROFILE"]
비어 있지 않습니다.
$_POST["MEMPROF_PROFILE"]
이 비어 있지 않습니다.
MEMPROF_PROFILE
변수는 쉼표로 구분된 플래그 목록을 허용합니다.
유효한 MEMPROF_PROFILE
값의 예:
1
: 비어 있지 않음: 프로파일링이 활성화되었습니다.
dump_on_limit
: 프로파일링이 활성화되어 메모리 제한에 따라 덤프됩니다.
native
: 프로파일링이 활성화되어 기본 할당을 프로파일링합니다.
dump_on_limit,native
: 프로파일링이 활성화되고 기본 할당을 프로파일링하며 메모리 제한에 따라 덤프됩니다.
유효한 플래그 목록:
dump_on_limit
: /tmp
또는 C:WindowsTemp
에서 callgrind 형식으로 프로필을 덤프합니다. 출력 디렉터리는 memprof.output_dir
ini 설정으로 변경할 수 있습니다.
native
: PHP뿐만 아니라 네이티브 malloc()
할당도 프로파일링합니다(이것은 스레드로부터 안전하지 않습니다. 아래 참조).
Memprof는 기본적으로 기본 할당을 추적하지 않지만 MEMPROF_PROFILE
native
으로 설정하여 활성화할 수 있습니다.
기본 할당은 PHP 자체 메모리 할당자 외부에서 수행되는 할당입니다. 일반적으로 libxml2(DOM 확장에 사용됨)와 같은 외부 라이브러리는 기본 할당을 수행합니다. PHP는 영구 리소스에 대한 기본 할당도 수행할 수 있습니다.
기본 할당 추적을 활성화하면 PHP 자체 할당 외에도 이러한 할당이 프로파일링됩니다.
기본 추적이 활성화되면 기본 후크가 스레드로부터 안전하지 않기 때문에 기본 라이브러리가 스레드를 사용하는 경우 프로그램이 중단됩니다.
출력 파일 형식은 memprof.output_format
ini 설정으로 정의됩니다. 옵션은 다음과 같습니다:
callgrind
(기본값)
pprof
참고 : #101부터 확장이 소스에서 빌드된 경우(pecl로 설치되지 않은 경우)에만 사용할 수 있습니다.
메모리 프로파일링이 현재 활성화되어 있는지 여부를 반환합니다(위 참조).
메모리 프로파일링과 어떤 프로파일링 기능이 활성화되었는지 여부를 반환합니다(위 참조).
현재 프로필을 callgrind 형식으로 덤프합니다. 결과는 KCacheGrind 또는 QCacheGrind와 같은 도구를 사용하여 시각화할 수 있습니다.
<phpmemprof_dump_callgrind(fopen("output", "w"));
다음은 QcacheGrind 스크린샷입니다:
현재 프로필을 pprof 형식으로 덤프합니다.
<?phpmemprof_dump_pprof(fopen("profile.heap", "w"));
파일은 google-perftools의 pprof
도구를 사용하여 시각화할 수 있습니다. (설치 지침은 아래를 참조하세요.)
웹 브라우저나 gv
에 주석이 달린 호출 그래프를 표시합니다.
$ pprof --web profile.heap $ # or: $ pprof --gv profile.heap
함수당 한 줄을 출력하고, 자체 메모리 사용량에 따라 정렬합니다.
$ pprof --text profile.heap
pprof
설치 지침: 우분투: apt install google-perftools
. Ubuntu에서는 도구 이름이 google-pprof
이므로 위 예에서는 pprof
google-pprof
로 바꿔야 합니다.
현재 프로필을 나타내는 배열을 반환합니다.
<php$dump = memprof_dump_array();
어레이는 다음 정보를 공개합니다.
함수에 의해 누수된 포함 및 배타적 메모리(memprof_dump_array가 호출될 때 아직 해제되지 않은 메모리만 계산)
함수의 포함 및 배타적 블록 수(할당 수, memprof_dump_array 호출 시 아직 해제되지 않은 블록만 계산)
데이터는 호출 스택에 표시됩니다. 이렇게 하면 함수가 여러 위치에서 호출되는 경우 어떤 호출 경로로 인해 가장 많은 메모리 누수가 발생했는지 확인할 수 있습니다.
Array ( [memory_size] => 11578 [blocks_count] => 236 [memory_size_inclusive] => 10497691 [blocks_count_inclusive] => 244 [calls] => 1 [called_functions] => Array ( [main] => Array ( [memory_size] => 288 [blocks_count] => 3 [memory_size_inclusive] => 10486113 [blocks_count_inclusive] => 8 [calls] => 1 [called_functions] => Array ( [a] => Array ( [memory_size] => 4 [blocks_count] => 1 [memory_size_inclusive] => 10485825 [blocks_count_inclusive] => 5 [calls] => 1 [called_functions] => Array ( [b] => Array ( [memory_size] => 10485821 [blocks_count] => 4 [memory_size_inclusive] => 10485821 [blocks_count_inclusive] => 4 [calls] => 1 [called_functions] => Array ( [str_repeat] => Array ( [memory_size] => 0 [blocks_count] => 0 [memory_size_inclusive] => 0 [blocks_count_inclusive] => 0 [calls] => 1 [called_functions] => Array ( ) ) ) ) ) ) [memprof_dump_array] => Array ( [memory_size] => 0 [blocks_count] => 0 [memory_size_inclusive] => 0 [blocks_count_inclusive] => 0 [calls] => 1 [called_functions] => Array ( ) ) ) ) ) )
확장 버전을 문자열로 반환합니다. 버전은 version_compare()를 통해 비교할 수 있습니다.
확장 프로그램은 xdebug, blackfire 또는 기타 확장 프로그램과 충돌할 수 있습니다. 만약 그런 경우라면 신고해 주세요.
현재 브랜치는 PHP 7.1부터 PHP 8까지 지원합니다.
php5 브랜치는 PHP 5를 지원합니다.
INTERNALS.md를 참조하세요.