Apache MPM 확인
페이지 정보
본문
1. Apache 최적화
– 아래 작성한 값은 알맞은 값이 아니며, 웹서버를 실행한 상태에서 지속적인 모니터링을 통해
알맞은 값을 찾아야 합니다.
1-1) Apache MPM (prefork, worker)
< prefork 방식 >
– 자식 프로세스를 미리 준비해두는 방식
– 자식 프로세스는 최대 1024개
– 하나의 자식 프로세스당 1개의 스레드 연결
– 스레드간 메모리 공유를 하지 않아 독립적사용으로 안정적이나 메모리를 많이 사용함
< worker 방식 >
– 프로세스당 여러개의 스레드 연결
– 스레드간 메모리를 공유하여 메모리 사용량이 비교적 적음
– 통신량이 많은 서버에 적합
< event 방식>
– 아파치 2.4.x 버전부터 생성된 방식
– worker 방식을 기반으로 함
– keepalive 시에 클라이언트로부터 요청을 기다리고 있는 자식 프로세스 또는 자식 스레드 전체를 keep하게
되는 문제를 해결하기 위하여 리스닝 소켓과 기타 모든 소켓을 처리하는 각 프로세스를 위한 전용 리스너
스레드를 사용
< prefork 방식과 worker 방식의 차이>
– worker가 Prefork에 비해 적은 메모리를 사용한다.
– worker: 통신량이 많은 서버에 적절한 형태를 가진다.
– prefork: 안전하지 않은 제 3자가 만든 모듈을 사용할 수 있다.
– prefork: 디버깅이 빈약한 플랫폼에서 쉽게 디버깅 할 수 있다.
– prefork 방식과 worker 방식의 속도는 비슷하다.
대부분 prefork 방식이 기본적으로 사용되며, 사용자가 많은 경우에는 worker방식을 사용합니다.
<prefork 방식>
# /usr/local/apache/conf/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 300
ServerLimit 300
MaxConnectionsPerChild 0
</IfModule>
– StartServer : 아파치서버의 자식 프로세스 개수 지정.
– MinSpareServers, MaxSpareServers : 부하가 적어서 MinSpareServers 개수 보다 적었을 경우 최소한 이 개수 만큼 아파치가 유지하려 하며, 부하가 증가하여 프로세스 개수가 많아질 경우에 MaxSpareServers 개수 이하로 줄이려고 아파치가 구동 됩니다. 절대적인 수치는 아닙니다.
– MaxRequestWorkers, ServerLimit : 기본값이 256 이기 때문에 MaxRequestWorkers 값이 256보다 작으면 따로 적을 필요가 없으며, 256보다 크면 그와 같은 값으로 설정해야합니다.
– MaxReqeustPerChild : 클라이언트들의 요청 개수를 제한, 만약 자식 프로세스가 이 값만큼의 클라이언트 요청을 받았다면 이 자식 프로세스는 자동으로 kill 됩니다. (0 인 경우 무한대)
<worker 방식>
# /usr/local/apache/conf/extra/httpd-mpm.conf
<IfModule mpm_worker_module>
StartServers 3
MaxClients 150
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 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 수보다 작아질 때까지 kill 됩니다.
– ThreadPerChild : 개별 자식 프로세스가 지속적으로 가질 수 있는 Thread의 개수.
– MaxRequestPerChild : 자식 프로세스가 서비스할 수 있는 최대 요청 개수
– ThreadLimit (default : 64) : child 프로세스의 라이프주기 동안 ThreadsPerChild 의 최대 설정값을 설정합니다. ThreadLimit 가 ThreadsPerChild 보다 훨씬 높게 설정된다면, 여분의 미사용 공유 메모리가 할당될 것입니다. ThreadLimit 과 ThreadsPerChild 모두 시스템이 감당할 수 있는 값 보다 높게 설정하면, 아파치가 기동되지 않거나 시스템이 불안정하게 될 수 있습니다.최대 예상 ThreadsPerChild의 설정보다 높게 설정하면 안됩니다.
<event 방식>
# /usr/local/apache/conf/extra/httpd-mpm.conf
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
<현재 MPM 모듈 확인 방법>
# /usr/local/apache/bin/apachectl -V | grep -i mpm
Server MPM: event
1-2) httpd.conf 설정
이외에도 Timeout, KeepAlive, MaxKeepAliveRequests, MaxKeepAliveTimeout 같은 옵션도 성능에 영향을 미칩니다. /usr/local/apache/conf/httpd.conf 파일에서 설정을 할 수 있습니다.
-Timeout
지정한 시간동안 클라이언트가 응답이 없을 경우, 세션을 끊어 버립니다.
Timeout 60
-KeepAlive
지속적인 연결을 허용 여부를 설정합니다. 비활성화하려면 Off 를 입력하면 됩니다.
KeepAlive On
-MaxKeepAliveRequests
허용할 최대 요청 수를 지정합니다. 최상의 성능을 위해서는 수치를 높게 설정하는 것을 권장합니다.
무제한으로 설정하려면 0 으로 설정하면 됩니다.
MaxKeepAliveRequests 100
-KeepAliveTimeout
동일한 연결에서 동일한 클라이언트의 다음 요청을 대기하는 시간입니다.
응답이 없을 경우 서버가 클라이언트의 접속을 끊습니다.
KeepAliveTimeout 5
<Apache 동시접속자 확인하기>
– 아파치 서버가 현재 처리 중인 소켓 연결 개수를 확인할 수 있으며
설정한 MaxClients 수를 넘지 않도록 유의해야 합니다.
# netstat -nltp |grep :80.*ESTABLISHED | wc -l
– 하드웨어 자원을 고려한 가용 동시연결수 계산 = 여유 메모리 / 1연결당 메모리
2000MB free memory, 1연결당 20MB 를 사용 = 100개의 동시연결 가능. (300~500 동시접속자 처리가능)
1-3 ) 벤치마킹 테스트
<웹서버 벤치마킹 도구(ab) 사용하여 테스트>
# ab -n 3000 -c 300 http://localhost/
-n은 요청수를, -c 는 동시요청수를 나타낸다.
300명의 사용자가 10번씩 총 3000번 요청하는 것입니다.
사이트 주소의 끝에 / (슬래시)를 붙여야 합니다.
– 주요 옵션
Server Software : 아파치 버전을 표시
Server Hostname : 특정사이트의 이름
Server Port : 웹서비스 사용 포트 번호
Document Path : 초기 문서가 존재하는 웹문서 root위치
Time taken for tests : 응답시간(매우 중요한 결과 값)
Document Length : 초기문서의 크기
Complete requests : 요구에 응답완료한 세션 수
Failed requests : 요구에 응답실패한 세션 수
Broken pipe errors : 실패한 에러 수
Total transferred : 총 전송 바이트 수
HTTP transferred : 총 전송한 HTML 바이트 수
Requests per second : 초당 응답 요구 수
Time per request : 요구에 응답한 시간(단위 micro second, 중요한 결과값)
Time per request : 요구에 응답한 시간
Transfer rate : 초당 전송 가능한 용량
<prefork 방식>
Benchmarking localhost (be patient)
Server Software: Apache/2.4.27
Server Hostname: localhost
Server Port: 80
Document Path: /
Document Length: 45 bytes
Concurrency Level: 300
Time taken for tests: 9.534 seconds
Complete requests: 3000
Failed requests: 0
Total transferred: 909000 bytes
HTML transferred: 135000 bytes
Requests per second: 314.68 [#/sec] (mean)
Time per request: 953.353 [ms] (mean)
Time per request: 3.178 [ms] (mean, across all concurrent requests)
Transfer rate: 93.11 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.8 0 9
Processing: 1 260 1218.8 17 9522
Waiting: 1 260 1218.8 17 9522
Total: 5 261 1219.7 17 9526
Percentage of the requests served within a certain time (ms)
50% 17
66% 18
75% 18
80% 18
90% 20
95% 225
98% 3328
99% 9523
100% 9526 (longest request)
<worker 방식>
Benchmarking localhost (be patient)
Server Software: Apache/2.4.27
Server Hostname: localhost
Server Port: 80
Document Path: /
Document Length: 45 bytes
Concurrency Level: 300
Time taken for tests: 0.592 seconds
Complete requests: 3000
Failed requests: 0
Total transferred: 867000 bytes
HTML transferred: 135000 bytes
Requests per second: 5069.15 [#/sec] (mean)
Time per request: 59.181 [ms] (mean)
Time per request: 0.197 [ms] (mean, across all concurrent requests)
Transfer rate: 1430.65 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 2.1 1 10
Processing: 2 27 71.8 13 578
Waiting: 0 26 71.7 12 578
Total: 7 29 72.5 14 585
Percentage of the requests served within a certain time (ms)
50% 14
66% 16
75% 17
80% 18
90% 24
95% 32
98% 222
99% 584
100% 585 (longest request)
1-4) 아파치 메모리 사용량 측정
– 전체 메모리 사용량을 아파치 프로세스 개수로 나누어 계산
# ps aux | grep apache | awk ‘{print $6}’ | awk ‘{total = total + $1 } END {print total/1024}’
<prefork>
# ps aux | grep apache | awk ‘{print $6}’ | awk ‘{total = total + $1 } END {print total/1024}’
25.4727
<worker>
# ps aux | grep apache | awk ‘{print $6}’ | awk ‘{total = total + $1 } END {print total/1024}’
16.2109
<event>
# ps aux | grep apache | awk ‘{print $6}’ | awk ‘{total = total + $1 } END {print total/1024}’
15.3633
* 같은 환경에서 메모리 사용량은 worker, event 방식일 때 prefork 방식의 비해
낮은 값을 보였습니다.
– 아래 작성한 값은 알맞은 값이 아니며, 웹서버를 실행한 상태에서 지속적인 모니터링을 통해
알맞은 값을 찾아야 합니다.
1-1) Apache MPM (prefork, worker)
< prefork 방식 >
– 자식 프로세스를 미리 준비해두는 방식
– 자식 프로세스는 최대 1024개
– 하나의 자식 프로세스당 1개의 스레드 연결
– 스레드간 메모리 공유를 하지 않아 독립적사용으로 안정적이나 메모리를 많이 사용함
< worker 방식 >
– 프로세스당 여러개의 스레드 연결
– 스레드간 메모리를 공유하여 메모리 사용량이 비교적 적음
– 통신량이 많은 서버에 적합
< event 방식>
– 아파치 2.4.x 버전부터 생성된 방식
– worker 방식을 기반으로 함
– keepalive 시에 클라이언트로부터 요청을 기다리고 있는 자식 프로세스 또는 자식 스레드 전체를 keep하게
되는 문제를 해결하기 위하여 리스닝 소켓과 기타 모든 소켓을 처리하는 각 프로세스를 위한 전용 리스너
스레드를 사용
< prefork 방식과 worker 방식의 차이>
– worker가 Prefork에 비해 적은 메모리를 사용한다.
– worker: 통신량이 많은 서버에 적절한 형태를 가진다.
– prefork: 안전하지 않은 제 3자가 만든 모듈을 사용할 수 있다.
– prefork: 디버깅이 빈약한 플랫폼에서 쉽게 디버깅 할 수 있다.
– prefork 방식과 worker 방식의 속도는 비슷하다.
대부분 prefork 방식이 기본적으로 사용되며, 사용자가 많은 경우에는 worker방식을 사용합니다.
<prefork 방식>
# /usr/local/apache/conf/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 300
ServerLimit 300
MaxConnectionsPerChild 0
</IfModule>
– StartServer : 아파치서버의 자식 프로세스 개수 지정.
– MinSpareServers, MaxSpareServers : 부하가 적어서 MinSpareServers 개수 보다 적었을 경우 최소한 이 개수 만큼 아파치가 유지하려 하며, 부하가 증가하여 프로세스 개수가 많아질 경우에 MaxSpareServers 개수 이하로 줄이려고 아파치가 구동 됩니다. 절대적인 수치는 아닙니다.
– MaxRequestWorkers, ServerLimit : 기본값이 256 이기 때문에 MaxRequestWorkers 값이 256보다 작으면 따로 적을 필요가 없으며, 256보다 크면 그와 같은 값으로 설정해야합니다.
– MaxReqeustPerChild : 클라이언트들의 요청 개수를 제한, 만약 자식 프로세스가 이 값만큼의 클라이언트 요청을 받았다면 이 자식 프로세스는 자동으로 kill 됩니다. (0 인 경우 무한대)
<worker 방식>
# /usr/local/apache/conf/extra/httpd-mpm.conf
<IfModule mpm_worker_module>
StartServers 3
MaxClients 150
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 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 수보다 작아질 때까지 kill 됩니다.
– ThreadPerChild : 개별 자식 프로세스가 지속적으로 가질 수 있는 Thread의 개수.
– MaxRequestPerChild : 자식 프로세스가 서비스할 수 있는 최대 요청 개수
– ThreadLimit (default : 64) : child 프로세스의 라이프주기 동안 ThreadsPerChild 의 최대 설정값을 설정합니다. ThreadLimit 가 ThreadsPerChild 보다 훨씬 높게 설정된다면, 여분의 미사용 공유 메모리가 할당될 것입니다. ThreadLimit 과 ThreadsPerChild 모두 시스템이 감당할 수 있는 값 보다 높게 설정하면, 아파치가 기동되지 않거나 시스템이 불안정하게 될 수 있습니다.최대 예상 ThreadsPerChild의 설정보다 높게 설정하면 안됩니다.
<event 방식>
# /usr/local/apache/conf/extra/httpd-mpm.conf
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
<현재 MPM 모듈 확인 방법>
# /usr/local/apache/bin/apachectl -V | grep -i mpm
Server MPM: event
1-2) httpd.conf 설정
이외에도 Timeout, KeepAlive, MaxKeepAliveRequests, MaxKeepAliveTimeout 같은 옵션도 성능에 영향을 미칩니다. /usr/local/apache/conf/httpd.conf 파일에서 설정을 할 수 있습니다.
-Timeout
지정한 시간동안 클라이언트가 응답이 없을 경우, 세션을 끊어 버립니다.
Timeout 60
-KeepAlive
지속적인 연결을 허용 여부를 설정합니다. 비활성화하려면 Off 를 입력하면 됩니다.
KeepAlive On
-MaxKeepAliveRequests
허용할 최대 요청 수를 지정합니다. 최상의 성능을 위해서는 수치를 높게 설정하는 것을 권장합니다.
무제한으로 설정하려면 0 으로 설정하면 됩니다.
MaxKeepAliveRequests 100
-KeepAliveTimeout
동일한 연결에서 동일한 클라이언트의 다음 요청을 대기하는 시간입니다.
응답이 없을 경우 서버가 클라이언트의 접속을 끊습니다.
KeepAliveTimeout 5
<Apache 동시접속자 확인하기>
– 아파치 서버가 현재 처리 중인 소켓 연결 개수를 확인할 수 있으며
설정한 MaxClients 수를 넘지 않도록 유의해야 합니다.
# netstat -nltp |grep :80.*ESTABLISHED | wc -l
– 하드웨어 자원을 고려한 가용 동시연결수 계산 = 여유 메모리 / 1연결당 메모리
2000MB free memory, 1연결당 20MB 를 사용 = 100개의 동시연결 가능. (300~500 동시접속자 처리가능)
1-3 ) 벤치마킹 테스트
<웹서버 벤치마킹 도구(ab) 사용하여 테스트>
# ab -n 3000 -c 300 http://localhost/
-n은 요청수를, -c 는 동시요청수를 나타낸다.
300명의 사용자가 10번씩 총 3000번 요청하는 것입니다.
사이트 주소의 끝에 / (슬래시)를 붙여야 합니다.
– 주요 옵션
Server Software : 아파치 버전을 표시
Server Hostname : 특정사이트의 이름
Server Port : 웹서비스 사용 포트 번호
Document Path : 초기 문서가 존재하는 웹문서 root위치
Time taken for tests : 응답시간(매우 중요한 결과 값)
Document Length : 초기문서의 크기
Complete requests : 요구에 응답완료한 세션 수
Failed requests : 요구에 응답실패한 세션 수
Broken pipe errors : 실패한 에러 수
Total transferred : 총 전송 바이트 수
HTTP transferred : 총 전송한 HTML 바이트 수
Requests per second : 초당 응답 요구 수
Time per request : 요구에 응답한 시간(단위 micro second, 중요한 결과값)
Time per request : 요구에 응답한 시간
Transfer rate : 초당 전송 가능한 용량
<prefork 방식>
Benchmarking localhost (be patient)
Server Software: Apache/2.4.27
Server Hostname: localhost
Server Port: 80
Document Path: /
Document Length: 45 bytes
Concurrency Level: 300
Time taken for tests: 9.534 seconds
Complete requests: 3000
Failed requests: 0
Total transferred: 909000 bytes
HTML transferred: 135000 bytes
Requests per second: 314.68 [#/sec] (mean)
Time per request: 953.353 [ms] (mean)
Time per request: 3.178 [ms] (mean, across all concurrent requests)
Transfer rate: 93.11 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.8 0 9
Processing: 1 260 1218.8 17 9522
Waiting: 1 260 1218.8 17 9522
Total: 5 261 1219.7 17 9526
Percentage of the requests served within a certain time (ms)
50% 17
66% 18
75% 18
80% 18
90% 20
95% 225
98% 3328
99% 9523
100% 9526 (longest request)
<worker 방식>
Benchmarking localhost (be patient)
Server Software: Apache/2.4.27
Server Hostname: localhost
Server Port: 80
Document Path: /
Document Length: 45 bytes
Concurrency Level: 300
Time taken for tests: 0.592 seconds
Complete requests: 3000
Failed requests: 0
Total transferred: 867000 bytes
HTML transferred: 135000 bytes
Requests per second: 5069.15 [#/sec] (mean)
Time per request: 59.181 [ms] (mean)
Time per request: 0.197 [ms] (mean, across all concurrent requests)
Transfer rate: 1430.65 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 2.1 1 10
Processing: 2 27 71.8 13 578
Waiting: 0 26 71.7 12 578
Total: 7 29 72.5 14 585
Percentage of the requests served within a certain time (ms)
50% 14
66% 16
75% 17
80% 18
90% 24
95% 32
98% 222
99% 584
100% 585 (longest request)
1-4) 아파치 메모리 사용량 측정
– 전체 메모리 사용량을 아파치 프로세스 개수로 나누어 계산
# ps aux | grep apache | awk ‘{print $6}’ | awk ‘{total = total + $1 } END {print total/1024}’
<prefork>
# ps aux | grep apache | awk ‘{print $6}’ | awk ‘{total = total + $1 } END {print total/1024}’
25.4727
<worker>
# ps aux | grep apache | awk ‘{print $6}’ | awk ‘{total = total + $1 } END {print total/1024}’
16.2109
<event>
# ps aux | grep apache | awk ‘{print $6}’ | awk ‘{total = total + $1 } END {print total/1024}’
15.3633
* 같은 환경에서 메모리 사용량은 worker, event 방식일 때 prefork 방식의 비해
낮은 값을 보였습니다.
관련링크
-
https://idchowto.com/?p=43512
5545회 연결 -
https://bkjeon1614.tistory.com/23
6310회 연결
- 이전글ssl 인증서 설정 20.02.28
- 다음글아파치 memory 사용량 보기 20.02.23
댓글목록
등록된 댓글이 없습니다.