정보&강의 32기가 램을 부착한 서버 mariadb, nginx, php-fpm 설정하기
- 운영자
- 847
- 0
첨부 3
Nignx, MariaDB, PHP-FPM, PHP 를 이용한 서버 운영시, PHP-FPM에서 child process가 부족하여 lock이 걸리는다는 에러가 발생하였고, 이를 해결하기 위해 일단 물리적인 서버램을 32기가로 상향하였습니다..
서버 로그에 아래와 같은 메시지가 뜹니다.
[26-Mar-2015 10:10:04] WARNING: [pool www] server reached pm.max_children setting (35), consider raising it [26-Mar-2015 12:04:52] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)
centos7서버이며, php7.2가 설치되어 있는 상태입니다.
php-fpm의 conf 파일을 보면, 아래와 같은 구성이 있습니다.
각 항목에 적절한 수치를 찾는 것이 관건입니다.
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 35
일단 현재 각 process가 얼마나 메모리를 소모하고 있는지를 확인할 필요가 있습니다.
아래 명령어로 찾아봅니다.
#ps -ylC php-fpm --sort:rss
RSS의 각항목의 평균값을 보면 알 수 있습니다. 약 60~70메가가 소모됩니다. 뭐가 많네요. ㅎㅎ
더 자세히 편하게 찾아보는 방법은 아래와 같습니다.
#ps --no-headers -o "rss,cmd" -C php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"Mb") }'
62M가 나왔네요.
저는 32기가의 메모리를 갖추고 있고, 여기에 mysql DB에서 16기가를 사용하고 있습니다.
그럼 32-16=16기가가 되겠네요.
php-fpm에서 사용할 수 있는 메모리가 16기가가 됩니다.
만일 계산이 힘들면 아래 명령어로 쉽게 알아 볼 수 있습니다.
#free -h
23기가가 free한 상태로 있습니다.
저는 그냥 16기가로 php-fpm에 할당하려고 합니다.
평균 62M를 사용하는 processor를 기준으로 pm.max_children은 16000MB / 63MB = 254 로 계산이 됩니다.
즉 총 254개의 php-fpm processor를 띄울 수 있게 되겠네요.
그럼 다음과 같이 설정을 할 수 있겠습니다.
pm.max_children = 254 //동시 사용할수 있는 최대 프로세스 수
pm.start_servers = 75 //처음 시작할 때
pm.min_spare_servers = 50 //최소 사용값
pm.max_sapre_servers = 125 //최대 사용값 (이 수가 넘어가면 프로세스 삭제)
최대 여유 메모리로 php-fpm을 사용할 수 있는 공식이 나왔습니다.
하지만, 최대로 사용할 수 있다고 해서 이걸 다 쓰면 서버가 항상 북적거리가 될 겁니다.
딱 기본 메모리만 가지고 있는 254개의 프로세서가 얼마나 빨리 주어진 요청을 해결할 수 있을까요.
63메가로 책정된 메모리값은 각 프로세서들이 아주 기본적인 작업을 할 때 사용하는 메모리용량입니다.
작업내용이 많은 요청이 주어진다면, php-fpm의 순간적인 메모리 사용량이 급격히 늘어날 수도 있기 때문에 최대 프로세스 값을 줄여서 적은 수의 프로세서가 넉넉한 메모리용량을 가지고 여유있게 사용할 수 있어야 더 안전하겠죠.
일 못하는 254개의 프로세서를 늘리는 것 보다, 일 잘하는 적은 프로세서 값을 찾아야 합니다.
각 프로세스당 63메가를 책정한 수치를 좀더 여유있게 최대 600메가 정도로 여유폭을 준다라고 생각을 해보겠습니다.
16000MB / 600MB = 26이 나왔네요.
pm.max_children = 26 //동시 사용할수 있는 최대 프로세스 수, 600메가 메모리 사용하는 유저가 동시에 26명이 클릭할 때까지는 문제가 없을 것으로 예상.
pm.start_servers = 8 //처음 시작할 때 max_children 30%선
pm.min_spare_servers = 5 //최소 사용값 max_children 20%선
pm.max_sapre_servers = 13 //최대 사용값 max_children 의 50% (이 수가 넘어가면 프로세스 삭제)
중요포인트 : php-fpm 프로세서를 많이 띄우려고 하지 말고, 빨리 처리하도록 하는 것이 중요. 그러기 위해서 각 프로세서의 메모리 사용 여유폭을 넉넉히 책정해야함.
max_children 이 최대 접속자를 의미한다고 생각하기 보다는, php-fpm의 프로세서가 최대 메모리 사용하면서 띄울 수 있는 가장 혹독한 상황을 가정하여 최대값을 책정하는 것이라고 이해하는 것이 좋습니다.