메모리 누수란 프로그램 실행 중에 메모리가 적용되었다가 사용이 완료된 후에도 제때 해제되지 않는 현상을 말하며, 실행 시간이 짧은 일반 프로그램의 경우 문제가 그다지 명확하지 않을 수 있지만, 장기 실행 프로그램 예를 들어 웹 서버, 백그라운드 프로세스 등에 대해 더 분명합니다. 시스템이 차지하는 메모리는 시스템이 실행됨에 따라 계속 증가하며 과도한 메모리 사용으로 인해 충돌이 발생하거나 시스템에 의해 종료될 수 있습니다. (OOM).
PHP의 메모리 누수
PHP는 언어 수준에서 메모리에 대한 개념이 없으므로 사용 중에 메모리 누수에 대한 개념이 없습니다. PHP 사용자 코드 수준.
PHP 프로그램에 메모리 누수가 있거나 큰 변수가 제때 해제되지 않으면 타사 확장 프로그램 자체의 구현에 문제가 있는 것입니다.
다음은 nginx+php-fpm 모드의 작동 원리에 대한 간략한 소개입니다:
nginx 서버는 n 하위 프로세스(작업자)를 포크하고 php-fpm 관리자는 포크 n개의 하위 프로세스를 생성합니다.
사용자 요청이 있으면 nginx의 작업자가 요청을 받아 소켓에 던집니다.
php-fpm 유휴 하위 프로세스는 소켓의 요청을 수신하고 요청을 수신 및 처리합니다.
여기서 저는 세 번째 단계에 집중하고 싶습니다. 세 번째 단계에는 php-fpm 프로세스 수명주기가 포함됩니다. php-fpm의 수명 주기는 대략 다음과 같습니다. 모듈 초기화(MINIT) -> 요청 처리(RSHUTDOWN) -> 모듈 활성화(RINIT) 요청 처리 -> 모듈 비활성화(RSHUTDOWN)....... 모듈 활성화(RINIT) -> 모듈 비활성화(RSHUTDOWN) -> php-fpm 프로세스의 수명 주기에는 여러 모듈 활성화(RINIT) -> 요청 처리 -> 모듈 비활성화(RSHUTDOWN) 프로세스가 있습니다. 이 "요청 처리"의 일반적인 프로세스는 다음과 같습니다. PHP는 해당 PHP 파일을 읽고, 이에 대한 어휘 분석을 수행하고, opcode를 생성하고, zend 가상 머신이 opcode를 실행합니다.
PHP 구성 파일의 memory_limit는 실제로 이 "요청 처리"에 대한 메모리만 제한합니다. 따라서 이 매개변수는 php-fpm 프로세스가 차지하는 메모리와는 아무런 관련이 없습니다.
그렇다면 이 문제를 예방할 수 있는 방법은 없을까요?
php-fpm.conf에는 pm.max_requests 매개변수가 있는데, 이는 PHP_FCGI_MAX_REQUESTS와 동일합니다. 이 값은 fpm 프로세스가 자동으로 종료되고 새 프로세스가 시작되기 전에 처리하는 요청 수를 의미합니다.
메모리 누수 디버깅 및 도구
메모리 누수 프로그램은 일반적으로 쉽게 찾을 수 있습니다. 메모리 사용량이 지속적으로 증가하면서 증상이 나타나기 때문입니다. 메모리 누수의 원인을 파악해야 합니다. 이때 추적을 돕는 일부 도구의 도움으로 PHP 내장 메모리 누수 감지 및 valgrind 메모리 누수 분석이라는 두 가지 도구를 사용할 수 있습니다.
관련 권장 사항:
JavaScript 메모리 누수를 처리하는 방법에 대한 예 공유
PHP 커널 - 메모리 누수 및 새로운 가비지 수집 메커니즘에 대한 그래픽 소개
메모리 누수란 무엇이며 원인 및 예방은 무엇입니까? 메모리 누수?
위 내용은 PHP 메모리 누수에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!