2

我想使用 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% 的值。

  1. 这种差异的原因是什么 - 这个脚本有缺陷吗?
  2. 如何计算等待 I/O ( wa%) 所花费的滴答数?
4

0 回答 0