Extra Form
PHP PHP 7.4
CMS WordPress

안녕하세요.

 

NGINX + PHP7.4 + MARIADB + UBUNTU 20.04 환경에서 작은 워드프레스 웹사이트 여러개를 운영하고 있습니다.

 

VPS 서버는 2코어, 4기가를 사용 중이며, 동시 접속자는 그리 많지 않습니다.

 

최근에 새 홈페이지를 설정하는데, 종종 db가 멈춰  establish database 에러가 발생하고, 자동으로 재시작되면  웹사이트가 잘 작동합니다.

 

그런데 서버거 뻗어버리는 원인을 당최 모르겠습니다..

 

PHP, MARIADB, NGINX 로그를 확인해보니, PHP 로그에서만 다음과 같이 찍혀 나옵니다.

 

```WARNING: [pool www] server reached pm.max_children setting (23), consider raising it```

 

23으로 설정된 max_children은 제 서버의 동시 접속자 수에 비교하면 넉넉하게 설정해둔 편입니다만...

 

아마 워드프레스의 특정 플러그인이 php 프로세서를 과도하게 불러오고, 그래서 메모리가 다 차버려 서버가 뻗어버리는게 아닐까 의심됩니다만.... 

 

활성화 시킨 플러그인을 하나씩 꺼보면 어떤 플러그인이 이런 오류를 일으키는지를 알 수 있을 듯 합니다만,

 

플러그인이 왜 이런 오류를 일으키는지를 확인할 수 있는 방법이 없을까요?

 

플러그인 자체의 문제인지, 아니면 다른 플러그인과의 충돌 문제인지, 제 서버의 뭔가 설정 문제인지를 확인하고 싶습니다만..

 

뉴렐릭을 서버에 설치해 확인해보았습니다만, 딱히 어디가 문제인지는 파악하지 못했습니다.. ;;

 

조언을 구하고 싶습니다. 감사합니다.

  • profile

    php.ini의 memory_limit 기본값이 128M이니, pm.max_children 23이라면 최대 128M × 23 = 2944M의 메모리를 사용하도록 허락하는 설정입니다. PHP 엔진이 기본적으로 잡아먹는 메모리도 꽤 되고, opcache 등의 기본적인 캐시 기능이 잡아먹는 메모리도 있으니 실제 PHP가 사용하는 메모리는 3200~3400M까지 늘어날 수도 있지요. DB가 평소 사용하는 메모리(최소 1G)와 커널 캐시(수백M), 그 밖의 프로그램들을 위한 여유공간을 감안할 때, 4G짜리 서버라면 메모리가 부족해서 애꿎은 DB가 종종 죽는 것이 당연합니다.

     

    만약 memory_limit을 256M, 512M, 심지어 그 이상으로 늘려달라고 땡깡피우는 플러그인의 유혹에 넘어가셨다면 위의 계산은 2~4배 더 늘어날 수도 있습니다. 서버 자원은 언제나 넉넉한 줄 아는 천조국 마인드 + 메모리를 효율적으로 사용할 줄 모르는 개발자들의 환상적인 콜라보 덕에, 무턱대고 memory_limit을 늘려달라고 하는 플러그인이 꽤 많더군요. 이거 다 들어주면 램 4G짜리 서버에 동접 10명도 버겁습니다. (반면, 국내 개발자라면 호스팅 업체들이 제한을 풀어주지 않는다는 것을 알기 때문에 감히 그런 무리한 요구를 할 수 없습니다. ㅎㅎ)

     

    memory_limit이 기본값 그대로라면 pm.max_children을 줄이시면 됩니다. pm.max_children은 흔히 생각하는 동접수의 10분의 1 내지 100분의 1이면 충분합니다. 접속자 1명이 PHP-FPM 프로세스 1개를 항상 점유하는 것이 아니기 때문입니다. 10 이하로 줄이고, "consider raising it"이라는 말도 안 되는 제안은 상큼하게 무시하세요.

     

    반면, memory_limit을 늘려놓으신 상태라면 기본값 128M로 줄여놓고 어디서 에러가 나는지 확인하시면 범인을 금방 찾을 수 있습니다. 메모리 용량, 타임아웃 등 서버 자원 사용 제한과 관련된 에러가 발생할 때는, 제한을 늘려달라는 땡깡을 절대 들어주지 말고 반대로 더 엄격하게 줄이면서 에러나는 녀석들을 잡아내는 것이 확실한 방법입니다. 자꾸 늘려달라고 하는 개발자가 있다면 "아, 실력없는 놈이구나" 생각하시면 95% 이상의 확률로 맞습니다.

     

    단지 메모리를 많이 사용할 뿐 아니라 시간도 오래 걸린다면 PHP-FPM 자체의 slowlog 기능과 DB의 슬로우 쿼리 로그 기능을 활용할 수도 있습니다.

  • profile ?
    안녕하세요 기진곰님!

    정말 기진곰님께서 예상하셨던 그대로 설정이 된 상태였습니다.

    어디선가 인터넷에서 본 워드프레스 최적화에 관한 글을 보고 memory_limit를 최소 256mb를 권장하길래, 해당 값으로 설정되어 있었습니다.

    기진곰님의 댓글을 보고 128mb로 변경 했으며 제 웹사이트의 동시 접속자 수 (평균 약 30명)에 비해 pm.max_children이 과도하게 설정된 것 같아 이 부분도 낮추었습니다.

    그리고 나니 "server reached pm.max_children setting"에러가 귀신같이 사라졋습니다...

    php-fpm의 슬로우 로그도 활성화 시켜보니, 대략적이지만 어느 스크립트 혹은 페이지에서 이렇게 속도가 느려지는 지 알 수 있게 되었습니다.

    정말 큰 도움이 되었습니다. 자세히 알려주셔서 정말 감사합니다.!!!!