KVM中的窃取时间报告为0

我试图用两个虚拟机(每个有1个Vcpu)locking到相同的核心。

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

topvmstat -s报告窃取时间(st)为0.我还检查了procps是最新版本的。 我正在使用virtio-net。 我怀疑盗窃时间没有被更新。 有什么我需要configuration这个工作? 我的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程序)?

bahamat,

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

这可能是查找整个cpu周期的示例代码。 你也可以去掉客人的周期。

 / *本地系统的CPU * /
 uint16_t system_cpu_percent_busyness(void){
   long 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;
   long 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;
   long jiff_used_a,jiff_used_b,jiff_total_a,jiff_total_b;
   char cpu [10];
   FILE * pf;

   if((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秒

   if((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;

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

另外看看你的系统的getrusage()函数。

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

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