아파치 타임 아웃을 디버깅하는 방법?


14

을 사용하여 Apache 2.2 서버 (Ubuntu Server 10.04, 8x2GHz, 12Gb RAM)에서 PHP 웹 응용 프로그램을 실행합니다 prefork. 매일 Apache는 약 100k-200k 요청을 받고,이 약 100-200은 시간 제한에 도달하므로 (1,000 명당 약 1 개) 거의 모든 다른 요청이 시간 제한보다 훨씬 적게 제공됩니다.

왜 이런 일이 발생하는지 알 수 있습니까? 아니면 모든 요청의 작은 부분이 시간 초과되는 것이 정상입니까?

이것이 내가 지금까지 한 일입니다.

응답 시간 요청

보다시피, 타임 아웃 한계와보다 합리적인 요청 사이에있는 요청은 거의 없습니다. 현재 시간 제한은 50 초로 설정되어 있으며 이전에는 300으로 설정되었으며 일부 시간 제한과 동일한 상황이었고 다른 요청과의 격차가 여전히 컸습니다.

시간 초과되는 모든 요청은 AJAX요청이지만 대부분의 요청은 우연의 일치 일 수 있습니다. Apache 리턴 코드는입니다 200만 시간 제한에 도달했습니다. 그들은 다양한 IP에서 나온 것입니다.

나는 시간이 초과되는 요청을 살펴 보았고 특별한 요청은 없었습니다. 동일한 요청을 수행하면 1 초도 채 걸리지 않습니다.

원인을 찾을 수는 있지만 운이 없는지 알아보기 위해 다른 리소스를 살펴 보았습니다. 항상 사용 가능한 메모리가 충분합니다 (최소 약 3GB 사용 가능).로드는 1.4만큼 높고 CPU 사용률은 40 %입니다. 그러나 많은 시간 초과는로드 및 CPU 사용률이 낮을 때 발생합니다. 디스크 쓰기 / 읽기는 낮 동안 거의 일정합니다. MySQL 느린 쿼리 로그에는 항목이 없으며 (1 초 이상 기록하도록 설정) 요청이 없으면 많은 데이터베이스 쓰기 / 읽기가 사용됩니다.

시스템로드 / CPU로 응답 시간 요청

파란색은 CPU 사용률이며, 최대 40 %, 적갈색은 최대 1.4입니다. 따라서 CPU 사용률 /로드가 낮더라도 시간 초과가 발생하는 것을 볼 수 있습니다 (10 초 스파이크는 CPU 사용률과 잘 맞지만 또 다른 문제입니다. 문제의 원인이 무엇인지 알고 싶습니다).

Apache 오류 로그에 오류가 없으며 200 개가 넘는 활성 Apache 프로세스에 도달하는 것을 보지 못했습니다.

서버 설정 :

Timeout 50 
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2

<IfModule mpm_prefork_module>
    ServerLimit     350
    StartServers        20
    MinSpareServers     75
    MaxSpareServers     150
    MaxClients          320
    MaxRequestsPerChild 5000
</IfModule>

최신 정보:

변경 사항이없는 경우를 대비하여 Ubuntu 12.04.1로 업데이트했습니다. 설정으로 mod_reqtimeout을 추가했습니다.

RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500

이제 거의 모든 시간 초과가 10 초, 20 초에 1-2 초에 발생합니다. 나는 그것이 수신하는 데 문제가있는 요청 본문을 얻는다는 것을 의미한다고 생각합니까? 요청 본문은 수백 바이트보다 크지 않아야합니다. 1 초마다 네트워크 트래픽을 모니터링 한 결과 1Mbit / s보다 높지 않으며 서버가 1Gbit / s 라인에 있다고 생각하면 rxerrs 또는 rxdorps가 표시되지 않습니다. HopelessN00b가 게시했습니다. 잘못된 사용자 연결의 경우 일 수 있습니까?

매 시간마다 급상승의 경우 (그들은 조금씩 표류하는 것 같습니다. 위의 그래프에서 시간이 지난 33 분, 이제는 12 분이 지났습니다) 주기적으로 실행중인 것이 있는지 확인하려고 시도했습니다 ( 크론 등)하지만 아무것도 찾지 못했습니다. PHP 가비지 수집은 1 시간에 두 번 실행되지만 급증 시점에는 실행되지 않지만 여전히 사용 중지하려고 시도했지만 아무런 차이가 없습니다.

