[Apache 튜닝]apache prefork 와 worker 방식 > LINUX

본문 바로가기
사이트 내 전체검색

LINUX

[Apache 튜닝]apache prefork 와 worker 방식

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 7,460회 작성일 21-02-10 17:05

본문

Apache Multi-Processing Modules(MPM, 다중처리모듈)의 Prefork 와 Worker 방식의 비교
==> apache 서버가 클라이언트에게서 받아들인 요청을 처리하기 위해 "자식 process" 에게 분배하는 방식

Prefork 방식

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

httpd.conf에서 httpd-mpm.conf 파일을 include 시켜야 한다.

httpd-mpm.conf 파일에서

  <IfModule mpm_prefork_module>
      StartServers 5
      MinSpareServers 5
      MaxSpareServers 10
      MaxClients 150
      MaxRequestsPerChild 0
  </IfModule>


옵션 설명
StartServer: 아파치서버의 자식 프로세스 개수 지정

MinSpareServers, MaxSpareServers :
부하가 적어서 MinSpareServers 개수 보다 적었을 경우 최소한 이 개수 만큼 유지하려고 아파치가 노력하고
 부하가 증가하여 프로세스 개수가 많아질 경우에 MaxSpareServers 개수 이하로 줄이려고 아파치는 노력한다.
즉, 절대적인 수치가 아니다.

MaxClient : 초기 시작시 실행가능한 최대 아파치 자식 프로세스의 개수를 지정
            worker방식의 MaxClient 와는 전혀 다른 의미가 다르지만 결국 클라이언트의 요청을 처리하는 용량을 말하므로 사실상 유사.

MaxReqeustPerChild :클라이언트들의 요청 개수를 제한.
            만약 자식 프로세스가 이 값만큼의 클라이언트 요청을 받았다면 이 자식 프로세스는 자동으로 죽게 된다.
            0 인 경우 무한대임.

Maxclient 를 늘리기 위한 설정 ( Prefork 방식일 경우 )
  1) apache 1.x 버전
    Apache 소스 디렉토리/src/include/httpd.h 에서
    define HARD_SERVER_LIMIT 256  ----> 512 혹은 1024 등으로 변경 저장후 컴파일

  2) apache 2.x~ 2.2.x 버전
    apache소스디렉토리/server/mpm/prefork/prefork.c 에서
    define DEFAULT_SERVER_LIMIT 256 ----> 512 혹은 1024 등으로 변경후 재부팅



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


httpd.conf에서 httpd-mpm.conf 파일을 include 시켜야 한다.

httpd-mpm.conf 파일에서
   
    <IfModule mpm_worker_module>
        StartServers 2
        MaxClients 150
        MinSpareThreads 25
        MaxSpareThreads 75
        ThreadsPerChild 25
        MaxRequestsPerChild 0
    </IfModule>



옵션 설명 

StartServers(Default 3) : 시작시에 생성되는 서버 프로세스의 개수, 자식 프로세스의 수는 부하에 따라 동적으로 변경되기 때문에 이 값은 큰 의미가 없다.

ServerLimit (default : 16)                                                                                     
    - 구성 가능한 child 프로세스의 제한 수.
    - 이 ServerLimit 값이 필요 이상 높게 설정 된다면, 불필요한 공유 메모리가 할당 되므로 적절한 설정 필요.
    - MaxClient 와 ThreadPerChild 에서 요구한 프로세스 수보다 높게 설정하지 말 것.


MaxClient (default : ServerLimit * ThreadsPerChild)
        - 동시에 처리될 최대 커넥션(request)의 수
        - MaxClients 수치를 초과한 후 온 요청들은 ListenBackLog에 의해 큐잉됨
        - ThreadsPerChild 옵션과 매우 긴밀하게 작용함
        - 동접자가 많을 경우, 이 MaxClient값을 증가시켜야 함.
        - OS의 FD(File Descriptor)값을 증가 시켜 MaxClient 의 상한값을 증가시키도록 할 것.



MinSpareThreads(default 75) : 최소 thread 개수
  - 만약 서버에 idle 쓰레드가 충분하지 않다면 child 프로세스는 idle 쓰레드가 MinSpareThreads 보다 커질때까지 생성된다.



