我有一些 CPU 使用率警报,它们在我不希望的时候触发。
我正在阅读,并将和jiffies/proc/stat
的增长与 jiffies 的总体增长进行比较。如果百分比增加足够高,则会发出警报。请注意,我不计算在内 - 周围有很好的流程,但我很高兴,如果需要,这些流程将被取消安排,而我的重要流程将继续进行。user
system
nice
然而,当警报被触发时,我经常发现根本%user
没有上升。然而,%nice
和%system
确实增加了 - 并且一些好的进程会触发内核工作。
我的问题是:
- 如果更重要的进程需要 CPU 时间,那么好的进程(以及它们触发的内核工作)将会被取消调度,我这样说对吗?
- 我如何知道其中有多少
%system
是由于良好的流程造成的?
目前运行 CentOS 6 (2.6.32),但如果这个问题已在更高版本中修复,我会考虑向后移植它!
答案1
这可能取决于好的进程做什么,特别是它发出多少系统调用以及发出什么系统调用。这是一个不太好的程序,notnice.asm
就系统时间而言,它可能会表现出接近最坏情况的行为
# Linux, x86_64, NASM
bits 64
section .data
letter: db "n"
section .text
global _start
_start: mov rsi,letter
mov rdi,1 ; stdout
mov rdx,1 ; length
_again: ; on assumption above not unset by syscall...
mov rax,1 ; sys_write
syscall
jmp _again
即使在以下情况下运行,nice -n 19
仍应运行系统时间:
$ nasm -f elf64 notnice.asm -o notnice.o
$ ld notnice.o -o notnice
$ nice -n 19 ./notnice >/dev/null
top
然后应该显示这个进程占用了 100% 的 CPU,因为它处于一个相当紧密的循环中,至少对于我的其他不繁忙的 centos7 测试主机(每个有四个 CPU /proc/cpuinfo
)来说大约是 ~20% 系统时间,~5% 不错,以及其他空闲状态:
%Cpu(s): 0.1 us, 19.1 sy, 5.9 ni, 74.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
在这种情况下,大约 100% 的系统时间是由于进程不太好造成的。通过此运行,我们还可以运行更高优先级的进程,然后检查系统负载如何变化(也许使用 SystemTap 或其他东西发生的频率sys_write
,notnice
或者可能将notnice
输出输出到快速文件系统,并查看 I/O 速率是否因有更高优先级的进程...)
SystemTap 可以提供更好的粒度,例如通过https://sourceware.org/systemtap/examples/general/stopwatches.stp尽管这要求录制开始时进程位于用户空间中。