'아파치 worker'에 해당되는 글 1건

  1. 2013.11.25 Apache2 MPM prefork & worker
Web/Apache2013. 11. 25. 14:13

Apache 에는 2가지의 MPM(Multi Processing Module : 다중 처리 모듈)방식이 있습니다.

 

바로 prefork 와 worker 방식입니다.

 

prefork 는 apache2 설치시 기본으로 적용되는 방식이고, worker 는 옵션을 주어 설치를 할 수 있습니다.

(yum 과 같이 rpm 으로 설치한 경우 /etc/sysconfig/httpd 파일에서 #HTTPD=/usr/sbin/httpd.worker 부분의 #(주석) 를 제거하여 아파치(Apache)를 재시작 합니다.)

 

예) Apache 2.2.20 컴파일시

prefork : 별도의 옵션을 입력 안해도 됩니다.

.⁄configure --prefix=⁄usr⁄local⁄apache --enable-rule=SHARED_CORE --enable-module=so --enable-shared=max --enable-so  --enable-ssl  --enable-modules=ssl  --enable-rewrite=shared --enable-unique-id 

 

 

worker : --with-mpm=worker 옵션을 추가하여 configuer 합니다.

.⁄configure --prefix=⁄usr⁄local⁄apache --enable-rule=SHARED_CORE --enable-module=so --enable-shared=max --enable-so  --enable-ssl  --enable-modules=ssl  --enable-rewrite=shared --enable-unique-id --with-mpm=worker

 

웹서버의 용도에 따라 이 MPM 방식이 중요합니다. 각 방식별로 특징이 다르기 때문이지요.

 

prefork

 

prefork 방식은 쓰레드가 한개의 자식 프로세스를 여러개 사용하며 각 프로세스는 한 번에 한 연결을 담당합니다.

또한 실행중인 프로세스를 메모리 영역까지 복제하여 실행하기에 당연히 프로세스가 소비하는 메모리가 많습니다.

(특정 자식프로세스가 메모리를 많이 잡아먹어 Apache프로세스가 Swap 영역까지 사용하여 시스템이 다운되는 현상을 경험했었습니다..ㅜㅜ)

하지만 메모리를 직접 공유하지 않고 독립적인 메모리를 할당하기에 안정적 이라고 할 수 있습니다.

메모리 소비가 많은 대신 응답 프로세스를 미리 띄어 놓고 클라이언트가 요청을 하면 자식 프로세스가 응답을 합니다.

 

 

worker

 

worker방식은 한 자식프로세스 당 여러개의 쓰레드(thread)를 사용합니다. 이 쓰레드는 최대 64개까지 사용할 수 있으며, 지정된 만큼의 프로세스와 각 쓰레드를 준비하여 클라이언트 요청을 받아 들입니다. 또한 쓰레드간에 메모리를 서로 공유하기 때문에 prefork 방식보다 메모리 소비가 적습니다.

동시접속자 수가 많거나 다중 CPU 환경에 적합합니다. 메모리를 공유해서 인지 하나의 쓰레드에서 문제가 발생하면 해당 쓰레드에

Acess 하여 작업중인 모든 프로세스에 문제가 발생한다고 하지만 아직까지 경험해보지는 못했습니다.

이게 진정 단점인지 모르겠지만 일부 OS(예:우분투)의 최신버전에서는 apache 를 자동설치시 기본으로 worker 방식으로 설치가 됩니다.

 

※ 각 방식별로 소스컴파일시 최대 접속자 수를 조정하여 설치할 수 있습니다.

 

각 방식 별로 해당 옵션의 설정값을 확인해 보겠습니다.

 

먼저 prefork 부터 확인해보겠습니다.

<IfModule mpm_prefork_module>
    StartServers         10
    MinSpareServers      15
    MaxSpareServers      25
    MaxClients         1024
    MaxRequestsPerChild   0
<⁄IfModule>

 

StartServer

 - 아파치(Apache) Start 시 생성되는 자식프로세스의 갯수를 지정

 

MinSpareServers

 - 아파치(Apache)가 유지할 최소 자식프로세스수

 

MaxSpareServers

 - 아파치(Apache)가 유지할 최대 자식프로세스수

 

MaxClients

 - 아파치(Apache) Start시 최대 생성 가능한 자식 프로세스의 갯수

   (보통 이 옵션을 가지고 최대 접속자수를 지정합니다.)

 

