유닉스 웹 서버에서 메모리 사용량을 줄이는 방법


36

현재 Joyent Accelerator를 사용하여 웹 응용 프로그램을 호스팅하고 있지만 제대로 작동하지만 비용을 줄여야하므로 현재 계획을 다운 그레이드하고 새로운 메모리 제한 (256M rss, 512M 스왑)을 부과합니다. 나는 어제 너무 많이 넘지 않았지만 오늘 Apache를 여러 번 다시 시작한 후에는 411M rss, 721M 스왑 (prstat -Z -s cpu)입니다.

Server Fault에서 검색하면 서버를 모니터링하는 다양한 방법과 특정 도구 만 제공되지만 메모리 사용을 줄이거 나 최적화하는 방법에 대한 조언은 없습니다. 나는 또한 이 질문 을 보았지만이 특정 상황 (또는 일반적인 말로 말할 수 있습니까?)에 좋지 않다고 생각합니다.

서버가 공유 CPU에서 Solaris를 실행 중이며 Apache + MySQL + PHP 스택을 사용하고 있습니다.

문제를 해결하고 문제를 해결하기 위해 취할 수있는 단계를 알고 싶습니다. 그러나 메모리 부족 프린트를 낮추고 현재가 끝나기 전에 계획을 다운 그레이드 할 시간이 없기 때문에 마술을 만들고 하루를 절약 할 수있는 모든 것을 환영합니다 :)


1
방금 인터넷에서 이러한 설정에 대해 배웠지 만 하나의 파일에서 설정을 변경하고 있지만 나중에로드 된 다른 구성 파일이 실제로 내 설정을 무시하고 있다고 언급하고 싶었습니다. 그 사실을 알게되면 prefork MPM 설정과 몇 가지 다른 것들을 설정하면 프로세스 수와 메모리 사용량을 최소한으로 바꾸어 제어 할 수 있습니다. 이 정보가 다른 사람들, 특히 서버에서 젠투를 실행하는 사람들에게 도움이되기를 바랍니다.
Pistos

답변:


23

답변 해 주셔서 감사합니다. 귀하의 제안에 따라 코드를 건드리지 않고 메모리 사용을 195M SWAP 및 108M RSS로 줄일 수있었습니다 (곧 곧 최적화 할 것이지만 이것은 문제를 빨리 해결할 수있는 해결책이었습니다).

내가 한 일의 목록은 다음과 같습니다.

VirtualHost 항목에 사용 된 와일드 카드를 제거했습니다. * : 80 및 * : 443 대신 서버의 실제 IP를 사용했습니다.

Apache의 prefork MPM을 변경했습니다. 이것들은 내가 사용하여 얻은 값입니다.

스타트 서버 1
MinSpareServers 1 
MaxSpareServers 5 
서버 제한 16
최대 고객 16
MaxRequestsPerChild 0
청취 백 로그 100

이것들은 결코 마법의 숫자가 아닙니다. 나는 다른 값과 조합을 시도한 다음 내 서버의 실제 사용량에 대해 테스트하고 모든 사람들이 자신의 환경에서 똑같이해야합니다. 기록을 위해, 내 서버는 매월 2M pvs에 달하는 동적 페이지와 자산을 정기적 인 속도로 제공합니다. 다시 한 번 의도는 성능이나 HA를 개선하지 않고 메모리 공간을 줄이는 것이 었습니다.

참고:

Apache의 KeepAlive를 조정했습니다. KeepAliveTimeout더 낮은 값으로 설정 하면 (필자의 경우 2) 더 이상 콘텐츠를 요청하지 않을 수있는 유휴 클라이언트와의 연결을 기다리는 서버 프로세스가 줄어 듭니다.

참조 : http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

MySQL의 사용하지 않는 모듈을 제거했습니다. skip-innodbMySQL의 my.cnf에 추가 했습니다. 대규모 메모리 소비 감소


