cpu 3357 0 4313 1362393
The amount of time, measured in units of USER_HZ (1/100ths of a second on most architectures), that the system spent in user mode, user mode with low priority (nice), system mode, and the idle task, respectively. The last value should be USER_HZ times the second entry in the uptime pseudo-file.
Чтот несмотря на описание непойму как вычислить необходимое значение. Подскажите кто знает.
хм, работать то оно работает, но весьма странно...
Вот например запускаешь top/htop, так там индикатор нормально отображает, т. е. если начал архивировать или компилять загрузка мгновенно выросла до 100%, а с помощью способа, описанного Вами, загрузка какая-то инертная что ли(компилишь пять минут ядро, а загрузка процентов 10 и потихоньку возрастает)
ps кстати что показывает load average? я в курсе что загрузку системы, но как интерпретировать эти значения?
хм, работать то оно работает, но весьма странно...
Вот например запускаешь top/htop, так там индикатор нормально отображает, т. е. если начал архивировать или компилять загрузка мгновенно выросла до 100%, а с помощью способа, описанного Вами, загрузка какая-то инертная что ли(компилишь пять минут ядро, а загрузка процентов 10 и потихоньку возрастает)
ps кстати что показывает load average? я в курсе что загрузку системы, но как интерпретировать эти значения?
Наверное ты вычисляешь среднюю загрузку процессора. Тебе нужно вычислять за какой то период времени.
/* возвращает число от 0 100 загруженность процессора за
* период от предыдущего вызова функции до текущего
* в случае ошибки возвращает -1 */
int CPU_usage(struct memory *mem)
{
unsigned long long cpu = 0;
unsigned long long nice = 0;
unsigned long long system = 0;
unsigned long long idle = 0;
FILE *f = fopen("/proc/stat", "r");
if (fscanf(f, "cpu %llu %llu %llu %llu", &cpu, &nice, &system, &idle) < 4)
{
fclose(f);
return -1;
}
fclose(f);
unsigned long long busy = cpu + nice + system;
unsigned long long work = busy + idle;
double usage = 100.0 * (busy - mem->last_busy) / (double) (work - mem->last_work);
//LOG("usage: %.2f%%\n", usage);
mem->last_busy = busy;
mem->last_work = work;
return (int) usage;
}