서버에 문제가 반복됐고, php-fpm log에서 아래 같은 메시지를 발견했다. pm.max_children
을 늘려야 했다.
[19-Dec-2017 11:51:48] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 11 total children
[19-Dec-2017 11:51:49] WARNING: [pool www] server reached pm.max_children setting (12), consider raising it
php-fpm 평균 메모리 사용량
우선 php-fpm 평균 메모리 사용량을 재 보자. ps_mem을 사용하는 것이 가장 편하다.
Private + Shared = RAM used Program
(...)
49.4 MiB + 7.1 MiB = 56.5 MiB apache2 (5)
86.7 MiB + 1.6 MiB = 88.2 MiB fail2ban-server
249.6 MiB + 10.0 MiB = 259.6 MiB php7.4 (5)
582.4 MiB + 434.5 KiB = 582.9 MiB mysqld
596.8 MiB + 60.1 MiB = 656.9 MiB php-fpm7.4 (21)
---------------------------------
1.7 GiB
=================================
php-fpm7.4 프로세스는 21개고 656MiB(MiB는 1024 단위를 사용하는 MB다)를 사용하고 있다. 개별 프로세스는 약 31MiB를 사용한다.
시스템에 따라 php-fpm7.
4에서 7.4는 자신의 PHP 버전으로 변경해서 사용해야 한다.
프리 메모리 사이즈
프리 메모리 사이즈를 재 봤다(free -h
). 300MB 여유 있는 것으로 나왔다.
조처
300을 31로 나누면 9.6774193548이다. 약간의 여유는 두는 게 나을 테니, +6을 하기로 했다.
php-fpm의 프로세스 개수 설정은 우분투의 경우 /etc/php/7.4/fpm/pool.d/www.conf
에서 한다.
원래 12였으니 pm.max_children = 18
로 설정했다.
주의: 메모리와 함께 CPU도 고려해야
메모리가 넉넉하다고 무작정 개수를 늘리는 건 좋은 방법이 아니다. 프로세스는 그만큼 CPU를 잡아먹기 때문이다. 내 경우 AWS의 t4g.large 인스턴스(micro, small, medium, large니까 뒤에서 4번째)에서 라라벨을 돌리면서 pm.max_children
을 60으로 설정했더니 CPU가 100%가 되면서 서버가 느려졌다. 다시 pm.max_children
을 20으로 낮추니까 같은 트래픽인데도 훨씬 빠르게 작동했다.
pm = static
pm = static
으로 설정했다. 참고한 글은 PHP-FPM tuning: Using ‘pm static’ for max performance다. 성능 차원에서만 보면, 늘상 프로세스를 띄워 두는 게 가장 좋다는 내용이다.
기타: ps_mem 없이 메모리 사용량 파악하기
php-fpm의 메모리 사용량 파악하기
ps --no-headers -o "rss,cmd" -C php-fpm7.0 | awk '{ sum+=$1 } END { printf ("%d%sn", sum/NR/1024,"M") }'
명령어 옵션들을 살펴 보자.
--no-headers
: 프로세스 리스트를 볼 때 제목 행은 출력하지 않는다.-o "rss,cmd"
: rss와 cmd 항목만 출력한다. rss는 물리적 메모리 사이즈(resident set size)를 의미한다(man ps에서 찾아 보면 이렇게 설명돼 있다: “resident set size, the non-swapped physical memory that a task has used (in kiloBytes)). cmd는 명령어를 뜻한다.-C php-fpm7.0
: 커맨드가php-fpm7.0
인 것만 출력한다.
awk
는… 생략한다. 메모리 사이즈 평균 MB를 구하는 부분이다.
nginx의 메모리 사용량 파악하기
ps --no-headers -o "rss,cmd" -C nginx | awk '{ sum+=$1 } END { printf ("%d%sn", sum/NR/1024,"M") }'
apache2의 메모리 사용량 파악하기
ps --no-headers -o "rss,cmd" -C apache2 | awk '{ sum+=$1 } END { printf ("%d%sn", sum/NR/1024,"M") }'
mysqld의 메모리 사용량 파악하기
ps --no-headers -o "rss,cmd" -C mysqld | awk '{ sum+=$1 } END { printf ("%d%sn", sum/NR/1024,"M") }'
관련해 자세한 튜닝 방법을 알고 싶다면 Setting MaxClients in Apache/prefork MPM을 참고하라.
댓글 남기기