개인적으로 할 수 없었던 훌륭한 제안도 있습니다.

  • 필요하지 않은 PHP 모듈을 제거하십시오. 내 서버의 PHP에는 대부분의 모드가 이미 컴파일되어 있으므로 다른 VPS에서 내 자신의 최소 PHP를 시도 할 것입니다.
  • php-fastcgi를 사용하여 nginx로 전환하십시오. 그것은 곧 시도 할 또 다른 좋은 조언이지만, 지금은 다운 타임을 위험에 빠뜨릴 수 없습니다.

nginx와 php-fastcgi (LEMP)를 실행 중이며 비슷한 메모리 문제가 발생합니다 ... 256MB 서버에서 php-fastcgi가 PHP_FCGI_CHILDREN = 5 및 PHP_FCGI_MAX_REQUESTS = 333과 잘 작동한다는 것을 알았습니다 ...이 값은 좋은 시작입니다 포인트!
farinspace

Got rid of the wildcard used in VirtualHost entries실제로 의미있는 방식으로 도움이됩니까? 나는 차이를 만들지 않을 것이라는 인상을 받았다.
Mahn

@Mahn-메모리에 도움이되지 않지만 CPU 사용량을 향상시킵니다. 이는 저 메모리 환경에서 좋은 것입니다
jsnfwlr

"php-fastcgi로 nginx로 전환"--- Apache2를 유지하려면 덜 과감하지만 효과적인 옵션은 다음과 같습니다. Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event는 nginx와 유사합니다. 이것을 사용하여 php-fpm에 연결하십시오. dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
James Johnston


4

실행중인 아파치 서버 프로세스 수를 제한해야하며 현재 한계에 근접하면 사용량이 많은 트래픽을 처리 할 수 ​​없습니다. 일반적으로 웹 서버를 사용하는 것은 일반적으로 나쁜 생각 (tm)입니다. 웹 트래픽은 대부분 슬래시 도트 (slagdotted) 또는 발굴 또는 불 덩어리 (fireball) 등을 얻을 때까지 훌륭하고 낮기 때문입니다.

주요 문제는 PHP 응용 프로그램 만 배포했으며 PHP는 스레드 안전하지 않기 때문에 한 지점에서 실행되는 아파치 프로세스의 수입니다. 여기서는 prefork를 가정합니다. 작업자 MPM의 치수를 정한 경험이 없습니다. 공유 메모리에있는 항목과 각 프로세스의 메모리에있는 항목이 있습니다.

필요하지 않은 공유 모듈을 제거하여 총 메모리 공간을 줄일 수 있습니다. 기본적으로 Apache는 대부분의 호스트에서 태양 아래 모든 것을 수행하도록 구성되어 있습니다. mod_userdir을 사용하지 않는다면 아파치 설정에서 주석 처리하십시오. 필요한 것 중 일부 또는 그 종속성이 직관적이지 않기 때문에 얼마나 제거해야하는지주의하십시오! 모든 모듈은 apache.org 웹 사이트에 문서화되어야합니다. 프로세스 당 풋 프린트는 작아지기 어렵습니다. 요즘 대부분의 아파치 구성에는 컴파일 된 4 개의 필수 모듈 만 제공됩니다.이 4 개의 모듈 외에도 대부분의 메모리 사용량은 효과적으로 가비지 수집되지 않은 누수 또는 응용 프로그램 RAM에서 발생하므로 요청 수를 설정해야 할 수 있습니다. 각 프로세스가 낮게 처리합니다.

당신은 정말 RAM 자체 메모리 사용을 유지하려면 및 스왑으로 이동하지. 스왑은 I / O를 의미합니다. I / O는 느리고 스왑에서 무언가가 섞일 때까지 기다리는 동안 프로세스 블록으로 지붕을 통해 CPU 사용을 유도합니다.


1
조언 Karl에게 감사합니다! 서버가 스왑을 사용하지 못하게하는 방법이 있습니까? 메모리 사용량을 줄인 후에는 더 이상 RAM이 부족하지만 여전히 SWAP 메모리가 사용되고 있음을 보여줍니다.
리마

@fandelost 스왑이 사용되는 것은 중요하지 않습니다. 스왑이 페이지 스왑 및 아웃 될 때 나쁜 상태입니다. 운영 체제는 명령 및 데이터가 더 낫다고 생각하기 때문에 시간이 필요할 때 자주 실행되지 않는 프로세스의 명령 또는 데이터를 교체 할 수 있습니다.
Patrick James McDougle

