2008-10-06 6 views
10

우리는 하루에 수십만 개의 페이지 뷰를 얻는 중간 규모 사이트를 운영합니다. 지난 주말까지는 가상 시스템에서 일반적으로 0.2 미만의로드로 실행되었습니다. OS는 우분투입니다.Apache가 과도한 CPU를 사용합니다.

응용 프로그램의 최신 버전을 배포 할 때 배포하기 전에 apt-get dist-upgrade도 수행했습니다. 우리가 배치 한 후에 우리는 CPU로드가 급격히 증가했다 (때로는 10에 도달하고 페이지 요청에 응답하지 않는 것으로 나타남).

우리는 PHP에서 Xdebug 프로파일 링 데이터 1 분을 덤프하려고 시도했지만 약간의 느린 부분 만 보여 주었지만 거대한 점프를 설명 할 수는 없었습니다.

우리 웹 사이트의 새 버전에서는 문제가 발생하지 않는다고 확신하지만 확신 할 방법이 없습니다. 우리는 많은 변화를 되 돌렸지 만, 문제는 여전히 지속됩니다.

프로세스를 살펴보면 단일 Apache 프로세스가 엄격하게 필요한 것보다 오랜 시간 동안 상당히 많은 CPU를 사용한다는 것을 알 수 있습니다. 영향을받는 과정에서의 strace를 사용하는 경우 그러나, 우리는

accept(3, 

하지만 아무것도 볼 수 없다 그것은 새로운 연결을 받기 전에 잠시 동안 응답하지 않는다, 그래서 우리는 실제로 문제를 일으키는 것을 볼 수 없습니다.

스택은 PHP 5, Apache 2 (prefork), MySQL 5.1입니다. 대부분은 Memcached를 통해 실행됩니다. APC와 eAccelerator를 사용해 보았습니다.

그래서 다음 단계는 무엇입니까? 우리가 간과하거나 모르는 프로파일 링 방법이 있습니까?

+0

어떤 버전의 시스템을 업그레이드 했습니까? 나는 a) PHP, b) 아파치와 c) memcached를 의미한다. – Georgi

+0

불행히도 그 기록이 없습니다. 내가 아는 한 적절한 apt-get/aptitude 로그가 없습니다. –

답변

11

대답이 아파치와 관련이 없습니다. 언급했듯이, 우리는 가상 머신에있었습니다. 우리의 사용자 세션은 꽤 큽니다 (활성 사용자 당 500kB라고 생각하기 때문에). 우리는 많은 디스크 IO를 가지고있었습니다. 디스크가 거의 꽉 찼기 때문에 우분투는 많은 시간을 (또는 우리가 생각한 것처럼) 움직이는데 많은 시간을 보냈습니다. 디스크를 쉽게 확장 할 수있는 방법이 없었습니다 (VMWare에서 제대로 설정되지 않았기 때문에). 이것은 완전히 성능을 떨어 뜨 렸고, 아파치와 MySQL은 간혹 100 % CPU를 사용하고 (매우 짧은 시간 동안), 시스템이 너무 느려서 CPU 사용량 미터를 업데이트하지 못하는 것으로 보입니다.

새 VM을 설치하기 시작했습니다 (서버의 모든 것을 문서화 할 수있는 기회도되었습니다). 새 VM에서는 충분한 디스크 공간을 할당하고 세션을 메모리로 이동했습니다 (memcached 사용). 사용량이 적을 때는 부하가 0.2로 떨어졌고 피크 사용량이 거의 1에 가까워졌습니다 (2 CPU VM에서). 세션을 memcached로 옮기는 작업은 많은 디스크 IO를 필요로합니다 (우리는 지속적으로 약 2MB/s의 디스크 IO를 사용하여 매우 나빴습니다).

결론; 때로는 처음부터 다시 시작해야합니다. :)

1

어쩌면 당신은 이전에 작업자 MPM을 사용하고 있지 않았습니까?

PHP5가 Worker MPM과 작동하지 않는다는 것을 알고 있습니다. 내 우분투 서버에서 PHP5는 Prefork MPM과 함께 설치해야합니다. 그것은 PHP5 모듈 아파치의 멀티 스레딩 버전과 호환되지 않는 것 같습니다.

나는 어떻게 MPM은 here을 볼 무엇 노동자 보려면 mod_fcgid

으로 더 나은 성능을 얻을 표시됩니다 여기에 링크를 발견했다.

+0

prefork를 사용하여 Apache가 실행 중입니다. PHP는 잘 작동합니다. –

+0

아이디어가 없다면 이전 버전의 응용 프로그램에서 php4를 사용하고 php5 apapche로 올라가는 것이 prefork 모드로 실행되고 있기 때문에 php4를 사용했을 수도 있습니다. 이전 버전의 응용 프로그램이 php4를 사용 했습니까? –

