Apache 메모리 사용량 및 평균 프로세스 크기 값 줄이기

Apache 메모리 사용량 및 평균 프로세스 크기 값 줄이기

질문이 조금 길다는 것을 알고 있지만 제가 관찰한 모든 측면을 설명하기로 결정했습니다.

저는 Linux 서버를 사용하고 있으며, 사용된 OS는 Ubuntu 14.04이며, 모든 나머지 구성은 아래에 정의되어 있습니다. 이 웹 서버는 PHP로 구축된 애플리케이션을 제공하는 데 사용되며 Databse는 RDS를 통해 호스팅됩니다. 피크 시간에는 평균적으로 서버에 거의 200개의 동시 요청이 있으며, 결국 메모리 사용률은 100%가 됩니다. 이 응용 프로그램으로 인해 매우 느려지거나 때로는 오류로 응답합니다. 그래서 나는 이 문제를 해결하기 위해 아래에 나열된 몇 가지 단계를 수행하고 아파치를 조정하고 이상한 상황에 대해 제한하려고 노력했습니다.

운영체제

이름="우분투" VERSION="14.04.5 LTS

서버 구성

CPU: 8코어
RAM: 15GB
하드웨어 공급자: AWS
인스턴스 유형: c4.2xlarge

Apache.Conf 매개변수(2.4)

제한 시간 300
KeepAlive 켜짐
MaxKeepAliveRequests 100
KeepAliveTimeout 5
HostnameLookups 꺼짐
LogLevel 경고
AllowOverride 모두(응용 프로그램의 문서 루트용)

사용된 MPM: 프리포크

MPM_PREFORK.CONF

StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 256
MaxConnectionsPerChild 200

Mods_활성화됨

access_compat.load autoindex.load mime.load setenvif.load alias.conf deflate.conf mpm_prefork.conf socache_shmcb.load alias.load deflate.load mpm_prefork.load ssl.conf authn_core.load dir.conf 협상.conf ssl.load authn_file. load dir.load 협상.load status.conf authz_core.load env.load php5.conf status.load authz_host.load filter.load php5.load authz_user.load headers.load rewrite.load autoindex.conf mime.conf setenvif.conf

평균 Apache 프로세스 크기

사용된 명령:

sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}' <br/>

Apache 메모리 사용량(MB): 7227.66
평균 프로세스 크기(MB): 314.246

MaxRequestWorkers 계산

X = Apache에 할당하려는 전용 RAM(13GB): 13312MB
Y = 서버를 통해 지난 15일 동안 모니터링하고 있는 평균 프로세스 크기: 314.246
MaxRequestWorkers = X/Y = 대략 40

사용된 MPM: 프리포크

수정된 MPM_PREFORK.CONF

StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 40
MaxConnectionsPerChild 8

이제 Apache가 시작되면 5개의 startservers 프로세스가 시작되고 각 startserver 프로세스는 8개의 하위 연결을 시작하므로 총 40개의 동시 연결이 서버에 생성될 수 있습니다. MaxRequestWorkers는 40개로 제한되며 동시 요청 수는 40개를 초과하지 않습니다. 이는 DOS, DDOS의 경우 최대 13GB RAM을 점유하여 서버가 중단되는 것을 방지하고 서버에 2GB RAM을 여유 공간으로 남겨둡니다.
MaxConnectionsPerChild 매개변수에 대해서도 명확하지 않습니다. 이 매개변수를 잘못 사용하고 있다면 수정해 주시기 바랍니다.

PHP.INI 매개변수(php5)

OLD
output_buffering = 4096
max_execution_time = 60
memory_limit = -1
log_errors = On

NEW
Output_buffering = 4096
max_execution_time = 60
memory_limit = 64M
log_errors = On

내가 여전히 직면하고 있는 문제들

mpm_prefork_conf 메모리 사용률을 변경한 후 서버는 MaxRequestWorkers 매개변수로 인해 많은 클라이언트에 503 오류로 응답합니다. 각 Apache 프로세스가 315MB의 RAM을 사용하는 이유를 알아내려고 약 2일 동안 검색했지만 이 문제를 추가로 해결하기 위한 올바른 경로를 찾을 수 없었습니다. 그래서 마침내 여기에 이것을 게시했습니다. 이제 두 가지 옵션이 있습니다.

  1. Apache 평균 프로세스 제한을 최적화하고 MaxRequestWorkers 제한을 늘립니다.

  2. RAM을 늘리고 평균 프로세스 크기가 동일한 클라이언트에 서비스를 제공하는 것은 올바른 선택이 아니라고 생각합니다.

PHP로 아파치의 평균 프로세스 크기를 식별하고 줄이는 방법에 대한 올바른 제안을 친절하게 안내해 주십시오. 진솔한 답변만 부탁드립니다.

답변1

이보다 훨씬 더 나아질 수는 없다고 생각합니다. php-fpm을 사용하는 경로를 택하면 비동적 콘텐츠 로드가 훨씬 빠르고 메모리 소모도 줄어듭니다. 이것을 발견했습니다가이드(digitalocean.com), 좋은 추천을 제공합니다. 확인할 수 있는 것은 Apache에서 Keepalive 시간을 변경하는 것입니다.여기

답변2

이는 아파치 프로세스당 상당히 많은 메모리를 차지합니다. 그리고 Ubuntu 14.0.4는 2019년에 EOL되었습니다.

게시한 구성에서 비명을 지르는 내용은 다음과 같습니다.

KeepAliveTimeout 5

이를 1로 변경합니다. 활성 프로세스의 절반 이상이 현재 연결 유지 시간 초과를 기다리며 아무 작업도 하지 않고 있음을 알 수 있습니다.

트래픽 분석을 시작하세요. 모든 정적 콘텐츠를 캐시할 수 있는지 확인하세요.

아파치 구성을 살펴보세요. 사용하지 않는 모듈을 로드하고 있지 않은지 확인하세요.

PHP에 대한 기본 시간을 설정했고 스크립트가 오류 보고를 비활성화하지 않았는지 확인하세요. 오류 로그를 확인하고 오류를 정리하세요. Apache에서 ListenBacklog를 조정해 보세요.

MaxConnectionsPerChild 8

왜? 이것은매우낮은. Apache는 일반적으로 매우 안정적입니다. Apache가 포크해야 하는 횟수를 줄여서 용량을 늘리려면 이 값을 100까지 늘릴 수 있어야 합니다. 이 값을 변경하면 애플리케이션 오류율에 영향을 미치는 경우 잘못 코딩된 영구 데이터베이스 연결이 없는지 확인하세요. 메모리 사용량에 영향을 미치는 경우 패치가 최신 상태인지 확인하세요.

관련 정보