실제로 CPU 사용량이 많은 아파치 프로세스가 수행하는 작업을 찾으십니까? 발생하여 간헐적으로 CPU가 100 % 차지하는

현재 서버에서 몇 가지 문제가 발생하여 간헐적으로 CPU가 100 % 차지하는 아파치 프로세스가 실행 및 실행되는 것처럼 보입니다.

맨 위를 실행하면 다음이 표시됩니다.

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20788 www-data  20   0  318m  18m 3984 R  100  0.0  40:29.21 /usr/sbin/apache2 -k start
23523 www-data  20   0  319m  20m 4684 R  100  0.0   4:12.36 /usr/sbin/apache2 -k start

나는 어떤 스크립트 (또는 스크립트)가 이것을 일으키는 지 알고 싶어서 시도했다.

 strace -p 20788

그러나 그것은 전혀 출력을 보여주지 않습니다 (약 10 분 동안 그대로 두었고 아무것도 표시하지 않았습니다). 내 이해에서 이것은 무한 루프에 빠졌으며 표시 할 “시스템 호출”이 없음을 의미 할 수 있습니다.

무슨 일이 일어나고 있는지 보여주기 위해 할 수있는 일이 있습니까?

감사

편집- 언급하는 것을 잊었습니다. 이것은 한 번에 수백 명의 사용자가있는 라이브 서버입니다! 그래서 실제로 자유롭게 설정 옵션을 변경하고 아파치를 다시 시작할 수는 없습니다.

편집 2- gdb의 역 추적 (bt)은 PHP가 –enable-debug로 구성되지 않은 경우 유용하지 않은 것 같습니다. “execute ()”만 표시되지만 PHP 스크립트가 무엇인지 알아야합니다. 실제로 달리고 있습니다. 다른 방법이 있습니까?

#0  0x00007f6c143fb0c5 in ?? () from /usr/lib/apache2/modules/libphp5.so
#1  0x00007f6c143b040b in execute () from /usr/lib/apache2/modules/libphp5.so
#2  0x00007f6c1438b970 in zend_execute_scripts () from     /usr/lib/apache2/modules/libphp5.so
#3  0x00007f6c14337fe3 in php_execute_script () from     /usr/lib/apache2/modules/libphp5.so
#4  0x00007f6c1441ae7d in ?? () from /usr/lib/apache2/modules/libphp5.so
#5  0x00007f6c18912508 in ap_run_handler ()
#6  0x00007f6c1891297e in ap_invoke_handler ()
#7  0x00007f6c18922570 in ap_process_request ()
#8  0x00007f6c1891f398 in ?? ()
#9  0x00007f6c18918fa8 in ap_run_process_connection ()
#10 0x00007f6c189271d0 in ?? ()
#11 0x00007f6c1892793a in ?? ()
#12 0x00007f6c189284e7 in ap_mpm_run ()
#13 0x00007f6c188fd4a4 in main ()


답변

용감하다고 생각되는 경우 :

gdb -p 20788

실행 후 bt예를 들어, 스택 프레임을 표시

BTW에도 ltrace언급 할 내용이 있습니다. 시도해보십시오.

UPD. : 음, 좋아, 이제부터 우리는 아파치가 정말 뭔가를 실행하고 있다는 생각이, 왜 나중에보고하지 않을 mod_status출력 – 확장 하나?


답변

매우 쉬운 방법은 사용하는 것 htop입니다. 높은 CPU 프로세스를 정렬 한 다음 사용할 수 있습니다

  • s는 strace프로세스
  • 대한 리터 lsof프로세스의 열려있는 파일을 참조하십시오
  • L로 ltrace.

적어도 하나의 옵션이로드를 생성하는 스크립트를 발견하고 프로덕션 웹 서버 에서이 스크립트를 사용하여 디버깅 할 수 있음을 발견했습니다.


답변

시도해 볼 수 있습니다 :

  • iotop (시스템에 I / O 표시)
  • netstat -t (연결 표시)
  • Apache 로그 파일을보고 서버가 마지막으로 수행 한 작업을 찾으십시오.
  • 아파치 프로세스에 대한 일부 RLimits를 설정합니다. 이러한 한계에 도달하면 프로세스가 종료되어 더 많은 정보를 제공합니다.

답변

해당 PID를 트리거하는 HTTP 요청을 작성하면 명령이 작동해야합니다.

하나의 자식 프로세스로 Apache를 임시로 재구성하고 싶습니까?


답변

그 아파치 인스턴스의 PID는 낮습니다. 모든 로트의 아버지 일 수 있습니다. 그것은 확실히 높은 CPU 사용량을 설명 할 것입니다 (주변에 있고 다른 사람들은로드에 따라 생성되고 호출됩니다). 많은 누적 CPU 시간은 오랫동안 실행되고 있다는 것을 의미 할 수 있습니다. 출력 없음 strace(1)은 시스템 호출이 없음을 의미합니다. 예, 타이트한 루프 일 수 있지만 아파치는 본질적으로 ‘net을 통한 I / O입니다. 그래서 유용한 일을하지 않는다고 생각합니다. 어쨌든 하나의 CPU에서 이상한 100 %.


답변

이 시도:

1) 날짜 / 시간, PHP 스크립트 및 PID를 사용하여 로그를 시작하십시오. getmypid()

2) 그런 다음 서버를 top

3) 아파치 프로세스가 높아지면 로그에서 동일한 날짜 / 시간 및 PID를 검색하십시오. 문제가있는 스크립트를 찾을 수 있어야합니다.