만족

[Apache] prefork에서 event 기반 mpm으로 변경하기 본문

[Apache] prefork에서 event 기반 mpm으로 변경하기

Backend/기타 Satisfaction 2022. 10. 30. 20:45

 

웹 서버를 구성할 때 가장 간단하면서 흔한 LAMP Stack(Linux, Apache, Mysql, Php)를 사용하고 별다른 설정을 하지 않았다면 이 포스트가 도움이 될 것이다.

 

기본적으로 prefork기반의 mpm을 사용하게 되는데,

prefork방식은 요청 1개가 프로세스 1개에 대응되기 때문에 사용자가 늘어날 수록 메모리 사용량이 급증한다.

(30~40%정도의 메모리를 사용하고 프로세스의 갯수도 매우 많다)

 

나 역시 이 문제를 해결하기 위해 event기반 mpm으로 변경했다.

 

mpm은 어떤 종류가 있을까?

종류별로 어떤 장단점이 있을까?

어떻게 변경할 수 있을까?

 

한번 알아보자

 

Apache mpm

prefork (기본값)

프리포크 방식은 한 개의 프로세스가 한 개의 연결을 처리한다.

아파치 설치 시 기본 지정된 mpm이고, 연결이 들어왔을 때 프로세스를 복제한 후 연결을 처리하게 된다.

따라서 프로세스 복제 과정에서 오버헤드가 생기고, 메모리 역시 배로 소모한다.

하지만 이처럼 메모리를 공유하지 않고 프로세스 자체를 복제해 실행하기 때문에 치명적인 문제가 발생하더라도 다른 연결에는 영향을 미치지 못해 안정적이고, 멀티 스레딩을 지원하지 않는 레거시 모듈을 사용할 수 있다.

 

worker

워커 방식은 한 개의 스레드가 한 개의 연결을 처리한다.

프로세스 내에 존재하는 스레드들 하나하나가 각각의 요청을 처리한다.

프리포크처럼 프로세스 복제라는 무거운 작업 대신, 미리 생성된 프로세스 내의 스레드가 연결을 처리하기 때문에 빠르고 자원(메모리, CPU ...)을 훨씬 덜 소모한다.

따라서 사용자가 많을 때 prefork보다 훨씬 빠르고 가볍게 동작할 수 있다.

 

event

워커 방식에서 프로세스가 N개의 스레드를 가지고 있고, 이 프로세스가 여러개 존재한다.

따라서 설정한 프로세스가 사용되지 않을 때에도 그만큼의 스레드와 프로세스가 자원을 잡아먹는다.

프로세스 수(총 스레드 수= 프로세스 수* 프로세스당 스레드 수) 를 늘릴 경우 stress 상태에서는 유용하지만 idle상태에서는 과도할 수 있다.

이벤트 방식은 워커 방식에서 발전된 형태로,

일정 시간 이상 프로세스가 사용되지 않을 경우 kill하고 다시 필요할 때엔 다시 생성하여 필요할 때만 자원 사용량을 늘려줄 수 있다.

 

LAMP 스택에서 event mpm 사용

이 포스트에서는 Linux 18.04와 apache 2.4.18, php 7.2를 기준으로 설명한다.

(만 나의 경우 리눅스 버전이 16.04, php 7.0 임에도 정상적으로 가능했다)

 

sudo systemctl stop apache2

먼저 실행중인 apache2를 정지시킨다.

//php 비활성화
sudo a2dismod php7.2

//mpm_prefork 비활성화 및 mpm_event 활성화
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event

php를 비활성화하고, mpm_prefork를 끄고 mpm_event를 활성화시킨다.

 

만약 php의 버전이 7.2가 아닐 경우 

php -v

로 버전을 확인한 후 해당 버전에 맞는 값으로 바꾸고 실행한다

sudo a2dismod php[VERSION]

이제 php를 이벤트 방식으로 동작할 수 있게 해 주는 모듈을 설치 및 활성화할 것이다.

sudo apt install php-fpm
sudo apt install libapache2-mod-fcgid

# php 버전 변경
sudo a2enconf php7.2-fpm
sudo a2enmod proxy
sudo a2enmod proxy_fcgi

php-fpm은 php를 FastCGI방식으로 동작하게 해 주며,

이것이 apache와 통신하기 위해 libapache2-mod-fcgid 를 사용한다.

 

변경한 설정이 정상적인지 확인하기 위해 아래 커맨드를 사용한다

sudo apachectl configtest

오류가 없다면 아파치를 재시작한다.

sudo systemctl restart apache2

 

모니터링

 

prefork에서 event방식으로 변경하자 메모리(2번째 열)와 프로세스 갯수(4번째 열)가 급격히 줄어든 것을 볼 수 있다.

 

훨씬 적은 자원을 사용하여 동일한 요청 수를 처리할 수 있게 되었다.

 

참고글

 

https://mytory.net/2021/05/06/apache-mpm.html

 

아파치 MPM 유형 설명 - prefork, worker, event

event가 가장 효율적이다. prefork는 쓰레드를 지원하지 않는 어플리케이션을 사용하는 경우 쓰는데 메모리를 많이 먹는다. worker는 중간.

mytory.net

https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04

 

How To Configure Apache HTTP with MPM Event and PHP-FPM on Ubuntu 18.04 | DigitalOcean

 

www.digitalocean.com

 



Comments