php-fpm 메모리 누수, 사용률 확인하기


현재상황
서버 메모리 16GB

php memory limit 기본 설정(128MB)
ㄴ)메모리 리밋은 말그대로 php에서 어떤 작업을 할 때 사용할 수 있는 최대 메모리양이다. 

(예를들어 php를 통해 파일을 업로드할경우 메모리에 먼저 적재가 되기 때문에 memory_limit 값보다 높은파일은 업로드가 안됨)

pm.max_children = 50
ㄴphp-fpm의 자식프로세스 최대 갯수

pm.start_servers = 5

ㄴphp-fpm 실행하면 처음부터 실행돼잇는 자식 프로세스 갯수

pm.min_spare_servers = 5

pm.max_spare_servers = 35

ㄴmin/max값을 벗어나면 서버에서 최대한 저 값을 맞추려고 노력함


엔진엑스-php-fpm 사용중

 ~]# netstat -nlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      6374/php-fpm: pool  

tcp        0      0 0.0.0.0:2221            0.0.0.0:*               LISTEN      3162/sshd           

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7420/nginx: master  



~]# sar -r | awk '{print $1"  "$5}'

12:00:01  %memused

12:10:02  48.52

12:20:01  49.46

12:30:01  50.59

12:40:01  51.56

12:50:01  52.74

중략

03:00:01  61.27

03:10:01  61.64

03:20:01  62.09

03:30:01  62.62

03:40:02  62.73

03:50:01  63.13

04:00:01  63.26

04:10:01  63.74

중략

09:10:01  78.38

09:20:01  78.95

09:30:01  79.87

09:40:01  80.27

09:50:01  81.05


[root@ ~]# ps -ef | grep php-fpm | wc -l

37


[root@ ~]# ps -aux | grep php-fpm | awk '{print $1"  " $6/1024" MB"}'

php-fpm  342.27 MB

php-fpm  340.383 MB

php-fpm  302.711 MB

php-fpm  284.441 MB

php-fpm  227.84 MB

php-fpm  227.137 MB

root  30.1016 MB

php-fpm  561.434 MB

php-fpm  562.66 MB

php-fpm  561.309 MB

php-fpm  561.824 MB

php-fpm  561.129 MB

php-fpm  561.129 MB

php-fpm  561.176 MB

php-fpm  562.145 MB

php-fpm  561.16 MB

php-fpm  558.332 MB

php-fpm  221.172 MB

php-fpm  213.012 MB

php-fpm  213.227 MB

php-fpm  212.008 MB

php-fpm  212.664 MB

php-fpm  212.996 MB

php-fpm  213.375 MB

php-fpm  207.363 MB

php-fpm  511.531 MB

php-fpm  509.504 MB

php-fpm  509.344 MB

root  0.953125 MB

php-fpm  182.289 MB

php-fpm  181.621 MB

php-fpm  181.457 MB

php-fpm  176.219 MB

php-fpm  175.359 MB

php-fpm  174.516 MB

php-fpm  172.77 MB

php-fpm  169.117 MB


]# php test.php

echo memory_get_usage(); 349976

echo memory_get_peak_usage(); 384968





현재상황은 위와같이

1.시간이 지날수록 메모리 점유율이 올라간다. 그러다 마지막에는 oom 발생
2.php-fpm 에서의 메모리 사용률이 너무 높다. 처음에는 100MB에서 200MB 300MB 지금처럼 500MB이상까지도 차다가 마지막에 oom 발생
3.php-fpm 자식프로세스의 갯수는 37개로 pm.max_children 수치에는 못미친다. 따라서 해당 설정의 수치를 변경한다해서 해결이되지 않는다. 

4.php 에서 사용한 최대 메모리가 1메가도 안된다. 

ㄴmemory_get_peak_usage(); 384968 바이트 단위임, 메가로 환산하면 0.4메가도 안됨


궁금한점

Q)1.php.ini 의 memory_limit 이랑 php-fpm.conf 의 memory_limit 설정은 같은거고 우선순위가 있는건가 ?? 아니면 다른개념인가 ?

A)같은개념이고 우선순위는 php-fpm.conf가 먼저.. 서버 / htaccess / 소스 순인것처럼 

해당 서버의 php에서 사용된 최대 메모리는 1메가도 안되니까 memory_limit은 튜닝할필요가 없는거고. 또 추가로 자잘자잘한 엄청 수많은 작업이 종료되지않고 계속 사용하고 있따고 봐야할듯


2.php-fpm의 자식프로세스가 사용하는 memory limit은 설정이 없나 ? 


3.php-fpm의 자식프로세스들은 어떡하다가 500MB 이상씩의 메모리를 사용하게 됐지 ? 이걸 확인하는 방법은 ?(누수인지 아닌지 확인하고싶다.)

ㄴphp-fpm 자식프로세스들의 PID를 엔진엑스 어세스 로그에 남겨보는방법 ?

ㄴ아니면 php-fpm status 볼 수 있는 툴이 있나 ?






이제부터 지금 상황이 정말 메모리 누수가 맞는지. 맞다면 왜 누수가 일어나는지 알아보자.

1.netstat -an | grep -v TIME_WAIT 했을 때 수상한거 없이 소켓잘 닫히고 있음.

2.keep alive 65로 설정돼있음



으악 생각보다 너무 쉽게 원인을 찾은것같다.
https://xetown.com/tips/1171902

php-fpm 자체가 기본설정시 메모리 사용 누적이랜다...;; 

나는 소스단에서 뭔가 잘못짜여져 있어서 메모리 누수가 있는줄알았는데.. 


일단 php-fpm 아무설정도 안하면 pm.max_requests 값은 무한대라서 메모리 누수가 계속 쌓이다. 따라서 pm.max_requests 500 으로 설정해주고 한번 지켜보자.


'job > linux' 카테고리의 다른 글

ionice  (1) 2019.04.09
strace debug  (0) 2019.02.21
geoip iptables 설치  (2) 2019.02.15
rsync를 통한 파일 전송시 속도 테스트  (0) 2018.12.06
hpssacli 설치했는데 잘 안됨  (1) 2018.12.05

+ Recent posts