본문 바로가기

미들웨어/Apache,Tomcat

Apache event MPM(Multi-Processing Module) 설정

반응형

Apache는 들어온 request를 처리하는 방식을 선택할 수 있으며 MPM이라고 한다.
MPM에는 prefork, worker, event, winnt등이 존재하며 최초 설치시 configure과정에서 기본값을 설정할 수 있다.
 
해당 포스팅에는 요즘 가장 널리 쓰이는 event방식을 설명한다.


event MPM은 worker MPM을 베이스로 만들어졌다. process별로 thread를 생성하여 요청을 처리하는 방식이지만
worker의 경우 요청과 thread의 비율이 1:1로 keep-alive로 인한 지연등의 이슈가 있다.
이를 해결하기 위해 process단위로 listener thread와 worker thread를 별도로 분리한 MPM이 event이다.
 
1. MPM설정

  • 기본적으로 HTTPD_HOME/conf/httpd.conf파일에서 httpd-mpm.conf파일을 include후 해당 파일에 설정을 한다.
  • 처음 설치하면 include부분이 주석처리 되어 있으며 주석을 풀어준다.
Include conf/extra/httpd-mpm.conf

 

  • httpd-mpm.conf파일을 열면 MPM별로 설정이 되어있으며 이 중 event방식의 설정내용은 아래와 같다.
<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>
  • StartServers : Apache기동시 최초 child process의 수
  • MinSpareThreads : 최소한 유지할 Thread의 수(전체 worker process에 존재하는 thread의 수)
  • MaxSpareThreads : 너무 많은 Idle Thread의 유지를 방지하기 위한 최대 Idle thread의 수.
  • ThreadsPerChild : Process별 thread의 수
  • MaxRequestWorkers : MaxClient. 동시에 처리 가능한 최대 수(ServerLimit * ThreadsPerChild)
  • MaxConnectionsPerChild : Process별 최대 처리 횟수로 해당 설정값을 초과한 Process는 종료된다 (0으로 설정시 제한이 없음.) 부하가 큰 환경에서는 이 설정을 해주길 권장한다.

 
2. 기타 설정

  • 기본적으로 Apache는 child process의 수와 전체 Thread수를 제한하고 있다.
  • (default - ServerLimit : 16, ThreadLimit 64)
  • 부하가 많은 시스템의 경우 더 많은 process와 thread의 수가 필요하며 각각의 설정을 통해 가능하다.
  • httpd.conf파일에 아래와 같이 원하는 수치를 입력하면 된다.(OS별로 hardLimit은 존재한다)
  • ThreadLimit값을 크게 설정할경우 메모리를 많이할당하게 된다. 적정값을 찾아 설정해야 한다.
ThreadLimit 4096
ServerLimit 64

 
 
3. 관련 log(일부 log는 loglevel을 debug로 해야 확인 가능)

  • ThreadPerChild 이상의 Thread가 필요한 경우
  • 아래 로그 발생 후 신규 child process가 생성됨
[mpm_event:debug] [pid 5172:tid 140133187675904] event.c(1810): Too many open connections (1), not accepting new conns in this process

 

  • MaxRequestworkers 설정 이상의 Connection생성이 필요한 경우
  • 이 후 request는 Idle한 Connection이 생길때까지 대기
[mpm_event:error] [pid 5078:tid 140133298730816] AH10159: server is within MinSpareThreads of MaxRequestWorkers, consider raising the MaxRequestWorkers setting
  • Idle한 Connection이 생겼을 때 로그
[mpm_event:debug] [pid 5171:tid 140133187675904] event.c(493): AH00457: Accepting new connections again: 0 active conns (0 lingering/0 clogged/0 suspended), 1 idle workers

 

  • process가 fork될 때
[slotmem_shm:debug] [pid 5624:tid 140011997841216] mod_slotmem_shm.c(496): AH02301: attach looking for /webwas/Apache24/logs/slotmem-shm-p22a20278_0.shm
[slotmem_shm:debug] [pid 5624:tid 140011997841216] mod_slotmem_shm.c(509): AH02302: attach found /webwas/Apache24/logs/slotmem-shm-p22a20278_0.shm: 544/6
[slotmem_shm:debug] [pid 5624:tid 140011997841216] mod_slotmem_shm.c(496): AH02301: attach looking for /webwas/Apache24/logs/slotmem-shm-p22a20278_cluster_0.shm
[slotmem_shm:debug] [pid 5624:tid 140011997841216] mod_slotmem_shm.c(509): AH02302: attach found /webwas/Apache24/logs/slotmem-shm-p22a20278_cluster_0.shm: 1064/2

잡담을 좀 해보자면 Apache의 eventMPM과 Nginx를 많이 비교하는데 실제로 부하가 큰 서비스의 Nginx를 Apache로 전환해본 결과 resource적인 부분에서는 Nginx가 확실히 좋아보였지만 성능상의 큰 차이는 못느꼈다.
요즘처럼 H/W spec이 빵빵한 시대에는 Apache와 Nginx의 큰 차이는 없는 것 같다.

반응형