리눅스 php-fpm 최적화 – pm.max_children 개수 결정

,

서버에 문제가 반복됐고, 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을 참고하라.

👇 카테고리 글 목록

,

대표글

댓글 남기기