Вычисление процента процессора одним процессом в unix командой top - PullRequest
5 голосов
/ 15 декабря 2010

Я хотел бы знать, как команда top может вычислить процент процессора, используемый любым процессом.

Я попытался прочитать двоичный файл "psinfo" в каталоге / proc, но это не помогло найти результат.

Пожалуйста, предоставьте любую информацию, как это можно сделать.

Заранее спасибо.

1 Ответ

9 голосов
/ 15 декабря 2010

Команда top вычисляет загрузку ЦП, используя данные в файловой системе proc . Фактический файл, содержащий данные об использовании процессора, может варьироваться от одной платформы к другой. Например, в Linux он находится в /proc/<pid>/stat, а в Solaris - в /proc/<pid>/psinfo. Использование ЦП рассчитывается как разница в суммарном времени ЦП для процесса, деленная на количество времени, измеренное между обновлениями.


Для Linux вы можете проверить источник procps , который включает ps, top, и другой инструмент обработки из http://procps.sourceforge.net. The * В частности, файл 1022 * readproc.c содержит функции для извлечения данных.


Для Solaris вы можете проверить источник libproc из https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproc. Файл prog_get_info.c содержит функции для извлечения данные и хранение их в psinfo_t структуре.


Для Linux, Solaris и других систем вы можете проверить исходный код Unix Top из http://sourceforge.net/projects/unixtop. Исходные файлы для платформы в machine каталог содержит функциональность для извлечения данных.


Обновление

Другой вариант (только Solaris) для получения времени ЦП для процесса может быть передан параметру PIOCPSINFO или PIOCSTATUS параметру ioctl() системный вызов. Опция PIOCPSINFO возвращает различную информацию о процессе в структуре prpsinfo_t. Опция PIOCSTATUS возвращает информацию о состоянии процесса в prstatus_t struct.

Адаптировано из примера кода на http://getthegood.com/TechNotes/Papers/ProcStatistics.html:

int main(int argc, char* argv[])
{
    int fd;
    prpsinfo_t info;
    prstatus_t status;
    char procbuf[50];

    sprintf(procbuf, "/proc/%d", getpid());
    fd = open(procbuf, O_RDONLY);

    ioctl(fd, PIOCPSINFO, &info);
    printf("Process user+sys time = %ld sec %ld nsec\n" 
           "Reaped children user+sys time = %ld sec %ld nsec\n",
           info.pr_time.tv_sec, info.pr_time.tv_nsec,
           info.pr_ctime.tv_sec, info.pr_ctime.tv_nsec);

    ioctl(fd, PIOCSTATUS, &status);
    printf("Process user+sys time = %ld sec %ld nsec\n"
           "Sum of children's user+sys time = %ld sec %ld nsec\n",
           status.pr_utime.tv_sec+status.pr_stime.tv_sec,  
           status.pr_utime.tv_nsec+status.pr_stime.tv_nsec,  
           status.pr_cutime.tv_sec+status.pr_cstime.tv_sec,
           status.pr_cutime.tv_nsec+status.pr_cstime.tv_nsec);

    close(fd);
    exit(0);
}

Примечание. Этот код не проверен и для простоты исключает проверку ошибок.

...