사이트 내 전체검색
Apache 2.x MPM(prefork, worker) 방식 성능 비교
로빈아빠
https://cmd.kr/server/677 URL이 복사되었습니다.

본문

Apache 2.x MPM(prefork, worker) 방식 성능 비교

아파치 2.x는 다중처리모듈 (MPMs)이라는 교체할 수 있는 동기화 모델을 지원한다.
아파치를 설치할때 MPM방식을 결정해서 컴파일하여야 되며, 웹서버의 속도 및 확장성은 어떤 MPM을 선택했냐에 따라 좌우된다.

1. Prefork MPM
쓰레드가 한개인 자식 프로세스를 여러개 사용하며 각 프로세스는 한번에 한 연결을 담당한다.
여러 시스템에서 prefork의 속도는 worker와 비슷하지만, 프로세스 단위이므로 좀 더 많은 메모리를 사용하게 된다.
기본적으로 프로세스간 메모리를 직접 공유하지 않으므로, 메모리 공간이 독립적이어서 안정적이라고 말할 수 있다.
-> 안정지향, 후방호환성이 높은 MPM

2. Worker MPM
여러 자식 프로세스가 각각 여러 쓰레드를 사용하며, 각 쓰레드는 한번에 한 연결을 담당한다.
일반적으로 worker는 prefork보다 적은 메모리를 사용하므로 통신량이 많은 서버에 적절하다.
또한 메모리 공간을 공유하고 있으므로, 쓰레드 전환에 걸리는 비용이 멀티 프로세스 보다 적다.
하지만 메모리 공간 전체를 복수의 쓰레드가 공유하므로 리소스 경합이 발생하지않도록 주의할 필요가 있다.
-> 확장성이 높은 MPM


여기서는 worker 방식으로 설치해서 기존 prefork방식과 얼마나 성능상에 차이가 나는지
간단한 ab 테스트를 통하여 확인하려고 합니다. 상대적인 벤치마크 자료이니 크게 의미를 부여할 필요는 없습니다.ㅎㅎ


* worker.c
vi httpd-2.2.9/server/mpm/worker/worker.c
#define DEFAULT_SERVER_LIMIT 64
#define DEFAULT_THREAD_LIMIT 128
최대 8192 thread 생성(64 * 128)


* compile
cd /root/tmp/httpd-2.2.9
./configure --prefix=/usr/local/apache --with-mpm=worker --enable-suexec --enable-rewrite --enable-so
make
make install


* 확인
/usr/local/apache/bin/httpd -V
Server version: Apache/2.2.9 (Unix)
Server built: Oct 19 2009 15:19:22
Server's Module Magic Number: 20051115:15
Server loaded: APR 1.3.0, APR-Util 1.3.0
Compiled using: APR 1.3.0, APR-Util 1.3.0
Architecture: 64-bit
Server MPM: Worker
threaded: yes (fixed thread count)
forked: yes (variable process count)

worker MPM 방식으로 표시됩니다.


* 설정
/usr/local/apache/conf/extra/httpd-mpm.conf
<IfModule mpm_worker_module>
ServerLimit 32
StartServers 4
MaxClients 2048
MinSpareThreads 64
MaxSpareThreads 256
ThreadsPerChild 64
MaxRequestsPerChild 20000
</IfModule>
테스트시 적용한 설정값입니다. 하단의 설명 참고하시면 크게 어려움은 없으실거에요.
적용후 재시작하시면 됩니다.ㅎㅎ


ServerLimit
httpd 자식 프로세스의 제한 설정으로 MaxClients 와 ThreadsPerChild의 설정값에 따라
생성되는 프로세스의 수는 정해지므로 해당 값을 높일 필요가 없다.
(MaxClient / ThreadsPerChild = ServerLimit)

StartServers
아파시 시작시에 생성되는 자식 프로세스의 설정값으로 초기에 4개의 프로세스정도면 적당하며,
접속이 많아질경우 동적으로 제어되어 프로세스의 개수를 늘린다. (ThreadsPerChild 에 연관)

MaxClients
동시에 접속하여 처리될수 있는 client 최대 설정값
하나의 프로세스내에 복수의 쓰레드를 생성하고, 쓰레드 하나로 하나의 Client 를 처리한다.
(ServerLimit * ThreadsPerChild)

MinSpareThreads
MaxSpareThreads
프로세스당 쓰레드 생성의 최소에서 최대치 사이 값을 설정하며,
MinSpareThreads를 ThreadsPerChild와 동일하게 맞추는게 맞는것으로 보인다.(정확한 근거는 없습니다.ㅎ)
ThreadsPerChild
각각의 자식 프로세스의 쓰레드 생성 개수 설정
MaxRequestsPerChild
각각의 자식 프로세스가 처리할 요청수의 제한하며, 설정치 만큼 처리가 되면 해당 자식 프로세스는
종료되며 다시 생성하게 된다. 0이면 무한대를 의미하며, 리소스를 생각할때 무한대로 설정하는것은 무의미합니다.


* ab 테스트(prefork)
/usr/local/apache/bin/ab -c 500 -n 1000 http://test.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking test.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: Apache/2.2.9
Server Hostname: test.com
Server Port: 80

Document Path: /
Document Length: 135927 bytes

Concurrency Level: 500
Time taken for tests: 6.484 seconds
Complete requests: 1000
Failed requests: 4
(Connect: 0, Receive: 0, Length: 4, Exceptions: 0)
Write errors: 0
Total transferred: 136350538 bytes
HTML transferred: 135641340 bytes
Requests per second: 154.22 [#/sec] (mean)
Time per request: 3242.048 [ms] (mean)
Time per request: 6.484 [ms] (mean, across all concurrent requests)
Transfer rate: 20535.61 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 273 858.0 0 3000
Processing: 12 1045 1708.8 266 6470
Waiting: 10 1041 1708.9 263 6468
Total: 213 1318 1778.5 278 6479

Percentage of the requests served within a certain time (ms)
50% 278
66% 836
75% 3021
80% 3117
90% 3302
95% 6392
98% 6442
99% 6457
100% 6479 (longest request)


* ab 테스트(worker)
/usr/local/apache/bin/ab -c 500 -n 1000 http://test.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking test.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: Apache/2.2.9
Server Hostname: test.com
Server Port: 80

Document Path: /
Document Length: 135927 bytes

Concurrency Level: 500
Time taken for tests: 3.653 seconds
Complete requests: 1000
Failed requests: 5
(Connect: 0, Receive: 0, Length: 5, Exceptions: 0)
Write errors: 0
Total transferred: 136277480 bytes
HTML transferred: 135538181 bytes
Requests per second: 273.77 [#/sec] (mean)
Time per request: 1826.339 [ms] (mean)
Time per request: 3.653 [ms] (mean, across all concurrent requests)
Transfer rate: 36434.50 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 6 6.2 9 14
Processing: 208 1664 902.5 1915 3495
Waiting: 203 1658 901.1 1907 3492
Total: 208 1670 908.4 1927 3507

Percentage of the requests served within a certain time (ms)
50% 1927
66% 2293
75% 2534
80% 2639
90% 2856
95% 2964
98% 3218
99% 3361
100% 3507 (longest request)

기본 ab 테스트시 약 1.7배 정도 성능개선이 있는것으로 나타나네요..
단순 벤치 마크 자료이니 참고만 하시면 되겠습니다

댓글목록

등록된 댓글이 없습니다.

1,139 (3/23P)

Search

Copyright © Cmd 명령어 3.138.125.86