MaxReqeustPerChild

 - 클라이언트들의 최대 요청갯수, 기본값은 0 이며, 무한대입니다. 이 갯수만큼 클라이언트로부터 요청을 받았다면 자식 프로세스는 자동으로 죽고

   다시 생성 됩니다. 아파치(Apache)서버가 자주 다운되거나 메모리 문제가 발생한다면 이 값을 조절하여 해결을 봅니다.

 

※ MinSpareServers, MaxSpareServers 값은 절대적인 수치가 아닙니다. 서버의 상태나 접속하는 Client에 따라 늘어나거나 줄어들 수 있습니다.

    다만, MinSpareServers, MaxSpareServers 값이 높아서 기본 프로세스가 많다면 갑자기 늘어나는 Client접속자수 나 서버의 급격스러운 부하에

    아파치서버의 빠른 대처가 가능합니다.

 

자 다음은 worker 입니다.

<IfModule mpm_worker_module>
    StartServers         16
    MaxClients         2048
    MinSpareThreads     256
    MaxSpareThreads    1024
    ThreadsPerChild      64
    MaxRequestsPerChild   0
<⁄IfModule>

 

StartServers

 - 아파치(Apache) Start 시 생성되는 자식프로세스의 갯수를 지정

 

MaxClients

 - 아파치(Apache) Start시 최대 생성 가능한 자식프로세스의 갯수

   (worker 의 경우 프로세스 * 최대 쓰레드 갯수 입니다.)

 

MinSpareThreads

 - 아파치(Apache)가 유지할 최소 쓰레드수

 

MaxSpareThreads

 - 아파치(Apache)가 유지할 최대 쓰레드수

 

ThreadsPerChild

 - 하나의 자식프로세스가 가질 수 있는 쓰레드의 갯수

 

MaxRequestsPerChild

 - 클라이언트들의 최대 요청갯수, 기본값은 0 이며, 무한대입니다. 이 갯수만큼 클라이언트로부터 요청을 받았다면 자식 프로세스는 자동으로 죽고

   다시 생성 됩니다. 아파치(Apache)서버가 자주 다운되거나 메모리 문제가 발생한다면 이 값을 조절하여 해결을 봅니다.

 

 

현재 설치된 또는 구동되고 있는 아파치(Apache)가 어떤 MPM방식으로 동작중인지를 확인하려면 http -l 또는 httpd -V (V는 대문자) 로 확인이 가능합니다.

 

[root@localhost ~]# ⁄usr⁄local⁄apache⁄bin⁄httpd -V
Server version: Apache⁄2.2.20 (Unix)
Server built:   Oct 14 2013 16:16:52
Server's Module Magic Number: 20051115:28
Server loaded:  APR 1.4.5, APR-Util 1.3.12
Compiled using: APR 1.4.5, APR-Util 1.3.12
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="⁄usr⁄local⁄apache"
 -D SUEXEC_BIN="⁄usr⁄local⁄apache⁄bin⁄suexec"
 -D DEFAULT_PIDLOG="logs⁄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"

 

 

[root@localhost ~]# ⁄usr⁄local⁄apache⁄bin⁄httpd -l
Compiled in modules:
  core.c
  mod_authn_file.c
  mod_authn_default.c
  mod_authz_host.c
  mod_authz_groupfile.c
  mod_authz_user.c
  mod_authz_default.c
  mod_auth_basic.c
  mod_include.c
  mod_filter.c
  mod_log_config.c
  mod_env.c
  mod_unique_id.c
  mod_setenvif.c
  mod_version.c
  mod_ssl.c
  prefork.c
  http_core.c
  mod_mime.c
  mod_status.c
  mod_autoindex.c
  mod_asis.c
  mod_cgi.c
  mod_negotiation.c
  mod_dir.c
  mod_actions.c
  mod_userdir.c
  mod_alias.c
  mod_so.c

 

제건 제가 테스트용으로 prefork 로 설치했기에 prefork 라는게 보이네요.

궁금하신게 있으면 댓글을 달아주시고.. 다음번엔 튜닝과 유용한 옵션에 대해 정리해보도록 하겠습니다.

 

'Web > Apache' 카테고리의 다른 글

Apache 메모리 누수  (0) 2012.09.05
Apache - mod_jk2 설치 중 configure: error: can't locate libapr 에러  (0) 2012.07.26
apache conf (httpd.conf)  (0) 2012.03.19
apache configure 옵션  (0) 2012.03.19
Posted by 소울하트