
의 출력을 보면 top
간헐적으로 50% - 90% 사이에서 많은 양의 CPU를 소비하는 하나 또는 두 개의 Apache 프로세스가 있음을 알 수 있습니다.
CPU 사용량의 급증은 약 10초마다 매우 빠르게 나타났다가 사라집니다.
2~4% 정도를 소비하는 다양한 다른 Apache 프로세스가 실행되고 있습니다.
나는 어떤 가상호스트/웹사이트가 이러한 프로세스를 담당하는지 추적하기 위해 다양한 방법을 모두 조사했습니다. 그러나 그들은 빠르게 왔다가 가기 때문에 신뢰할 수 있는 방법을 찾을 수 없습니다.
나는 시도 lsof
하고 출력도 살펴봤지만 server-status
프로세스가 오래 지속되지 않기 때문에 프로세스 ID가 재사용되고 문제를 일으키는 가상 호스트에 연결할 수 없습니다.
예를 들어, lsof
문제의 프로세스 ID를 실행하면 지난 몇 초 동안 해당 프로세스 ID를 공유한 12개의 서로 다른 가상 호스트 로그 파일이 나열됩니다. 결함이 있는 가상 호스트가 하나 있다고 확신하지만 어느 호스트인지 알 수 없습니다.
또한 MySQL 느린 쿼리 로그를 확인한 결과 관심 있는 내용이 나타나지 않았습니다.
답변1
내 권장 사항: 로그에 응답 시간을 추가하세요.
스파이크를 유발하는 요청이 다른 요청보다 처리하는 데 시간이 더 오래 걸린다는 보장이 없기 때문에 완벽하지는 않지만 가능성이 높으며 조사를 위한 출발점을 제공합니다.
이를 수행하려면 %D 매개변수를 포함하는 새로운 LogFormat 및 CustomLog를 정의해야 합니다. 아파치 보기mod_log_config 문서.
아마도 너무 낮은 수준이지만 로드의 특성에 대한 아이디어를 제공할 수 있는 또 다른 옵션은 -f를 사용하여 하위 프로세스를 추적하고 -c를 사용하여 호출당 CPU 시간을 표시하는 것입니다. , 예:strace -f -c -p <apache parent pid>
가장 많은 시간이 걸리는 시스템 호출을 알고 나면 이를 직접 추적할 수 있습니다. 예를 들어, 서버가 write()를 수행하는 데 많은 시간을 소비한다고 가정하면, 그런 다음 을 수행 strace -f -e trace=write -p <apache parent pid>
하고 해당 호출을 더 자세히 살펴볼 수 있습니다.