+0

어쩌면 약 한 달이 지난 것일 수 있습니다. 모든 배포 전에 업그레이드를 수행합니다. 우리는이 문제 이후에 그 일을 그만 둘 수도 있습니다. :) –

1

dTrace를 사용하면이 수수께끼를 해결할 수 있습니다 ... Solaris 또는 Mac에서 실행 중이면 Linux가 없기 때문에 Systemtap을 시도 할 수도 있지만 아무 말도 할 수 없습니다. 내가 사용하지 않았기 때문에 유용성에 대해.

는 DTrace를 사용하면 쉽게 하루 만에 범인을 빼낼 수 있고,이

+0

Systemtap이 지금은 조금 복잡해 보입니다. –

0

난 당신이 좋은을 할 것입니다 확신 할 수없는 또 다른 옵션은 비슷한 것 시스템 탭과 희망, 그러나 그것은 가치보다 더 노력. 새 버전에 대한 자세한 변경 내역을 읽고 원격으로 영향을 미칠 수있는 변경 사항을 검토하는 것입니다.

변경 내역을 살펴보면 두 번 이상 나를 저장했습니다. 특히 일부 설정 옵션이 변경되거나 무언가가 사용 중단 될 때 특히 그렇습니다. 최악의 경우는 다음에 어디를보아야하는지에 대한 단서를 제공 할 것입니다.

+0

이 경우에는 실제로 도움이되지 않았습니다. 처음에이 작업을 수행하여 성능 문제를 발견했지만 이러한 변경 사항을 롤백해도 문제가 해결되지 않았습니다. –

5

Apache 프로세스에서 accept() 호출을 보는 것이 전혀 이상한 것은 아닙니다. 이는 새로운 요청을 기다리는 웹 서버입니다.

우선로드의 매개 변수를 설정해야합니다. 예 :

vmstat 1 

당신의 시스템이 무엇인지 보여줍니다. '스왑'및 'io'열을보십시오. 'si'및 'so'열에 '0'이외의 내용이 표시되면 메모리 상태가 낮아 시스템이 스와핑되고 있습니다. 실행중인 Apache 자식 수를 줄이거 나 서버에 RAM을 더 많이 사용하는 것이 좋습니다.

RAM이 문제가 아닌 경우 'cpu'열을보십시오. 여러분은 'us'와 'sy'컬럼에 관심이 있습니다. 여기에는 사용자 프로세스 또는 시스템에서 소비 한 CPU 시간의 백분율이 표시됩니다. 높은 '우리'숫자는 아파치 또는 스크립트 또는 서버의 잠재적으로 다른 것을 가리킨다.

top 

을 실행하면이 프로세스가 가장 활성화되어있는 표시됩니다.

데이터베이스를 배제 했습니까? 프로덕션 램프 스택에서 예기치 않게 높은로드가 발생하는 가장 일반적인 원인은 데이터베이스 쿼리입니다. 값 비싼 쿼리를 사용하여 새 코드를 배포했을 수 있습니다. 이전에 값이 싼 쿼리를 비싸게 만들 정도로 데이터 세트에 충분한 행이있는 지점에 도달했는지 확인하십시오. 높은 부하의 기간 동안

는 긴 실행 쿼리, 또는 한 번에 작동하는 동일한 쿼리의 거대한 숫자 중 하나가 있는지

echo "show full processlist" | mysql | grep -v Sleep 

을한다. 다른 mysql 도구를 사용하면이를 최적화하는 데 도움이됩니다.

아파치에 mod_status를 설정하고 사용하는 것이 유용 할 수 있습니다. 아파치는 각 아파치 아이가 어떤 서비스를 제공하는지 그리고 얼마나 오랫동안 그렇게했는지 볼 수 있습니다.

마지막으로 몇 가지 장기 통계 모니터링을 설정하십시오. zabbix와 같은 것은 구성이 간단하며 시간이 지남에 따라 리소스 사용을 모니터 할 수 있습니다. 따라서 느리게 진행될 경우 비교할 역사적인 기준선과 문제가 시작될 때 더 좋은 결과를 얻을 수 있습니다.

+0

문제는 CPU를 사용하는 Apache입니다. 충분한 RAM이 있습니다 (업그레이드하기 전에 512MB로 실행되었으므로 2GB가 추가되었습니다). 스와핑이 일어나지 않습니다. MySQL의 느린 쿼리 로그는 비정상적인 것을보고합니다. 우리는 이제 과도한 사용 중에 40시에 하중 스파이크를 보게됩니다. –

+0

mod_status가 여기에서 최선의 방법입니다. 또한 부모가 아닌 모든 Apache 프로세스를 strace하려면 다음을 시도하십시오. ps aux | grep h [t] tpd | awk '{print "-p"$ 2} "| xargs strace –

관련 문제