Назад | Перейти на главную страницу

Время кражи в 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)?

бахамат

вы можете найти файл / proc / stat (для всей системы) или файл / proc / PID-ID / stat (для каждого процесса [гость-]).

Это может быть пример кода для поиска всех циклов процессора. вы также можете разобрать для гостевых циклов.

/* 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))));
}

Дополнительно ознакомьтесь с функцией getrusage () вашей системы.

Если у вас нет высокой нагрузки, у вас может не быть времени на кражу процессора. Чтобы точно измерить это, вам нужно убедиться, что оба экземпляра потребляют достаточно процессорного времени, чтобы гарантировать кражу.

Программа cpuburn - эффективная утилита для увеличения загрузки процессора. Попробуйте запустить его в обоих случаях одновременно в течение часа. Убедитесь, что у каждого экземпляра нет ограничения на выполнение и оба назначены одному и тому же ядру (ядрам).