MaxSpareThreads(default 250) : 최대 thread개수
  - 만약 서버에 너무 많은 idle 쓰레드가 존재하면 child 프로세스는 idle 쓰레드가 MaxSpareThreads 수보다 작아질 때까지 죽는다
 
ThreadPerChild : 개별 자식 프로세스가 지속적으로 가질 수 있는 Thread의 개수

MaxRequestPerChild : 자식 프로세스가 서비스할 수 있는 최대 요청 개수

ThreadLimit (default : 64)

- child 프로세스의 라이프주기 동안 ThreadsPerChild 의 최대 설정값을 설정한다.
- ThreadLimit 가 ThreadsPerChild 보다 훨씬 높게 설정된다면, 여분의 미사용 공유 메모리가 할당될 것이다.
- ThreadLimit 과 ThreadsPerChild 모두 시스템이 감당할 수 있는 값 보다 높게 설정하면,
      아파치가 기동되지 않거나 시스템이 불안정하게 될 수 있다. 
- 이 값은 최대 예상 ThreadsPerChild 의 설정보다 높게 설정하면 안된다.



Maxclient 를 늘리기 위한 설정 ( Worker 방식일 경우 - 2.x버전에 한정됨)
  1) Maxclient 는  StartServers * ThreadsPerChild 로 정해짐
      ( MaxClient = StartServer * ThreadsPerChild )
    => worker 방식은 각각의 자식프로세스별로 여러개의 thread를 생성해서 요청을 처리하기 때문
  2) Maxclient 를 늘리기 위한 설정
    apache소스디렉토리/server/mpm/worker/worker.c 파일 을 수정
    ( define DEFAULT_SERVER_LIMIT 16 값을 늘려준다 ) 




 * 참고1.

대부분 prefork 방식이 기본적으로 사용되며, 사용자가 많은 경우에는 worker방식을 사용한다.
요즘 몇 몇 사이트에서 사용자 폭주로 인하여 worker 방식을 사용하는 경우가 간혹 있다.


 *참고2.

 apache 설치 시에 아래와 같이, 반드시  --with-mpm=worker 옵션을 설정 하고 설치한다.
이 옵션을 주지 않을 경우, Default인 Prefork방식으로 설치된다(Linux에 한함)

 ================================================================
 ./configure --prefix=/home/paint/apache-2.2.15 --enable-mods-shared=all --enable-module=so --enable-so  --with-mpm=worker
 ================================================================



 * 참고3.

현재 worker 모듈 설치 되었는지 확인하는 방법

- "httpd -l" 명령으로 현재 설치된 Apache가 worker방식으로 설치되었는지 확인할 수 있다.

 ============================================

 # httpd -l

 Compiled in modules:
  core.c
  worker.c <----------------------요거임
  http_core.c
  mod_so.c

 ============================================



또는, httpd -V 명령으로 확인 가능하다. (V는 대문자)

 ============================================

 # httpd -V

 Server version: Apache/2.2.15 (Unix)

 Server built:  Jun 30 2010 16:59:45
 Server's Module Magic Number: 20051115:24

 Server loaded:  APR 1.4.2, APR-Util 1.3.9

 Compiled using: APR 1.4.2, APR-Util 1.3.9

 Architecture:  32-bit

 Server MPM:    Worker <------------------------요거

  threaded:    yes (fixed thread count)

    forked:    yes (variable process count)

 Server compiled with....

-D APACHE_MPM_DIR="server/mpm/worker"
-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="/home/paint/apache-2.2.15"
-D SUEXEC_BIN="/home/paint/apache-2.2.15/bin/suexec"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"

 =============================================
 [출처] [Apache 튜닝]apache prefork 와 worker 방식|작성자 부탄가스

http://blog.naver.com/sugyoo?Redirect=Log&logNo=20119924250

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

  • 게시물이 없습니다.

접속자집계

오늘
1,705
어제
3,408
최대
6,642
전체
1,130,820
contact : webmaster@beautipia.co.kr
Copyright © beautipia.co.kr. All rights reserved.