Q: 프로세스의 Apache.exe 하나가 수백 메가바이트의 메모리를 차지하고, 서버가 며칠 동안 계속해서 실행되거나 액세스 피크 이후에도 줄어들지 않는 이유는 무엇입니까?
답변: 메모장으로 apache2confhttpd.conf를 열고 MaxRequestsPerChild를 검색한 후 MaxRequestsPerChild 0을 MaxRequestsPerChild 50으로 변경합니다.
일반적으로 "Windows 작업 관리자 - 프로세스"에서 두 개의 apache.exe 프로세스를 볼 수 있습니다. 하나는 상위 프로세스이고 다른 하나는 하위 프로세스입니다. 상위 프로세스가 액세스 요청을 받은 후 요청을 전달합니다. 자식 프로세스가 처리합니다. MaxRequestsPerChild 이 지시문은 독립 하위 프로세스가 처리할 수 있는 요청 수를 설정합니다. "MaxRequestsPerChild number" 요청을 처리한 후 상위 프로세스에 의해 하위 프로세스가 종료됩니다. 이때 하위 프로세스가 차지한 메모리는 해제됩니다. 다른 액세스 요청이 있으면 상위 프로세스가 하위 프로세스를 다시 생성합니다. 처리 과정.
MaxRequestsPerChild가 기본적으로 0(무한) 또는 더 큰 숫자(예: 10,000 이상)로 설정되면 각 하위 프로세스는 더 많은 요청을 처리할 수 있으며, 하위 프로세스의 지속적인 종료 및 시작으로 인해 액세스 효율성이 떨어지지 않습니다. 단, MaxRequestsPerChild 설정이 0일 경우 200~300M의 메모리를 점유하면 부하를 줄여도 점유하는 메모리는 줄어들지 않습니다. 메모리가 더 큰 서버는 0 이상의 숫자로 설정할 수 있습니다. 메모리가 더 작은 서버는 메모리 오버플로를 방지하기 위해 30, 50, 100으로 설정하는 것이 좋습니다
========================== === =========================================
아파치 메모리 사용법
아파치 프로세스는 메모리를 사용할 때 "점진적으로 커집니다". 즉, 프로세스가 종료될 때까지 사용되는 메모리 양은 줄어들지 않고 계속 증가합니다. 이 경우 Apache 프로세스에서 사용하는 메모리 양은 애플리케이션에서 사용하는 최대 메모리 양에 따라 달라집니다.
keepalive 매개변수
KeepAliveTimeout 이 매개변수는 http 프로세스가 아무것도 하지 않을 때까지 기다릴 수 있는 시간을 결정합니다. keepalive가 on으로 설정되고 keepalivetimeout이 상대적으로 큰 숫자로 설정되면 Apache가 차지하는 메모리가 매우 빠르게 증가할 것이라고 상상해 보십시오. 이는 Apache 프로세스가 작업을 완료한 후(그리고 특정 메모리 사용량에 도달한 후("프로그레시브" 모드를 생각함)) 즉시 종료되지 않고 keepalivetimeout을 기다리기 때문입니다. 사용자 연결 요청이 계속 도착한다고 가정하면 쓸모없는 Apache 프로세스가 상당히 많이 축적될 것이며 이러한 프로세스는 시간 초과까지 종료되지 않습니다.
이 매개변수는 Apache 프로세스가 처리한 요청 수를 처리한 후 처리 중 메모리 문제를 방지하기 위해 종료했다가 다시 시작해야 함을 의미합니다.
PHP 스크립트의 경우 프로그램에서 사용하는 메모리의 지속적인 증가로 인해 Apache에 대한 부담을 피하기 위해 이 매개변수를 더 작게 설정하는 것이 좋습니다. 실행되면 사용된 리소스(메모리)만 자동으로 해제됩니다.
예를 들어 50으로 설정해 볼까요? 너무 작으면 Apache 프로세스를 재생성해도 리소스가 소모됩니다. 이는 균형 문제입니다.
위 내용은 아파치 메모리 출시 내용입니다~. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!