실제로 CPU 사용량이 많은 아파치 프로세스가 수행하는 작업을 찾으십니까?


18

현재 서버에서 몇 가지 문제가 발생하여 간헐적으로 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 ()

1
아파치는 "우아한"재시작을 지원하므로 왜 그렇지 않습니까?
poige

1
내가 생각하는 우리가 이전에 그것을 시도 할 때, 그것은 그 잘못 될 수도 있지만, 그것은 잠시 전 ... 우아 때문에 "붙어"아파치 프로세스의 다시 시작하지 못했습니다.
BT643

다른 트릭은 다른 포트에서 다른 아파치 인스턴스를 실행 하여 새로운 연결을 리디렉션 하는 것입니다.
poige

답변:


9

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

gdb -p 20788

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

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

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


gdb가 설치되지 않은 경우 :( 문제를 일으키지 않고 설치할 수 있는지 확인하기 위해 내일 출근 할 때까지 기다려야 ltrace합니다.
BT643

gdb bt의 결과를 초기 게시물에 추가했습니다 .. 실제로 전혀 말하지 않습니다!
BT643

오, 내가 올바른 방향을 제안한 것을 보게되어 기쁘다. )
poige

@ BT643, UPD를 참조하십시오.
poige

4
실현 된 mod_status는 기본적으로 이미 활성화되어 있으며 127.0.0.1에서 액세스하도록 제한되었습니다. 방금 SSH를 통해 로그인하여 출력을 파일로 파이프 curl domain.com/server-status > randomfile.html한 다음 파일 을 보았습니다. 그것은 루프 (PHP 파일)에 갇히는 오래된 개발자 코드였습니다. 모두 지금 정렬되었습니다. 도움을 주셔서 감사합니다 :)
BT643

2

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

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

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


1

시도해 볼 수 있습니다 :

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

0

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

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


단 하나의 자식 프로세스 만 있으면 Apache가 단일 요청 만 처리 할 수 ​​있으며 해당 자식이 멈춘 경우 Apache는 요청을 처리 할 수 ​​없습니다.
Stefan Lasiewski 2014 년

수백 명의 동시 사용자가있는 라이브 서버이기 때문에이를 수행 할 수 없습니다 (이전에는 명확하지 않았으므로 OP에 추가했습니다)
BT643

0

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


PID가 낮다고해서 반드시 오래된 프로세스라는 의미는 아닙니다. PID는 최대 값을 가지며 낮은 PID를 사용하여 새로운 프로세스를 생성 할 수 있습니다.
Austinian

0

이 시도:

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

2) 그런 다음 서버를 top

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


이것은 흥미로운 솔루션이지만 mod_status그 일을 잘 수행 한다는 점에서 가치보다 더 많은 리소스를 차지하는 것을 볼 수 있습니다.
Austinian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.