2009-12-03 2 views
0

일반적으로 어떤 일이 발생하는지는 요청이 백업되는 것처럼 보입니다. 결국 아파치는 메모리와 CPU를 소비하기 시작하여 결국 RAM이 부족해지면서 모든 아파치 프로세스가 종료되어 모든 방문자에게 웹 사이트가 남지 않게됩니다.웹 사이트가 바쁠 때 apache2가 중단되는 것을 어떻게 막을 수 있습니까?

이것은 내가 말하는 사람들의 공통된 문제인 것처럼 보입니다.하지만 해결책을 찾지 못하는 것 같습니다.

많은 도움을 주셨습니다.

답변

0

오히려 간단한 방법은 사이트에 액세스 할 수있는 사용자 수를 제한하는 것입니다. 실제 구성은 사용중인 MPM에 따라 다릅니다. 하지만 일반적으로 일반적인 유닉스 아파치 mpms (prefork 및 worker)의 경우 MaxClients (http://httpd.apache.org/docs/2.2/en/mod/mpm_common.html#maxclients)가됩니다. 당신이 prefork의를 사용하는 경우

또한, 그것은 더 빠른대로, 노동자-MPM로 전환하는 것 같아서 예

1

(그러나 모든 모듈이 스레드 안전이이어야합니다, 예를 들어, 이전의 PHP 버전은 없습니다) 이것은 일반적인 문제입니다. 대부분의 사람들이 아파치 지식/시스템 지식을 끝내는 지점이기도합니다 :-)

긴 주제입니다. 첫째, 행동을 재현하거나 자주 볼 수 있습니까? 또는 "때때로"발생하고 아무것도 디버깅하기에는 너무 늦은 경우에만 알 수 있습니까?

문제는 로그를 분석하여 사후 분석이 가능하지만 이전에 이벤트를 준비해야 할 필요가 있지만 검색 할 내용을 모르는 경우 더 많은 작업이 될 수 있습니다.

리소스 병목 현상이 어디에 있는지 알아 보려면 mod_status를 활성화하고 localhost 또는 신뢰할 수있는 위치에서 액세스 가능하게 만들고 서버 상태 (/ server-status)를 확인하는 것이 좋습니다. 아파치가 "너무 늦다"거나 더 이상 반응하지 않을 때 서버 상태를 보는 것은 불가능할 수도 있지만 흥미로운 데이터를 수집 할 수 있습니다.

"mysql"질문에 태그를 추가했기 때문에 Apache가 기다려야하는 백엔드 데이터베이스가 있다면 또 하나의 질문이 될 것입니다. 약간의 mysql 튜닝은 모든 문제를 해결할 수 있지만, 이는 여러분이 보는 실패의 가능성 중 하나 일뿐입니다. 서버 상태, 약간의 "상위"출력 및 mysqls의 느린 쿼리 로그를 로깅하면 이에 대한 통찰력을 얻을 수 있습니다. 또한 mysql의 메모리 구성을 확인하십시오. 이미 처리되지 않았을 수도 있습니다.

마지막으로, 아파치가 너무 많은 메모리를 사용하지 않도록하거나, 요청을 대기열에 넣거나, 컴퓨터가 스왑을 시작하고 마침내 아파치 (또는 다른 것)를 죽이게하는 것이 중요합니다. 각 아파치 prozess가 필요로하는 메모리를 계산하십시오. 이는 프로세스 상태에서 쉽게 볼 수 없지만이 스크립트로 계산할 수 있습니다 (http://cmdline.net/misc/httpd2-memusage). 그런 다음 시스템이 Apache 프로세스에 최대로 소비 할 수있는 메모리 양과 그에 따라 MaxClients를 설정하십시오. 그러면 Apache가 사용 가능한 것 이상을 사용하지 않게됩니다. (평균 프로세스의 RAM 필요량에 프로세스 수, 간단한 수학을 곱하면됩니다.) 다른 크기 조정 지시어도 조정해야 할 필요가 있으므로 MaxClients와 일치해야합니다. 이것은 많은 설정에서 부족한 부분이지만 작은 "폭발"에 대한 필수적인 보호입니다.

마지막으로 아파치가 상대적으로 사용량이 많습니까? 그런 다음 KeepaliveTimeout을 2 초로 줄이기 위해 거의 맹목적으로 권장 할 수 있습니다.

+0

바쁜 시간에 drupal CMS의 캐시를 지워서 재생할 수 있습니다. 이로 인해 데이터베이스로드가 상당히 증가합니다. KeepAlive를 5-2 초에서 줄였습니다. 이것이 많은 차이를 만들지 확실하지 않습니다. 나 또한 fastcgi를 통해 PHP를 사용하는 MPM-worker 버전으로 apache의 preform 버전을 스와핑 해 보았습니다. 비록 페이지 응답 시간이 조금 더 빠르다고 생각하기는하지만 큰 차이는 없었습니다. – cjm2671

+0

이것은 모두 도움이됩니다. 고마워, Peter Poeml. 이 게시물은 좀 오래된 것으로 알고 있지만 KeepaliveTimeout = 2의 이점에 대해 의견을 말씀해 주시겠습니까? 실행 프로세스를 중지하여 빌드되지 않도록하는 것이 간단합니까? –

0

"hanging"을 통해 데이터베이스가 문제를 일으킬 수있는 것처럼 들립니다. 이를 위해 KeepAlive와 MPM 유형 모두 차이를 만들지 않습니다.

테이블이 MyISAM 엔진이 아닌 InnoDB 엔진을 사용하는지 확인하십시오. MyISAM은 무작위 적으로 테이블 최적화를 "최적화"할 것이고, 큰 테이블의 경우 몇 분이 걸릴 수도 있습니다. 아파치가 멈추는 "병적 인"상황이 될 수 있습니다. -> "테이블 상태 표시"

데이터베이스에 할당 된 메모리 부족이 다음에 확인해야 할 것입니다. /etc/my.cnf는 일반적으로 매우 작은 기본값으로 제공됩니다. 테이블이 InnoDB 엔진을 사용하는 경우, 너무 작은 innodb_buffer_pool_size 값이 원인 일 수 있습니다. 아마도 여분의 메모리가 더있을 것입니다. 테이블 상태는 데이터의 실제 크기에 대한 세부 사항을 제공합니다.

관련 문제