Apache 웹서버 성능 튜닝 방법
본 매뉴얼은 대규모 Apache 웹서버 동시 접속 유입에 대응 하기 위해 성능을 최적화하는 방법을 소개합니다.
1. 웹서버 성능 튜닝이 필요한 이유
Apache, Nginx 등의 웹서버를 기본 설정으로 서비스하면 대량의 동시 접속을 처리하지 못해 서비스가 불안정할 수 있습니다.
가령 웹서버를 로드밸런서에 연결하여 사용하는 경우에 웹서버가 요청을 처리하지 못하면 장애가 발생합니다.
이를 방지하기 위해 사전에 웹서버의 성능을 튜닝하여 안정적인 서비스를 할 수 있습니다.
또한, 웹 애플리케이션이 필요로 하는 만큼의 자원을 사용할 수 있도록 리눅스 시스템의 커널 파라미터를 확인하는 작업도 필요합니다.
매뉴얼 테스트 환경
OS : CentOS 8.4.2105
Kernel : 4.18.0-305.3.1.el8.x86_64
Apache HTTP Server : 2.4.37
주의 사항
서비스별로 환경 및 구성 방식이 다르므로 본 매뉴얼에서 제공하는 설정값은 절대적인 것이 아닙니다.
튜닝에 앞서 CPU, RAM과 같은 하드웨어 자원이 충분한지 고려되어야 합니다.
웹 서버를 운영하며 축적한 지표(ex. 최대 동시접속 수, 메모리 사용량)에 따라 최적화된 값을 설정하여야 합니다.
2. Linux 커널 튜닝
리눅스는 범용적으로 사용하기 위한 기본 설정이 되어 있습니다.
하지만 트래픽을 특수하게 많이 받는 웹 서버 등을 구동할 때는 커널 튜닝을 고려할 필요가 있습니다.
(1) Maximum file count 수정하기
리눅스 전체 시스템에서 활용할 수 있는 최대 파일 개수를 확인합니다.
충분히 큰 값으로 설정되어 있어서 일반적으로는 수정하지 않아도 되지만 필요에 따라 값을 높일 수 있습니다.
file-max 값을 400000으로 설정할 경우 다음과 같이 적용합니다.
(2) Open file Limit 수정하기
리눅스는 프로세스별로 시스템의 자원을 얼마나 사용하게 할 것인지를 제한합니다.
접속 요청량에 비해 웹서버가 사용할 수 있는 자원(파일, 프로세스 수 등)이 적으면 서비스가 정상적으로 동작하지 않습니다.
이 경우 사전에 제한 값을 높이는 작업이 필요합니다. 기존 open files limit과 max user processes를 확인합니다.
다음과 같이 Hard limit과 Soft Limit을 동일하게 수정할 수 있습니다.
이때 설정하는 값은 앞서 확인한 fs.file-max의 값보다 작아야 합니다.
설정값을 가상서버 재부팅 후에도 유지하기 위해서는 /etc/security/limits.conf 파일을 수정합니다.
3. Apache 웹서버 튜닝
Apache http 웹서버는 MPM(Multi-Processing Modules, 다중 처리 모듈)을 사용하여 클라이언트로부터 받은 요청을 처리합니다.
Apache 웹서버는 버전 2.4 기준으로 Prefork, Worker, Event 방식 3가지를 제공합니다.
(1) MPM 개요
MPM 설정을 활용하면 웹 애플리케이션의 성격에 따라 클라이언트로부터 받은 요청을 어떤 방식으로 처리할 것인지를 결정할 수 있습니다.
MPM에 대한 더 자세한 정보는 Apache HTTP Server 공식 페이지에서 확인 할 수 있습니다.
prefork
미리 여러 개의 프로세스를 생성하여 하나의 프로세스가 하나의 요청을 처리하는 방식 (non-thread)
프로세스 간 메모리를 공유하지 않아 안정적
오래된 모듈과 호환이 필요한 서비스에 적합
메모리 사용량이 상대적으로 높음
worker
하나의 프로세스에 연결된 여러 스레드에서 요청을 각각 처리하는 방식 (멀티 스레드)(multi-thread)
스레드들이 메모리를 공유하기 때문에 메모리 사용량이 prefork 방식에 비해 적음
동시접속자가 많은 서비스에 유용
event
Apache 2.4 버전부터 제공됨
worker 방식을 기반으로 동작
요청을 분산하는 스레드를 따로 두어 처리 지연을 최소화하는 구조
속도가 가장 빠르며, 동시접속자가 많은 서비스에 유용
(2) Apache MPM 설정 확인하기
현재 Apache 웹서버에서 MPM이 어떤 방식으로 동작하는지 확인합니다.
다음과 같이 "Server MPM" 항목으로 확인할 수 있습니다.
가상서버의 운영체제 및 Apache의 버전에 따라 기본 동작 방식이 다르게 설정됩니다.
(3) MPM 모듈 변경하기
앞서 확인한 MPM 동작 방식의 변경을 원할 경우 다음을 수행합니다.
00-mpm.conf 파일을 열어 사용하고자 하는 모듈의 주석을 해제하고 기존의 모듈은 주석처리 합니다.
예를 들어 기존의 event 방법을 prefork 으로 변경하려면 mpm_prefork_module을 사용하도록 주석 해제하고 mpm_event_module을 주석 처리해야 합니다.
(4) 튜닝 값 추가하기
a. prefork 방식
/etc/httpd/conf.modules.d/00-mpm.conf 파일에 다음 설정값을 추가합니다. 수치는 서비스 특성에 맞게 조절하여 주세요.
prefork 튜닝 옵션에 대한 상세 설명은 다음과 같습니다.
prefork 방식의 경우 동시 접속을 처리하는 MaxRequestWorkers의 기본값이 256으로 낮기 때문에 적당한 튜닝이 필요합니다.
튜닝 값은 가상서버의 메모리 사용량을 고려하여 산정해야 합니다. 사용 중인 메모리를 고려하여 확인하는 방법은 가상서버 RAM 사용량에 따른 튜닝값 확인하기를 참고해 주세요.
옵션 | 설명 | 기본값 | RAM 4GB | RAM 32GB |
ServerLimit | 프로세스 수의 최대값으로,MaxRequestWorkers보다 커야한다. | 256 | 300 | 3050 |
StartServers | 웹 서버 가동 시 처음에 실행시킬 프로세스의 수 | 5 | 5 | 5 |
MinSpareServers | 유지해야 할 여분의 프로세스 수의 최소값 | 5 | 5 | 5 |
MaxSpareServers | 여분의 프로세스 수의 최대값 | 10 | 10 | 10 |
MaxRequestWorkers (MaxClients) | 클라이언트가 동시에 접속할 수 있는 최대값 | 256 | 300 | 3050 |
MaxConnectionsPerChild (MaxRequestsPerChild) | 자식 프로세스가 종료 되기 전까지 처리할 수 있는 요청의 개수. 값이 0이면 프로세스가 종료되지 않음을 의미한다. | 2000 | 2000 | 2000 |
b. worker 방식
/etc/httpd/conf.modules.d/00-mpm.conf 파일에 다음 설정값을 추가합니다. 수치는 서비스 특성에 맞게 조절하여 주세요.
worker 튜닝 옵션에 대한 상세 설명은 다음과 같습니다.
튜닝 값은 가상서버의 메모리 사용량을 고려하여 산정해야 합니다. 사용 중인 메모리를 고려하여 확인하는 방법은 가상서버 RAM 사용량에 따른 튜닝값 확인하기를 참고해 주세요.
옵션 | 설명 | 기본값 | RAM 4GB | RAM 32GB |
ServerLimit | 프로세스 수의 최대값으로, ServerLimit은 MaxRequestWorkers를 ThreadsPerChild으로 나눈 값보다 크거나 같아야 한다. | 16 | 13 | 123 |
StartServers | 웹 서버 가동 시 처음에 실행시킬 프로세스의 수 | 3 | 3 | 3 |
MinSpareThreads | 유지해야 할 여분의 스레드 수의 최소값 | 75 | 75 | 75 |
MaxSpareThreads | 여분의 프로세스 수의 최대값 | 250 | 250 | 250 |
MaxRequestWorkers (MaxClients) | 생성되는 스레드의 최대치로, 클라이언트가 동시에 접속할 수 있는 최대값 | 400 | 309 | 3057 |
ThreadsPerChild | 하나의 프로세스가 처리할 수 있는 최대 스레드의 수 | 25 | 25 | 25 |
c. event 방식
/etc/httpd/conf.modules.d/00-mpm.conf 파일에 다음 설정값을 추가합니다. 수치는 서비스 특성에 맞게 조절하여 주세요.
worker 튜닝 옵션에 대한 상세 설명은 다음과 같습니다.
튜닝 값은 가상서버의 메모리 사용량을 고려하여 산정해야 합니다. 사용 중인 메모리를 고려하여 확인하는 방법은 가상서버 RAM 사용량에 따른 튜닝값 확인하기를 참고해 주세요.
d. 가상서버 RAM 사용량에 따른 튜닝 값 확인하기
웹서버의 높은 성능을 위해서는 RAM 자원을 잘 관리하여 swapping을 방지해야 합니다.
메모리 swap이 발생하면 웹페이지의 지연이 발생하며 원활한 서비스가 불가능할 수 있습니다.
이를 방지하기 위해 각 httpd 프로세스(스레드)가 사용 가능한 메모리를 고려하여 웹서버를 튜닝하여야 합니다.
다음 명령어로 현재 가상서버에서 사용 중인 RAM 용량과 권장 튜닝 값을 확인할 수 있습니다.
주의 사항
아래와 같이 제공되는 권장값은 절대적인 수치가 아니며, 웹서버의 정상적인 동작을 보장하지 않습니다.
웹서버 구성 환경 및 기타 특이 사항을 고려하여 테스트를 통해 적정 값을 설정하여야 합니다.
해당 명령어는 OS별 웹서비스의 기본 서비스명으로 웹서버의 동작 여부를 검사합니다. ( CentOS, Rocky : "httpd", Ubuntu : "apache2")
따라서 서비스명이 기본 이름과 다를 경우 결과 확인이 불가능합니다.
또한, RPM 설치되어 systemd로 관리되는 웹서비스에 대해서만 지원합니다.
스크립트 동작을 위해서는 smem 패키지가 가상서버에 설치되어 있어야 합니다.
① 웹서버가 가상서버에서 동작 중인지를 나타냅니다. 웹서버가 Active 상태가 아니면 권장 튜닝 값을 확인할 수 없습니다.
② 웹서버에 설정된 MPM method를 나타냅니다.
③ 가상서버의 RAM 사용률을 나타냅니다.
total RAM : 가상서버에 할당된 총 메모리
used RAM : 사용된 메모리
RAM used by httpd (total) : 전체 httpd 서비스가 실제로 점유하고 있는 메모리의 양
RAM used by single httpd proc (avg) : 하나의 httpd 프로세스가 사용하는 메모리의 평균값
RAM used by other processes (excepting httpd) : httpd 프로세스를 제외한 프로세스의 메모리 사용량
④ 가상서버의 메모리 사용량을 고려한 MPM 튜닝 값
해당 값은 절대적인 값이 아니며, 충분한 테스트를 통해 적용되어야 합니다.
(5) Syntax 체크 및 적용
Apache 웹서버 환경 파일의 구문이 맞는지 확인하기 위해 검사를 진행합니다.
"Syntax OK"가 뜨면 설정에 이상이 없음을 의미합니다.
Apache HTTP 웹서버를 재시작하여 설정을 적용합니다.
앞서 MPM 방식을 변경한 경우, 원하는 모듈로 동작 중인지 확인합니다.
Last updated