나는 dstat를 --top-cpu 및 top과 함께 사용하여 스파이크가 발생했을 때 프로세스를 보았고 나타나는 모든 것은 아파치가 몇 초 동안 열심히 일하지만 다른 프로세스가 중요한 CPU를 사용하지는 않습니다.

스파이크 그래프를 확대했습니다. 확대 된 요청 응답 시간

나에게 그것은 아파치가 몇 초 동안 멈추는 것처럼 보이고 중단 중에 들어오는 요청을 처리하기 위해 열심히 노력합니다. 그러한 중단의 원인은 무엇입니까, 아니면 잘못 해석합니까?


1
요청에 대한 그래프를 게시하고 싶지만 담당자가 너무 낮습니다.
레온

답변:


4

첫 번째로, 첫 번째 그래프를 살펴보면 문제에 기여할 수있는 시간별 약화가 있습니다 (1 시간 후 약 40 분 발생). OS / 데이터베이스에서 작업 스케줄러를 살펴 봐야합니다.

제공 한 데이터를 기반으로 다음 단계는 응답 시간의 빈도 (Y 축의 응답 수 대 X의 지속 시간)를 보지만 시간 초과 (또는 바람직하게는 한 번에 하나의 URL)를 나타내는 URL 만 포함하는 것입니다 ). 일반적인 시스템에서는 정규 또는 포아송 분포를 따라야합니다. 시간이 초과되는 요청은 단순히 테일의 일부일 수 있습니다.이 경우 일반적인 튜닝에 노력을 집중해야합니다. 배포가 바이 모달이면 OTOH 코드의 어딘가에서 경합을 찾아야합니다.


답변 주셔서 감사합니다. 시간별 속도 저하를 일으키는 원인을 찾고 있습니다. 그 동안 나는 이미 가지고있는 데이터의 빈도 표를 작성했습니다. 이것은 단지 (매우 유사하지만 다른 사람의 외모)이 타임 아웃 문제가있는 URL 중 하나입니다 : leela.kikora.no/apache_hist_show.png 시간 제한의 양입니다 십초보다 적게 소요에 비해 아주 작은, 그러나 그것은 본다 꼬리의 일부가 아닐 수도 있습니다. 그러나 다른 한편으로는 50 초 이상 걸리는 모든 것을 나타 내기 때문에 다음과 같이 보일 수 있습니다.
레온

3

나는 당신이 하루에 많은 요청을 받는다는 사실에 근거하여 이것에 대해 또 다른 생각을 가지고 있으며 피크 시간 동안 만 게시 한 그림에서 시간 초과가있는 것처럼 보입니다.

Server Fault 블로그에 게시물이 있습니다.Per Second Measurements Don't Cut It ... 이러한 요청 중 일부가 ServerFault 팀과 동일한 문제가 발생했을 가능성이 있습니까?

우리는 10-30MBit / s의 속도로 1Gbit / s 인터페이스에서 패킷을 매우 자주 버리고 성능을 저하시키는 것으로 나타났습니다. 이는 10-30MBit / s 속도가 실제로 1 분 속도로 변환 된 5 분당 전송 된 비트 수이기 때문입니다. Wireshark와 더 가까이 파고 1 밀리 초 IO 그래프를 사용할 때, 우리는 소위 1Gbit / s 인터페이스의 밀리 초당 1Mbit 속도를 자주 터뜨리는 것을 보았습니다.


흥미 롭습니다. 살펴 보겠습니다. mod_reqtimeout을 활성화하고 RequestReadTimeout header = 20-40, minrate = 500 및 RequestReadTimeout body = 10, minrate = 500으로 설정했으며 거의 ​​모든 시간 초과가 10 초에 발생합니다. 요청 본문이 너무 오래 걸리기 때문에 (본문은 최대 수백 바이트를 넘지 않아야 함) 일부 사용자가 연결이 잘못되었거나 서버 측에 혼잡이 있다고 말합니다.
레온
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.