을 사용하여 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 사용률이며, 최대 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를 사용하지는 않습니다.
스파이크 그래프를 확대했습니다.
나에게 그것은 아파치가 몇 초 동안 멈추는 것처럼 보이고 중단 중에 들어오는 요청을 처리하기 위해 열심히 노력합니다. 그러한 중단의 원인은 무엇입니까, 아니면 잘못 해석합니까?