Prefork 방식

  • 1개의 자식 프로세스당 1개의 쓰레드를 가짐(최대 1024개의 프로세스 생성 가능)
    • 1개의 자식 프로세스는 1개의 요청을 처리
  • 프로세스당 독립적인 메모리 사용
    • 메모리 공간이 독립적이기 때문에 안정적이나 메모리를 많이 소모
  • 설정 내용 (샘플)

     <IfModule prefork.c>

        StartServers        20      // 아파치 시작시 생성되는 자식 프로세스 개수

        MinSpareServers      5      // 부하가 적을 경우에 이 수치만큼 유지하려고 함

        MaxSpareServers     10      // 부하가 많을 경우에 이 수치 이하로 줄이려고 함

        MaxClients         256      // 클라이언트의 최대 요청 수 제한

        MaxRequestsPerChild  10000  // 생성된 자식 프로세스가 이 수치만큼 요청을 받을 경우 처리후에 자동으로 종료됨 

                                  //(0은 무한대로 유지 -> 이렇게 값을 주게 되면 특정 모듈의 메모리 누수와 같은 버그로 서비스 불가 상황이 발생할 수 있다!)

    </IfModule>

Worker 방식

  • 1개의 자식 프로세스가 다중 쓰레드를 가지며, 각 쓰레드는 1개의 요청을 처리
  • 쓰레드간 메모리 공유로 Prefork보다 적은 메모리 사용
    • 리소스의 race condition 발생이 생길 가능성이 크므로 조심해야 함. 특히 php는 더 조심해서 사용.
  • 설정 내용 (샘플)

     <IfModule worker.c>

        StartServers         2       // 아파치 시작시 생성되는 자식 프로세스 개수

        ServerLimit          6       // 구성 가능한 자식 프로세스 제한 개수 (MaxClients와 ThreadsPerChild에서 요구한 프로세스 개수보다 높게 설정하면 안됨)

        MaxClients         150       // default는 ServerLimit * ThreadPerChild, 클라이언트의 최대 동시 요청 처리 수

        MinSpareThreads     25       // 서버에 idle 쓰레드가 불충분하다면 자식 프로세스는 idle 쓰레드 > MinSpareThreads 가 될때까지 생성됨

        MaxSpareThreads     75       // 서버에 너무 많은 idle 쓰레드가 존재하면 자식 프로세스는 idle 쓰레드 < MaxSpareThreads 가 될때까지 죽게됨

        ThreadsPerChild     25       // 자식 프로세스당 생성될 수 있는 쓰레드 개수

        MaxRequestsPerChild  0       // 생성된 자식 프로세스가 이 수치만큼 요청을 받을 경우 처리후에 자동으로 종료됨

                                  //(0은 무한대로 유지 -> 이렇게 값을 주게 되면 특정 모듈의 메모리 누수와 같은 버그로 서비스 불가 상황이 발생할 수 있다!)

    </IfModule>

요약

  • 일반적으로는 prefork 방식이 사용되고 요청량이 많은 서버의 경우 worker 방식을 사용하기도 하나, worker방식은 쓰레드간 메모리 공유로 인해
    리소스에 대한 경합이 발생할 가능성이 많기 때문에 애플리케이션 레벨에서 코딩을 thread-safe하게 구현해야 한다. 
    보다 안정적인 서비스를 위해서 prefork + 서버 scale-out으로 많이 사용한다.
  • MaxClient의 튜닝 (prefork 방식 사용시에~)
    • 서버의 메모리 사용량 대비 처리가능한 개수로 역산하여 정하는 것이 좋다.
      • 계산 방법 예제
        • 사용가능한 여유 메모리 산정 : 2G(Total Memory) - OS(500M) - Java(600M) - Swap(Total Memory * 0.8 = 160M) = 약 700M
          • 2G를 TotalMemory로 봤을때 OS 입장에서 80% 이상 사용하게 되면 swap 발생 가능성이 커짐. 따라서 1.6G 만이 가용 가능한 메모리라고 봐야 함.
          • 1.6G에서 예를들어 Tomcat의 Xmx가 600M이고 top 기준으로 RES 700M정도 된다고 하면,  최종 900M 정도가 가용  메모리라고 봐야 한다.
          • 900M에서 OS와 기타 주요 프로세스들이 사용하는 메모리를 200M 정도로 산정하여 추가로 빼주면 700M 정도가 apache가 사용할 수 있는 가용메모리가 됨.
        • 자식 프로세스 하나의 메모리 크기 측정 : 약 10M 라고 가정
        • MaxClients 는 700 / 10 = 70개로 서비스 가능하다.


'Apache & Nginx' 카테고리의 다른 글

[Apache] 로그인 계정 세팅  (0) 2015.09.03
[Apache] mod_perl을 이용한 redirect 서버 만들기  (0) 2015.09.03

+ Recent posts