2017년 5월 24일 수요일

apache worker 튜닝

아파치 2.2 웹서버를 운영 중 동시 접속자 수가 증가 할 경우 튜닝 방법입니다. 
아무런 근거 없이 옵션 값을 증가 시키면 또다른 문제가 생길수 있기 때문에 어느정도 수치를 계산 하여 튜닝하는 것이 좋은 방법이라 생각 됩니다. 
예를 들어 동시 접속자 수가 10000명이상 이라고 가정 하면 (10000명은 적은 수가 아닙니다.)
가용할 수 있는 웹서버가 4대가 있다고 하면 어떻게 설정 해야 할 것인지 고민을 많이 해봐야 할 것입니다. 

동시 접속자 수가 많을 경우엔 프로세스 방식인 prefork 방식보단 worker 방식이 적합하겠지요
전 페이지에서 방식에 대한 글을 작성 하였지만 한번더 설명 드리면 

"parent 프로세스는 여러 개의 child 프로세스를 갖고있고 child 프로세스는 멀티 스레드를 사용합니다. , request 처리를 스레드 단위로 처리 합니다. 각 스레드는 한번에 연결을 담당하고 스레드간 메모리를 공유하는 방식입니다.
스레드를 사용하기 때문에 리소스 소모량이 적고 동시접속이 많은 경우 적합합니다. 하지만 메모리 공유 방식을 사용하기 때문에 스레드 간섭으로 인해 한 스레드에 문제가 생기면 다른 스레드에도 영향을 미칠 가능성이 있습니다."

머리 속으론 계산이 힘드니 종이에 그림을 그리면서 생각해봅시다. 
http-mpm.conf 파일 내용입니다. 
<IfModule mpm_worker_module>
    StartServers              10 << 아파치 시작시 기본 프로세스 수
    ServerLimit              128 << 최대 시행 가능한 프로세스 수
    MaxClients             2000 << 최대 동시 접속자 수
    MinSpareThreads        75 << 최소로 유지할 스레드 수
    MaxSpareThreads      250 << 최대로 유지할 스레드 수
    ThreadsPerChild          25 << 하나의 자식프로세스가 가질 수 있는 스레드 수
    MaxRequestsPerChild    0 << 자식 프로세스가 살아있는 동안 요청을 받을 수 (0은 무한대, 메모리누수의 경우 메모리 사용양 제한가능)
</IfModule>

 위에 언급 햇듯이 10000명에 가용할 수 있는 서버거 4대 이니 한대당 2500명을 요청을 받아 드렸는데 실제 튜닝에서는 정확히 10000명에 시스템으로 설정하지 않습니다. 어느정도 넉넉하게 웹서버 1대당 3000명을 처리 한다고 생각하면 총 12000 클라이언트를 처리 할 수 있도록 설정합니다. 

두가지 방법이 있습니다. 
1. ThreadsPerChild 옵션 값을 증가 시켜 실제 Thread를 증가
2. ServerLimit 옵션 값을 증가 시켜 실제 process를 증가 

1번 방법은 클라이언트가 접속하여 커넥션을 오래 잡고 있을 경우 적합하고
2번 방법은 클라이언트가 요청을 처리하고 나면 바로 끝날 경우 적합합니다. 

또한 ServerLimit 값을 증가 시키면 그만큼 프로세스를 더 많이 띄우는 것이니 리소스를 많이 사용할거라 예상됩니다. 

수치상 계산을 해보면 
1번은 MaxClients(3000) / ThreadsPerChild(32) = ServerLimit (95)
2번은 MaxClients(3000) / ThreadsPerChild(25) = ServerLimit (128)

위와 같이 튜닝은 상황에 따라 모니터링 후 분석하여 시스템에 적합하게 수정 하시는게 제일 좋은 방법입니다. 정확한 답은 없습니다. 분석과 모니터링 입니다. 

댓글 없음:

댓글 쓰기