2013/01/15

아파치 튜닝


Apache에서 서버 request를 효율적으로 처리하기 위해 MPM(Multi-Processing Module)을 쓰는데 두가지 방식이 있음

prefork / worker

자세한 설명은 레퍼런스를 보면 알수 있지만, 대략 정리해보면

prefork


  • 하나의 자식 프로세스가 하나의 쓰레드를 갖는 구조로, 자식 프로세스는 1024까지 늘일 수 있다.
  • 한개의 자식 프로세스는 한 개의 연결을 담당한다. 
  • 프로세스가 생성되는 구조이므로 당연히 worker보다는 많은 메모리를 사용함.
  • 프로세스간 메모리를 직접 공유하지 않으므로, 메모리 공간이 독립적이어서 안정적임


worker



  • 자식 프로세스들이 여러개의 쓰레드를 갖을 수 있으며, 각 쓰레드는 한번에 한 연결을 담당함. 
  • Prefork보다 메모리 사용량이 적음. 통신량이 많은 서버에 적절함. 
  • 쓰레드 간에 메모리 공간을 공유함. 리소스 경합이 발생하지 않도록 주의 필요. 특히 PHP를 쓰는 경우 유의하여야 함.

즉,
prefork 방식은 프로세스:쓰레드 = 1:1 방식
worker 방식은 프로세스:쓰레드 = 1:n 방식
이다.

대부분 prefork 방식이 기본적으로 사용되며, 사용자가 많은 경우에는 worker방식을 사용하는데 실제 기준은 좀 애매한것 같고, 서버 스펙이랑 평균 동접량에 따라 계산해봤을때 prefork로 버티느냐 못버티느냐에 따라 선택하는것 같다. (근 몇시간 동안 구글링해본 느낌일뿐 정확한 정보는 아니다)

이 글 정독하면 대략 감 잡는데 도움이 된다

그럼 서버 스펙은 어떻게 확인할까.

현재 설정된 아파치 정보를 확인하려면,


httpd -V

Server version: Apache/2.2.3
Server built:   Nov 12 2012 08:48:42
Server's Module Magic Number: 20051115:3
Server loaded:  APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture:   32-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="run/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="logs/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

httpd -l

Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c




그렇담 메모리 확인은 top, meminfo 정도로 확인할 수 있지만,

free -m

명령어가 제일 깔끔하고 필요한 정보를 얻을 수 있다. 옵션에 따라 k, m, g byte로 출력이 가능하다. 더 많은 정보는 물론 -h 치면 나온다.

이제 실제 테스트를 해보며 삽질을 할 시간인듯. 굿럭.