카페24 SSD 가상서버 퍼스트클래스 램3G / PHP Version(Ver. 5.5.9-1ubuntu4.20) / XE 1.8.42 로 홈페이지를 운영 중에 있습니다.

 

최초 설치한 우분투 14.04 서버 셋팅 작업 ( 참고 : https://blog.lael.be/post/4518 ) 변경없이 수개월간 원할하게 홈페이지가 운영이 되던 중 갑자기 홈페이지 접속과 텔넷 접속이 15~20분만이 겨우 되는 현상이 발생되어 카페24에 문의를 하여 아래와 같은 답변을 받았습니다. 

 

요약하면 " apache2 프로세스가 과도안 자원을 사용하면서 OOM(Out Of Memory)가 발생된 것으로 확인되며 ,지속적으로 apache2 프로세스가 위와 같은 상태가 지속되지 않도록 상태를 확인 해보셔야 한다" 라고 하는데 어떻게 조치를 취해야 할지 도움 말씀을 부탁드리겠습니다.

 

서버 재부팅 후 일주일이 경과한 현재 시점까지 접속 지연 현상은 발생되고 있지는 있습니다. 

 

[ 홈페이지 접속과 텔넷 접속이 15~20분만이 겨우 되는 현상에 대한 카페24 답변 ] 

 

안녕하세요.
카페24 호스팅입니다.

 

문의하신 내용으로 호스트 서버 상태를 살펴보았으나 특이점이 없는 상태였으며

고객님께서 관리하시는 가상서버 내부의 로그를 확인 시 아래 시간대에 apache2 프로세스가 과도안 자원을 사용하면서

OOM(Out Of Memory)가 발생된 것으로 확인됩니다.

메모리 및 swap이 모두 소진되면서 성능상에 상당한 저하가 또는 일시적인 다운이 있었을 것으로 예상됩니다.

지속적으로 apache2 프로세스가 위와 같은 상태가 지속되지 않도록 상태를 확인 해보셔야 할 것으로 보이니 이점 이용에 참고 부탁 드립니다.

 

80889ba3ce52e489304531e10ea73764.jpeg

 

  • Lv37

    /etc/apache2 아래에서 mpm_prefork 설정이 들어 있는 파일을 찾으세요.

    MaxClients 또는 MaxRequestWorkers 설정이 있을 것입니다. 아마 기본값이 100 이상일 거예요.

    이 값을 10~20 사이로 낮춰주고 service apache2 restart 명령으로 아파치를 재시작하세요.

     

    아파치는 RAM이 16~32GB 정도 되는 고성능 리얼서버에 기본값이 맞춰져 있기 때문에

    비교적 사양이 낮은 가상서버에서 사용하려면 튜닝이 필요합니다.

    그래서 가상서버 사용자들이 nginx를 선호하지요 ㅎㅎ

  • Lv37 ? Lv7

    앗 감사합니다. ^^
    조언 주신대로 설정을 변경 한번 해보겠습니다.

  • Lv37 ? Lv7

    기진곰님 아래 경로의 파일을 열어  MaxRequestWorkers 값을 150에서 20으로 수정 변경했습니다. 혹시 잘못된 부분이 있는 지 확인 좀 부탁드리겠습니다. 

    2017-08-31 21,43,18.PNG

     

     

     

     

     

  • ? Lv7 Lv37
    잘 찾으신 것 같습니다. 아파치 재시작 잊지 마시고요.
  • Lv37 ? Lv7
    네 감사합니다. ^^
  • Lv37 Lv30

    저희도 150으로 되어 있던데요. 이부분 조금 자세히 설명 부탁드려도 될까요??

     

    아 검색을 해보니 동시접석자 수 를 설정하는 것 이군요. 1접속당 필요한 메모리가 있으니 서버의 메모리에 따라 1접속 필요 메모리로 나눠서 숫자를 계산해 내서 변경해야 하는 것이네요.

  • Lv30 Lv37

    mpm_prefork를 사용하면 아파치 최대 동시접속자 수가 곧 PHP 동시 실행 가능 갯수입니다.

    이미지, CSS, JS 파일 같은 것을 전송해 주는 데는 메모리가 거의 필요하지 않지만, PHP를 실행하려면 어떤 작업을 하는지에 따라 최대 100MB 이상의 메모리가 필요하기도 하지요.

    그런데 mpm_prefork를 사용하면 이 두 가지를 구분하지 않기 때문에 평소에는 아무 문제가 없다가도 PHP 요청이 늘어나면 갑자기 메모리 사용량이 늘어나서 서버가 뻗을 수 있습니다. 불시에 다운되는 일을 막으려면 최대 동시접속자 수를 낮추는 방법으로 동시에 실행할 수 있는 PHP 갯수를 제한해야 합니다. 물론 이걸 너무 낮춰놓으면 동시접속자가 많아졌을 때 일부 사용자들이 기다려야 하는 문제가 발생할 수도 있습니다. (웹의 특성상 페이지 로딩 후 연결을 끊고 다음 페이지 로딩시 다시 연결하기 때문에, 실제 수용 가능한 동시접속자 수는 MaxRequestWorkers 설정보다 훨씬 많습니다.)

    요즘은 mpm_worker나 mpm_event를 사용하고 PHP를 PHP-FPM으로 분리하는 (사실상 nginx와 동일한) 방식으로 아파치 최대 동시접속자 수와 PHP 동시 실행 가능 갯수를 별도로 관리하는 방법이 나왔습니다. PHP 페이지 하나에 수십 개의 이미지, CSS, JS가 붙어 있기 때문에 훨씬 효율적이지요. mpm_worker나 mpm_event를 사용하신다면 MaxRequestWorkers 설정값이 웬만큼 높아도 상관없습니다.

  • Lv37 Lv30
    현재 1연결당 60M 정도로 조회가 되네요... 저희는 그냥 30으로 했습니다. 뭐 방문자가 많지는 않은 사이트 이기고 하고... 메모리는 2G를 사용하는 서버구요.

    이 숫자가 30연결 넘는 동시 요청을 차단하는건 아니구 넘는 요청은 대기열에서 순차적으로 처리하게끔 하는 방식이라는 것 같군요.
  • Lv30 Lv37
    네, 동접수가 늘어나면 일부 사용자가 차단될까봐 걱정하는 분도 있는데 그런 건 아니예요. 서버가 다운되는 것보다는 좀 기다리는 편이 낫죠...

    서버 전체 메모리 용량에서 DB가 사용하는 부분을 먼저 빼고, 나머지를 PHP 평균 메모리 소비량으로 나누면 얼추 맞습니다.
  • Lv37 Lv30
    mpm_event.conf
    <IfModule mpm_event_module>
    StartServers 2
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadLimit 64
    ThreadsPerChild 25
    MaxRequestWorkers 150
    MaxConnectionsPerChild 0
    </IfModule>


    mpm_worker.conf
    <IfModule mpm_worker_module>
    StartServers 2
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadLimit 64
    ThreadsPerChild 25
    MaxRequestWorkers 150
    MaxConnectionsPerChild 0
    </IfModule>


    요렇게 두개 파일이 보입니다.
  • Lv30 Lv37

    mpm_event와 mpm_worker는 웬만큼 높아도 상관없습니다.