Tasks: 747 total, 176 running, 560 sleeping, 0 stopped, 11 zombie
Cpu(s): 10.5%us, 89.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 74236420k total, 73285344k used, 951076k free, 12261184k buffers
Swap: 8388600k total, 10404k used, 8378196k free, 27872176k cached
%sy가 CPU의 89%를 사용하고 있습니다. %sy가 무엇인가요?
이것이 iostat의 모습입니다
root@host [~]# iostat -xk 5
Linux 2.6.32-431.20.3.el6.x86_64 (host.superhostsite.com) 09/03/2014 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
43.02 0.28 50.00 0.05 0.00 6.65
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sdb 0.25 64.95 14.21 79.82 91.86 579.51 14.28 0.15 1.60 0.09 0.84
sda 0.87 182.70 28.06 206.05 247.08 1629.10 16.03 0.49 2.07 0.09 2.22
avg-cpu: %user %nice %system %iowait %steal %idle
8.45 0.00 91.55 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sdb 0.00 14.00 0.20 15.00 3.20 116.00 15.68 0.03 1.92 0.28 0.42
sda 0.00 23.20 2.00 47.80 25.60 284.00 12.43 0.02 0.42 0.14 0.70
따라서 디스크 사용량이 매우 적습니다. 모든 것이 작습니다. 그러나 시스템의 CPU 사용량은 89.2%에 달했습니다.
%sy가 왜 그렇게 높나요? 우리는 왜 안되나요?
답변1
귀하의 질문은 기본적으로 "여기서 무슨 일이 일어나고 있습니까?"라고 생각합니다.
귀하의 결과를 해석하여 답변해 드리겠습니다. 도움이 된다면 알려주시면 자세한 내용을 추가하겠습니다.
(질문을 편집하여 질문하는 내용을 더 명확하게 해 보세요. 그렇지 않으면 질문이 닫힐 수 있습니다.)
예, '높음으로 인해'가 표시됩니다.CPU용법"!
상단의 출력을 살펴보겠습니다.
Cpu(s): 10.5%us, 89.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
백분율 값은 사용자 코드 또는 시스템(커널) 코드에서 시간이 소요된 위치를 나타냅니다. 이는 %sy
시스템 코드의 시간이며 사용자 시간에 대한 추가 10%us입니다. 그럼 CPU 사용량은 100% 입니다! (0%id-idle-에서도 볼 수 있습니다.)
하지만 더 많은 것이 있습니다:
Tasks: 747 total, 176 running, 560 sleeping, 0 stopped, 11 zombie
176개의 실행 중인 프로세스가 있습니다. 단, 코어 수가 176개 미만인 경우 일부 코어는 CPU 시간이 있으면 실행할 수 있는 상태입니다.
즉, 로드가 더 많아지고 더 많은 CPU를 100% 활용률로 끌어올릴 수 있다는 뜻입니다.
CPU 사용률이 89.2%가 아닙니다. 100%입니다.
이러한 관점에서 보면 이유가 없습니다 iostat
. 이 상태에서는 시스템에 많은 IO가 필요하지 않습니다.
하지만 우리에게 필요한 정보는 최소 176개의 프로세스 또는 스레드가 무엇인지, 실행되지 않는 유사한 작업이 더 많이 있을 수 있다는 것입니다.
다음: 그들은 무엇을 하고 있으며 그 이유는 무엇입니까?
따라서 프로세스 목록을 살펴보십시오 top
. 몇 가지 명백한 문제가 나타날 수 있습니다.
"실행 가능" 상태에 있는 프로세스에 대해 자세히 알아보는 데 도움이 될 수 있습니다.
다음 명령은 "실행 가능" 상태에 있는 모든 프로세스와 스레드(CPU 시간이 확보되면 실행할 수 있는 작업)를 나열합니다.
ps -o comm,pid,ppid,user,time,etime,start,pcpu,state --sort=comm aH | grep '^COMMAND\|R$'
ps
나에게는 자신을 포함하여 한두 줄만 나열됩니다.
답변2
상단 출력에서 메모리 활용도가 높다는 것을 알 수 있습니다(거대한 파일 시스템 캐시 포함). 앞서 언급했듯이 커널 코드는 사용자 코드보다 더 많이 사용되고 있습니다. 아마도 더 많은 kworker가 캐시에서 메모리를 해제하고 요청 프로세스에 할당하기 위해 작업하고 있기 때문일 것입니다(메모리를 요청할 때 실행 중인 프로세스가 176개일 수 있음).
한 가지 해결책은 다음을 사용하여 캐시 크기를 줄이거나 캐시를 삭제하는 것입니다.
에코 3 > /proc/sys/vm/drop_caches
이렇게 하면 kworker 수가 줄어들고 궁극적으로 커널 코드 실행이 줄어듭니다.