Roubar tempo no KVM relatado como 0

1

Estou tentando obter o tempo de roubo com 2 VMs (cada uma com 1 Vcpu) fixadas para o mesmo núcleo.

Eu executo o mesmo aplicativo nessas duas VMs simultaneamente e vejo o diferença de desempenho. Eu estou tentando ler o tempo de roubar de dentro o convidado usando top, vmstat etc.

Ambos, top e vmstat -s informam o tempo de roubo (st) como 0. Eu também verificou que o procps está na versão mais recente. Eu estou usando virtio-net. Eu suspeite que o tempo de roubo não está sendo atualizado bem. Existe algo que eu preciso configurar para isso funcionar? Minha versão do Linux para a imagem do convidado é:

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

E /proc/cpuinfo mostra:

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:

Existe uma maneira de obter programaticamente o valor dos ciclos de roubo (por exemplo, usando um programa em C)?

    
por Abhishek 08.10.2012 / 22:13

2 respostas

1

bahamat,

você pode querer procurar o arquivo / proc / stat (em todo o sistema) ou o arquivo / proc / PID-ID / stat (por processo [guest-]).

Este poderia ser um código de exemplo para procurar por todos os ciclos de cpu. você também pode se despir para os ciclos de convidados.

/* stat CPU of local system */
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) {
   return(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); // sleep 0.1 sec

  if((pf = fopen("/proc/stat", "r")) == NULL) {
   return(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))));
}

Adicionais dê uma olhada na função getrusage () do seu sistema.

    
por 13.10.2012 / 15:41
0

A menos que você tenha carga alta, talvez não haja tempo de roubo da CPU. Para medir com precisão isso, você precisará garantir que ambas as instâncias estejam consumindo tempo de CPU suficiente para garantir o roubo.

O programa cpuburn é um utilitário efetivo para gerar carga da CPU. Tente executá-lo em ambas as instâncias simultaneamente por uma hora. Certifique-se de que cada instância não tenha um limite de execução e que ambos sejam atribuídos ao (s) mesmo (s) núcleo (s).

    
por 09.10.2012 / 01:34

Tags