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 |