我想使用 SystemTap获取 CPU 利用率( %us
, %sy
, %id
, )。%wa
我编写了一个使用timer.profile
探针并计算处理器滴答声的脚本:
#! /usr/bin/env stap
probe timer.profile {
# probe perf.sw.cpu_clock {
if (!user_mode()) {
if (pid() == 0) {
iticks <<< 1
} else {
kticks <<< 1
}
} else {
uticks <<< 1
}
ticks <<< 1
}
global uticks, kticks, ticks, iticks
probe timer.s(1), end {
allticks = @count(ticks)
# printf("us: %d, sy: %d, id: %d, tot: %d\n",
# @count(uticks), @count(kticks), @count(iticks), allticks);
printf("us: %d, sy: %d, id: %d\n",
@count(uticks)*100/allticks,
@count(kticks)*100/allticks,
@count(iticks)*100/allticks);
delete uticks
delete kticks
delete iticks
delete ticks
}
上述脚本产生的值与其他系统工具不同,例如vmstat
. 当我应用已知负载(计算大文件的校验和)时,vmstat
告诉 CPU 是 25% us
,为什么我的脚本给出 35% us
。示例适用于执行主要在内核中运行的任务 - 我的stap
脚本提供了大约 7% 到 10% 的值。
- 这种差异的原因是什么 - 这个脚本有缺陷吗?
- 如何计算等待 I/O (
wa%
) 所花费的滴答数?