Определение загрузки процессора - PullRequest
13 голосов
/ 22 сентября 2010

Есть ли команда или любой другой способ получить текущее или среднее использование ЦП (для многопроцессорной среды) в Linux?

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

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

Ответы [ 5 ]

25 голосов
/ 23 сентября 2010

Ответ на вопрос после долгих поисков и ковыряний:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    long double a[4], b[4], loadavg;
    FILE *fp;
    char dump[50];

    for(;;)
    {
        fp = fopen("/proc/stat","r");
        fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&a[0],&a[1],&a[2],&a[3]);
        fclose(fp);
        sleep(1);

        fp = fopen("/proc/stat","r");
        fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&b[0],&b[1],&b[2],&b[3]);
        fclose(fp);

        loadavg = ((b[0]+b[1]+b[2]) - (a[0]+a[1]+a[2])) / ((b[0]+b[1]+b[2]+b[3]) - (a[0]+a[1]+a[2]+a[3]));
        printf("The current CPU utilization is : %Lf\n",loadavg);
    }

    return(0);
}

Я получаю те же значения, которые указаны в системном мониторе.

10 голосов
/ 22 сентября 2010
cat /proc/stat

вы увидите что-то вроде этого

cpu  178877 11039 58012 5027374 22025 2616 1298 0 0
cpu0 122532 8808 34213 2438147 10881 1050 448 0 0
cpu1 56344 2230 23799 2589227 11143 1565 850 0 0

Просто возьмите суммы первых трех чисел и разделите их на суммы первых четырех целых чисел

Первые 4 числа: user, nice, system и idle times

примечание: это дает общее среднее значение. Если вы хотите взять спонтанное среднее, вы должны взять две выборки и вычесть их друг из друга до деления.

8 голосов
/ 22 сентября 2010

Вам необходимо выбрать значения в /proc/stat два раза и рассчитать среднее использование за это время.(Мгновенное использование не имеет большого смысла - оно всегда будет на 100% на одноядерном компьютере, так как ваш код измерения использования выполняется всякий раз, когда он выглядит).

3 голосов
/ 22 сентября 2010

Файловая система / proc содержит все виды интересной информации. Посмотрите на man proc для получения дополнительной информации.

1 голос
/ 22 сентября 2010

Просто используйте top, если он доступен. Вы можете использовать его в неинтерактивном режиме:

top -n 1

Если вы хотите что-то конкретное, просто запустите этот вывод. Точные данные будут зависеть от того, как ваша верхняя команда форматирует вывод, но, например:

top -n 1 | grep 'Load'
...