안녕하세요.

 

VPS하나에 작은 웹사이트 여러개를 운영하고 있습니다.

 

ubuntu 20.04 + Nginx + php7.4 + mariadb 10.4 구성을 사용하고 있습니다만..

 

얼마전에 웹사이트가 속도가 엄청나게 느려져 로그를 확인해보니, php 로그에 

 

 server reached pm.max_children setting (30), consider raising it 에러가 다수 찍혀 있는걸 보았습니다. 

 

그런데 트래픽 양은 딱히 차이가 없었습니다만.... 왜 그런 오류가 뜬건지 잘 모르겠습니다 ;;

 

혹시 pm.max_children 값을 변경하지 않고, Nginx에서 설정할 수 있는 keepalive_timeout 이나 client_body_timeout 값을 줄이면 줄이면  pm.max_children 문제 해결에도 도움이 되는지 궁금합니다.

 

감사합니다.

 

 

 

  • Lv37

    1. pm.max_children을 늘려보라는 메시지는 무시하셔도 됩니다.

     

    2. 오랫동안 프로세스를 점유하고 있는 스크립트가 있으면 다른 요청을 처리할 수 있는 프로세스가 고갈되어서 문제가 되는 것은 사실이죠.

     

    3. 특정 PHP 스크립트의 실행 시간을 가장 확실하게 제한할 수 있는 설정은 php.ini의 max_execution_time과 PHP-FPM pool 설정파일의 request_terminate_timeout입니다. 시간을 많이 잡아먹는 PHP 스크립트 자체를 죽여버리기 때문에, 그냥 nginx에서 연결만 끊는 것보다 더 직접적이지요. nginx가 연결을 끊어도 PHP는 계속 돌아가면서 프로세스를 점유할 수 있으니까요. (아파치 시절에는 ignore_user_abort 등의 방법으로 이 부분을 컨트롤할 수 있었지만, PHP-FPM에서는 잘 안 통합니다. 앞단에서 연결을 끊어도 10분이고 20분이고 계속 돌아가요.)

  • Lv37 ? Lv3
    안녕하세요 기진곰님.

    답변 정말 감사합니다!! 그렇군요!!! 기진곰님의 설명을 듣고 현재 php 값을 찾아보았습니다.

    max_execution_time 값은 디폴트 (300)로, request_terminate_timeout 값은 아에 주석 처리되어 있더군요

    제 서버의 프로세서의 대부분은 Mariadb랑 php-fpm이 차지하고 있습니다.

    그럼 이 문제는 단지 서버가 계속 돌아가면서 여러 프로세스들이 이리저리 점유되고 하다보니, 나중에 php가 점유할 공간이 없어서 발생했던것.... 이라고 이해하면 괜찮을까요?

    어차피 제어 해봤자 되돌아갈테니 근본적인 해결 방법은 램을 늘리는 방법이 제일 확실한 해결법이 아닐지..

    제가 이해한게 맞는지 궁금합니다. 알려주셔서 정말 감사합니다.
  • ? Lv3 Lv37

    기본값이 300초는 아닐 겁니다. 웹에서 30초 이상 허용할 이유가 없거든요. 사실 30초도 길어요. 웹페이지 하나 로딩하는 데 10초 이상 기다려 주는 유저가 어디 있다고...

     

    pm.max_children 30이나 되고 접속자도 많지 않은데 프로세스 부족 메시지가 뜬다면 불필요하게 오랫동안 프로세스를 점유하는 특정 기능이 문제일 가능성이 높습니다. pm.max_children 30은 서버 사양만 넉넉하다면 일반적인 커뮤니티 기준으로 동접 3천 명도 감당할 수 있는 설정입니다.

     

    타임아웃을 줄여서 이렇게 프로세스를 장시간 점유하는 기능들을 최대한 잡아내는 것이 서버 튜닝의 중요한 과정이고, 그렇게 잡아낸 기능들을 그대로 유지할지, 고칠지, 포기할지는 그 다음에 고민해볼 문제입니다. 어떤 기능이 문제인지 정확하게 파악하지 못한 채 서버 사양만 5배 10배 늘려봤자 로딩시간이 전혀 개선되지 않는 경우도 흔하거든요.

     

    예를 들어 방문자의 접속 국가를 기록하는 애드온이 느려터진 해외 API에 접속하느라 매번 3초씩 낭비하고 있다면, 제아무리 빠른 서버를 사용해도 3초씩 지연될 수밖에 없습니다. 마찬가지로 DB에 불필요한 연산을 반복으로 시키는 모듈이 있다면, 아무리 CPU 코어와 RAM을 많이 달아줘도 그 싱글쓰레드 연산에 걸리는 시간은 크게 개선되지 않겠지요. 원인 파악을 건너뛰고 땜빵부터 시도하는 카고컬트는 곤란해요.

  • Lv37 ? Lv3
    그렇군요!!!! 자세한 답변 정말 정말 감사합니다.

    지금까지 타임아웃에 관해 신경을 써본적이 없었습니다. 그저 워드프레스에서 권장한다는 설정 값을 보고 그대로 적용만 했었습니다.

    300이란 값도, 제가 기억은 안나지만 제가 바꾼 값이었나보네요.

    늘 자세한 설명 정말 감사합니다. 이 참에 Nginx와 PHP의 타임아웃에 대해 배우고, 설정을 변경해보도록 하겠습니다.

    정말 감사합니다!!