Системный вызов sysinfo возвращает неверные средние значения загрузки в Linux - PullRequest
6 голосов
/ 14 февраля 2011

У меня есть программа на C, которая печатает некоторую системную статистику.

#include <sys/sysinfo.h>
#include <stdio.h>

int main() {
  int days, hours, mins;
  struct sysinfo sys_info;

  if(sysinfo(&sys_info) != 0)
    perror("sysinfo");

  // Uptime
  days = sys_info.uptime / 86400;
  hours = (sys_info.uptime / 3600) - (days * 24);
  mins = (sys_info.uptime / 60) - (days * 1440) - (hours * 60);

  printf("Uptime: %ddays, %dhours, %dminutes, %ldseconds\n",
                      days, hours, mins, sys_info.uptime % 60);

  // Load Averages for 1,5 and 15 minutes
  printf("Load Avgs: 1min(%ld) 5min(%ld) 15min(%ld)\n",
          sys_info.loads[0], sys_info.loads[1], sys_info.loads[2]);

  printf("Total Ram: %lluk\tFree: %lluk\n",
                sys_info.totalram *(unsigned long long)sys_info.mem_unit / 1024,
                sys_info.freeram *(unsigned long long)sys_info.mem_unit/ 1024);


  // Number of processes currently running.
  printf("Number of processes: %d\n", sys_info.procs);

  return 0;
}

Моя проблема в том, что средние значения загрузки отличаются от / proc / loadavg

./a.out 
Uptime: 1days, 4hours, 1minutes, 16seconds
Load Avgs: 1min(13248) 5min(14880) 15min(11840)
Total Ram: 2052956k Free: 188104k
Number of processes: 265

Почему?Я печатаю 13248, но "top" или "cat / proc / loadavg" дает 0.24.В чем проблема?

1 Ответ

18 голосов
/ 14 февраля 2011

Вызов не возвращает «неправильные» значения. Обратите внимание, что тип является целочисленным, поэтому он не может быть предназначен для возврата чисел с плавающей запятой, напечатанных uptime.

См. в этой теме , чтобы узнать, как интерпретировать возвращаемые значения и как преобразовать в более знакомые числа.

Мое предположение (до прочтения ссылки) состояло в том, что она просто представлена ​​в увеличенном виде на 65 535 (2 16 ), и, похоже, это тоже было найдено Так что разделите на 65536.0, или, чтобы быть чище (как указано в комментарии), используйте константу SI_LOAD_SHIFT и разделите на (float)(1 << SI_LOAD_SHIFT).

...