KVM 中的窃取时间报告为 0

KVM 中的窃取时间报告为 0

我正在尝试将 2 个虚拟机(每个虚拟机有 1 个 Vcpu)固定到同一个核心来获取窃取时间。

我同时在这两个虚拟机上运行相同的应用程序,并看到性能差异。我尝试使用 top、vmstat 等从客户机内部读取窃取时间。

两者都有,top并将vmstat -s窃取时间 (st) 报告为 0。我还检查了 procps 是否为最新版本。我正在使用 virtio-net。我怀疑窃取时间没有得到很好的更新。我需要配置什么才能使其正常工作?我的客户机映像的 Linux 版本是:

Linux server-147 2.6.35-24-virtual #42-Ubuntu SMP Thu Dec 2 05:15:26 UTC 2010 x86_64 GNU/Linux

/proc/cpuinfo显示:

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 2
model name  : QEMU Virtual CPU version 0.14.0
stepping    : 3
cpu MHz     : 2992.498
cache size  : 4096 KB
fpu     : yes
fpu_exception   : yes
cpuid level : 4
wp      : yes
flags       : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pse36 clflush mmx fxsr sse sse2 syscall nx lm up rep_good pni cx16
hypervisor lahf_lm
bogomips    : 5984.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

有没有办法以编程方式获取窃取周期的值(例如使用 C 程序)?

答案1

巴哈马特,

您可能需要查找 /proc/stat 文件(系统范围)或 /proc/PID-ID/stat 文件(每个 [guest-]process)。

这可以是查找整个 CPU 周期的示例代码。您还可以剥离客户周期。

/* 本地系统 CPU 统计 */
uint16_t system_cpu_percent_busyness(无效){
  长jiff_user_a,jiff_nice_a,jiff_system_a,jiff_idle_a,jiff_io_wait_a,jiff_irq_a,jiff_softirq_a,jiff_stolen_a,jiff_guest_a;
  长jiff_user_b,jiff_nice_b,jiff_system_b,jiff_idle_b,jiff_io_wait_b,jiff_irq_b,jiff_softirq_b,jiff_stolen_b,jiff_guest_b;
  长jiff_used_a,jiff_used_b,jiff_total_a,jiff_total_b;
  字符CPU[10];
  文件*pf;

  如果((pf = fopen(“ / proc / stat”,“ r”))== NULL){
   返回(0);
  }
  fscanf(pf, "%s\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld", cpu, &jiff_user_a, &jiff_nice_a, &jiff_system_a, &jiff_idle_a, &jiff_io_wait_a, &jiff_irq_a, &jiff_softirq_a, &jiff_stolen_a, &jiff_guest_a);
  fclose(pf);
  usleep(100000); // 睡眠 0.1 秒

  如果((pf = fopen(“ / proc / stat”,“ r”))== NULL){
   返回(0);
  }
  fscanf(pf, "%s\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld\t%ld", cpu, &jiff_user_b, &jiff_nice_b, &jiff_system_b, &jiff_idle_b, &jiff_io_wait_b, &jiff_irq_b, &jiff_softirq_b, &jiff_stolen_b, &jiff_guest_b);
  fclose(pf);

  jiff_used_a = jiff_user_a + jiff_nice_a + jiff_system_a + jiff_io_wait_a + jiff_irq_a + jiff_softirq_a + jiff_stolen_a + jiff_guest_a;
  jiff_total_a = jiff_used_a + jiff_idle_a;

  jiff_used_b = jiff_user_b + jiff_nice_b + jiff_system_b + jiff_io_wait_b + jiff_irq_b + jiff_softirq_b + jiff_stolen_b + jiff_guest_b;
  jiff_total_b = jiff_used_b + jiff_idle_b;

  返回((uint16_t)((100 *(jiff_used_b - jiff_used_a)/(jiff_total_b - jiff_total_a))));
}

进一步了解系统的 getrusage() 函数。

答案2

除非负载很高,否则您可能没有任何 CPU 窃取时间。为了准确测量这一点,您需要确保两个实例都消耗了足够的 CPU 时间来保证窃取。

该程序cpuburn是生成 CPU 负载的有效实用程序。尝试同时在两个实例中运行该程序一小时。确保每个实例都没有执行上限,并且都分配给相同的核心。

相关内容