워드프레스(httpd+php+mysql) 서버 지속적인 메모리 감소 이슈
증상
- free memory가 지속적으로 하락
상세
httpd
- concurrent connection 지속적인 증가
- prefork로 운영 중. httpd 프로세스 지속적인 증가 관찰됨
- 유저가 페이지를 나가면 줄었다가 신규 접속이 들어오면 늘었다 해야할 것 같은데 왜 지속적으로 증가할까?
단기 해결
httpd 재시작
명령 : systemctl restart httpd
확인 :
재시작 후 동시접속 수 정리되며 free memory 확보됨
하지만 바로 원래 증상 재현되며 지속적으로 httpd 프로세스 및 메모리 사용량 증가 확인됨
설정 검토
mpm
<IfModule mpm_prefork_module>StartServers 5MaxClients 1024MinSpareServers 75MaxSpareServers 250ServerLimit 4096MaxRequestWorkers 4096MaxConnectionsPerChild 0MaxKeepAliveRequests 0MaxRequestsPerChild 0KeepAliveTimeout 2</IfModule>
문제가 발생하는 경우의 mpm관련 설정이다.
MaxConnectionsPerChild와 MaxRequestPerChild
이슈가 발생한 것으로 보이는 설정은 "MaxConnectionsPerChild와 MaxRequestPerChild"(http://httpd.apache.org/docs/2.4/mod/mpm_common.html#MaxConnectionsPerChild)이다.
MaxConnectionsPerChild는 2.3.9에서 처음 등장한 directive로 이전 버전의 MaxRequestsPerChild와 동일한(유사한?) 표현이다. 이름처럼 MaxConnectionsPerChild는 fork된 차일드 httpd 프로세스당 연결 수에 대한 설정이고 이전 버전에서 사용되는 MaxRequestsPerChild는 fork된 차일드 httpd 프로세스당 요청수에 대한 설정이다. 현재 2.4.6기준의 httpd에서 이상한 점은 두 설정이 동시에 사용되고 있다는 점이다. MaxRequestsPerChild는 차일드(httpd 프로세스)하나당 요청 처리 수로 저 수치만큼 처리하면 fork된 httpd를 날리고 새로운 httpd 프로세스가 요청을 처리하는 방식이다. 해당 값의 기본 설정은 2.0에서는 0, 2.2에서는 10000이며 사용 중인 2.4에서는 해당 directive를 지원하지만 기본 설정에서는 해당 directive가 삭제된체 제공되고 있다.
이슈가 발생한 서버의 경우 2.4버전인데 MaxRequestPerChild가 0으로 강제 설정되어 있었는데 튜닝관련 글을 보면 하루 요청에 대한 평균 값 정도를 권장 한다고 한다.
우선 해당 값을 기본값으로 주석처리하였다.