2

아파치의 경우 추가 메모리 만 사용하므로 사용하지 않는 모듈을 제거하십시오. MySQL의 경우, innodb / bbdb를 사용하지 않으면 제거하고 필요없는 PHP 모듈을 제거하십시오.

다음으로 한 프로세스의 크기와 아파치에 제공 할 메모리 양을 기반으로 아파치 MaxClient를 구성해야합니다. MySQL의 최대 연결도 마찬가지입니다. 우수한 MySQL Tuning Primer Script를 권장합니다 .

PHP 앱을 제어 할 수있는 경우 너무 많은 메모리를 사용하지 않아야합니다 (예 : 변수, 특히 정적 메모리).

더 나아가고 싶다면 apache + mod_php를 nginx + fcgi 설정으로 바꾸면 메모리가 더 줄어 듭니다.

마지막으로 웹 서버에서 교환하고 싶지 않습니다. 불필요한 것을 제거하기 위해 조금만 웹 서버에서 정기적으로 바꾸면 응답하지 않는 웹 사이트가됩니다.


귀하의 조언 yhager에 감사드립니다, tuning-primer.sh를 시도하고 있지만 "94 행의 구문 오류 :`cnf_socket = $ '예기치 않은"오류가 발생합니다. 어떤 아이디어?
lima

껍질과 관련이있을 수 있습니다. 이 스크립트는 Linux와 관련이있을 수 있으므로 / bin / sh 대신 bash를 가리 키도록 첫 번째 행을 변경하십시오. 솔라리스에 bash를 설치할 수 있기를 바랍니다.하지만 도움이되지 않습니다 ...
yhager

2

이미 목표를 달성 했으므로 몇 가지 추가 사항이 있습니다.

불필요한 PHP 모듈을 모두 제거 했으므로 아파치와 동일하게 할 수 있습니다. 기본적으로 (설치에 따라) 아파치는 많은 추가 모듈을로드하며 대부분의 모듈은 실제로 일상적인 사용에 필요하지 않습니다. 예를 들어, 항상로드되는 인증 모듈이 있습니다. 대역폭 사용량을 제한하지 않는 한 일반적으로 deflate는 필요하지 않습니다. 자동 색인 및 상태도 의심됩니다.

또 다른 하나는 php.ini에서 PHP에 사용 가능한 메모리 양을 제한 할 수 있다는 것입니다. memory_limit = xxxM


0

물론 아파치가 처리 할 수있는 프로세스 수를 제한 할 수 있지만 이는 메모리 사용에 대한 하드도 제한으로 만 작동합니다. 하위 레벨 관점에서 plimit 를 사용 하여 프로세스에 사용 가능한 자원을 제한 할 수 있습니다 . 이것을 부모와 자식 프로세스에 적용하십시오.

그러나 웹 서버 구성 관점에서 코드가 실제로 어떻게 실행되는지에 따라 다를 수 있습니다! 그러나 .htaccess 파일 사용과 같은 작은 것들은 중앙 아파치 구성 파일을 사용하는 것 (요청이 올 때마다 읽히므로 오버 헤드가 커짐)보다 큰 리소스를 사용한다는 것을 명심하십시오. 이는 큰 웹 사이트에서 의미가 있습니다.


0

시간이 지남에 따라 메모리 증가에 도움이 될 수있는 한 가지 방법은 httpd keepalive를 낮추는 것이지만 응용 프로그램의 수명이 더 긴 프로세스가 필요한 경우 신중하게 테스트합니다.


0

서버가 공유 CPU에서 Solaris를 실행 중이며 Apache + MySQL + PHP 스택을 사용하고 있습니다.

Solaris에 대한 경험이 없지만 Apache / mod_php를 사용하지 않는 것이 가장 좋습니다.

  • php-fastcgi를 사용하여 nginx로 전환하십시오.
  • 최소한의 플러그인을 사용하도록 PHP를 다시 컴파일하십시오.
  • ntpd (ntpdate 사용), ftp (scp 사용) 등과 같은 불필요한 프로세스를 제거하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.