[server] Apache와 PHP로 메모리 누수를 조사하는 방법?

재무 모델링을 수행하는 무거운 Drupal 웹 사이트를 운영하고 있습니다. 우리는 아파치 프로세스가 안정적으로 유지되는 동안 아파치가 사용하는 초과 근무 메모리가 증가한다는 사실을 감안할 때 일종의 메모리 누수가 발생하는 것으로 보입니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

메모리 문제가 발생할 때마다 /etc/init.d/httpd reload메모리 사용량이 감소 할 때마다 아파치 / PHP에서 메모리 문제가 발생한다는 것을 알고 있습니다 (위 스크린 샷 및 CLI 출력 아래 참조).

httpd 다시로드하기 전에

$ 무료
             캐시 된 총 사용 가능한 공유 버퍼
멤 : 49447692 45926468 3521224 0191100 22609728
-/ + 버퍼 / 캐시 : 23125640 26322052
스왑 : 2097144 536552 1560592

httpd 다시로드 후

$ 무료
             캐시 된 총 사용 가능한 공유 버퍼
멤 : 49447692 28905752 20541940 0191360 22598428
-/ + 버퍼 / 캐시 : 6115964 43331728
스왑 : 2097144 536552 1560592

각 아파치 스레드 memory_limit에는 512MB 의 PHP가 할당되며, 이는 높은 메모리 사용량으로 인해 적은 양의 요청을 정의하고 max_execution_time120 초 동안 실행되는 데 시간이 오래 걸리는 스레드를 종료해야하므로 메모리 사용량의 지속적인 증가를 막아야합니다. 봄.

Q :이 메모리 누수의 원인을 어떻게 조사 할 수 있습니까?

이상적으로 개발자 팀을 방해하지 않고 시스템에서 수행 할 수있는 문제 해결 단계를 찾고 있습니다.

추가 정보:

OS: RHEL 5.6
PHP: 5.3
Drupal: 6.x
MySQL: 5.6

참고로 우리는 우리가 별도로 조사하고있는 스와핑 문제를 알고 있으며 스와핑이 시작되기 전에 관찰 한 메모리 누수와 관련이 없습니다.



답변

우리는 /etc/init.d/httpd를 다시로드 할 때마다 메모리 사용량이 떨어지기 때문에 아파치 / PHP에서 메모리 문제가 발생한다는 것을 알고 있습니다.

아니요. 웹 트래픽과 관련이 있다는 의미입니다. 웹 서버의 데이터를 관리하는 상자에서 mysql을 실행하고 있음을 언급했습니다. 여기서도 쉽게 범인이 될 수 있습니다. 당신이 언급하지 않은 다른 서비스가 웹 스택에서 사용할 수있는 것처럼.

각 아파치 스레드에는 512MB의 PHP memory_limit가 할당됩니다.

아닙니다. 평균 7 개의 서버와 최대 25 개의 사용중인 서버를보고하지만 메모리 그래프에는 약 25Gb의 델타가 표시됩니다.

실제로 기본 HTTP 튜닝으로 다시 시작해야합니다-256 개의 일정한 httpds를 실행하는 것처럼 보이지만 최대 사용량은 25입니다. 이것은 단순한 바보입니다.

실행 시간이 오래 걸리는 스레드를 종료해야하는 max_execution_time (120 초)

아니오-실행 스레드가 PHP 인터프리터 내에있는 경우에만-PHP가 차단 된 경우가 아닙니다.

재무 모델링을 수행하는

(한숨)

Apache, 스레드 또는 프리 포크 구성 방법, 버전, PHP 호출 방법 (모듈, cgi, fastcgi), 영구 연결 사용 여부, 저장 프로 시저 사용 여부에 대한 세부 정보를 제공하면 도움이 될 것입니다.

mysql을 별도의 컴퓨터로 옮기고 영구 연결 사용을 중단하는 것이 좋습니다 (현재 사용중인 경우). 메모리 제한을 훨씬 더 낮게 설정하고 이를 스크립트별로 재정의하십시오. 순환 참조 가비지 콜렉터가 설치 및 구성되어 있는지 확인하십시오.


답변

아마 지금까지 문제를 해결했을 것입니다. 서버가 스왑 / 스 래싱되는 것을 막기 위해 임시로 나는 cron에서 매 시간마다 다음 명령을 실행합니다.

#!/bin/sh
sync; echo 3 > /proc/sys/vm/drop_caches

나는 이것이 해결책이라고 말하지 않고 메모리 누수의 실제 원인을 조사 할 때 일을 계속 유지하고 다운 팀을 최소화하는 방법입니다.

자세한 내용은 여기를 참조하십시오.

http://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/


답변

분명히 이것은 PHP가 작동하는 방식입니다-객체를 할당하는 곳에서 긴 루프를 수행하고 참조를 통해 객체를 전달하는지 알고있는 사람은 처리하는 유일한 방법은 각 PHP 프로세스에 대해 N 요청을 따르는 것입니다. 중지합니다. PHP를 CGI로 실행하면 모든 요청이 다시 생성되므로 메모리 누출이 없으며 성능 저하가 그리 크지 않을 수 있습니다. fast-cgi를 실행할 수도 있습니다. 예를 들어, 1000 개의 요청마다 php-fcgi 프로세스가 종료되고 메모리가 해제됩니다. 다시 메모리 누수가 없습니다. PHP를 mod_php 모듈로 실행하는 경우 httpd.conf에서 maxrequests를 설정하여 도움이되는지 확인할 수 있습니다. 예를 들어 10을 설정하려고합니다. 작동한다면 성능 저하가 크지 않지만 메모리 누수가 없어야합니다.


답변

전역 php.ini 파일의 메모리를 확인하십시오. 단순히 1G 등의 가치를 깎지 말고 로컬 php.ini를 해당 서버에 가져 와서 전체 서버에 영향을 미치지 않는 것이 좋습니다. 일반적으로 대부분의 계정에 충분하기 때문에 전역 php.ini 제한을 약 64M으로 설정하는 것이 좋습니다.

아파치 설정도 확인하십시오


답변