머신을 독차지하는 프로세스를 찾는 방법

머신을 독차지하는 프로세스를 찾는 방법

시나리오: 갑자기 컴퓨터가 느려지는 느낌이 듭니다. 마우스는 움직이지만 창문을 여는 데 시간이 오래 걸립니다. 등에서 uptime는 부하가 7.69로 올라가고 있다고 말합니다.

어떤 프로세스가 로드의 원인인지 알아내는 가장 빠른 방법은 무엇입니까?

이제 "상위" 및 유사한 도구는 CPU 또는 메모리 사용량을 표시하지만 동시에 둘 다를 표시하지 않기 때문에 답이 아닙니다. 나에게 필요한 것은 상황이 발생하면 입력할 수 있는 단일 명령입니다.

프로세스 X 때문에 시스템이 8GB RAM을 디스크로 교체하려고 합니다.

또는

프로세스 X는 디스크 전체를 탐색합니다.

또는

프로세스 X는 CPU를 400% 사용합니다."

그래서 제가 찾고 있는 것은 iostat, htop/atop 및 유사한 도구가 다음과 같은 출력을 내는 도구로 실행되는 것입니다.

 1235 cp - Disk trashing
   87 chrome - Uses 2 GB of RAM
  137 nfs_bench - Uses 95% of the network bandwidth

나는 분석할 수 있는 숫자를 제공하는 도구가 아니라 현재 로드를 유발하는 프로세스를 정확히 알려주는 도구를 원합니다. 키보드 앞에 있는 사용자가 "프로세스"를 쓰는 방법을 거의 알지 못하지만 "상주 크기", "가상 메모리" 또는 "프로세스 수명 주기"에 관해서는 금방 압도당한다고 가정해 보겠습니다.

내 주장은 다음과 같습니다. 사용자가 문제를 발견했습니다. 수천 가지 이유가 있을 수 있습니다. 음, 거의 :-) 사용자는 문제의 원인을 알고 싶어합니다.

현재 솔루션은 많은 숫자를 제공하며 이 숫자가 무엇을 의미하는지 알아야 합니다. 내가 찾고 있는 것은 메타 도구입니다. 99%의 데이터는 문제와 관련이 없습니다. 따라서 도구가 수행해야 하는 작업은 일부 리소스를 독차지하는 프로세스를 찾아 "이 프로세스에는 많은 CPU가 필요하고 많은 IRQ가 생성되며 이 프로세스는 많은 RAM을 할당하며 계속 증가하고 있습니다"와 함께 해당 프로세스만 나열하는 것입니다.

이것은 상대적으로 짧은 목록이 될 것입니다. 이 목록 을 처음 접하는 사람이 범인을 찾는 것이 예를 htop들어 약 5000개의 숫자를 제공하지만 멀티스레드 프로세스를 직접 접어야 하는 출력보다 이 목록에서 범인을 찾는 것이 훨씬 더 간단할 것입니다. VIRT 2750M16GB의 RAM만 있으면 기계가 스스로 교체되어 죽어야 하지만 물론 이는 빠르게 발생할 수 있는 데이터에 대한 잘못된 해석입니다.

답변1

각각의 응답이 도구 X를 실행하라고 지시했기 때문에 응답에 미소를 지어야 합니다. 유일한 문제는 보고 있는 내용이 간헐적으로 발생하는 경우 어떤 것도 연관시킬 방법이 없다는 것입니다. 같은 도구사르충분히 높은 빈도로 실행하면 도움이 될 수 있지만, 저는 주장하고 싶습니다.수집하다더욱 좋습니다.

좋다사르, RPM을 설치하고 다음을 수행하여 데몬으로 실행합니다 /etc/init.d/collectl start.

이제 뭔가 느린 것이 보이면 에서 collectl -p /var/log/collectl/filename --top데이터를 재생하고 상위 프로세스를 보여줍니다. 그냥 실행 collectl --top해서 실시간으로 볼 수도 있습니다. 그런데 실시간으로 할 수 있는 모든 작업을 재생할 수도 있습니다.

CPU 로드의 경우 인터럽트로 인해 과부하가 걸리면 어떻게 됩니까? collectl -sC개별 CPU의 로드(또는 -sc평균 로드에 대한 사용)를 표시할 뿐만 아니라 CPU가 시간을 어떻게 보내고 있는지도 보여줍니다. -j( )를 포함 -scj하면 인터럽트/CPU 수가 표시됩니다. 대문자를 사용 -J하면 각 인터럽트/CPU의 유형이 표시됩니다.

물론 vmstat를 정말 좋아한다면 언제든지 수집 데이터를 재생할 수 있으며 --vmstatvmstat 형식으로 기록 데이터가 표시됩니다.

나열할 시간보다 훨씬 더 많은 스위치가 있지만 다음에서 확인할 수 있습니다.소스포지아니면 그냥 구글링해 보세요.

답변2

"top"은 올바른 숫자를 보는 한 합리적으로 잘 작동합니다. 보자:

top - 13:11:45 up 13 days,  1:13, 21 users,  load average: 0.06, 0.11, 0.26
Tasks: 271 total,   2 running, 267 sleeping,   0 stopped,   2 zombie
Cpu(s): 19.0%us,  6.3%sy,  0.0%ni, 74.0%id,  0.5%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8183668k total,  8002712k used,   180956k free,    12476k buffers
Swap: 11847900k total,   723480k used, 11124420k free,   767016k cached

이제 CPU를 모두 사용하여 시스템이 느려지면 "Cpu(s):" 행의 "us" 및 "sy" 열이 함께 100%에 가깝게 표시됩니다.

스와핑으로 인해 속도가 느려지면 "Mem:" "free"는 매우 낮은 값을 표시하고 "Swap:" "used"는 높은 값을 표시합니다.

인해 속도가 느린 경우입출력일반적으로 "Cpu(s):" "wa"는 I/O 대기에 시간이 소요됨을 나타냅니다.

이제 I/O 대기가 문제라는 것을 알고 있다면 "iotop" 프로그램을 사용하여 어떤 프로세스가 대부분의 I/O를 생성하는지 알 수 있습니다.

답변3

400% 사용량을 기준으로 쿼드 코어 프로세서가 있다고 가정하겠습니다. 로드 평균은 용량의 거의 두 배이고 프로세스의 절반이 CPU를 기다리고 있습니다.

먼저 renice쉘을 0 또는 -10으로 설정하여 보다 응답성이 뛰어난 시스템을 얻은 다음 이를 사용하여 htop문제가 있는 프로세스를 찾고 strace주어진 프로세스에서 이를 따릅니다. 유용할 수 있는 다른 도구는 다음과 같습니다.

  • vmsat
  • sar
  • iostat
  • pmap

답변4

vmstat는 일반적인 용어로 도움을 줄 수 있습니다. 사용 예는 다음과 같습니다.

$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 977908 426184 1543884    0    0    38    45  106  385  4  1 95  1

X초마다 실행할 수도 있습니다. 명령 뒤에 숫자 X를 추가하기만 하면 됩니다.

편집: 의견을 보면... 다음을 파일에 쓰고 해당 파일을 실행 가능하게 만듭니다. 머신의 상위 3개 프로세스를 알려줍니다.

top -n 1 | tail -16 | head -4 | awk '{print $13}'

CPU가 아닌 어떤 메모리가 차지하는지 알고 싶다면 맨 위 매뉴얼 페이지를 읽고 표시 순서를 변경하세요.

관련 정보