Я хочу программно [на C] вычислить процент использования ЦП для данного идентификатора процесса в Linux.
Как мы можем получить процент использования ЦП в реальном времени для данного процесса?
Чтобы прояснить ситуацию:
- Я смогу определить использование ЦП для предоставленного идентификатора процесса или процесса.
- Процесс не обязательно должен быть дочерним процессом.
- Мне нужно решение на языке C.
Ответы:
Вам нужно разобрать данные из
/proc/<PID>/stat
. Это первые несколько полей (изDocumentation/filesystems/proc.txt
исходного кода ядра):Вы, наверное, после
utime
и / илиstime
. Вам также нужно будет прочитатьcpu
строку/proc/stat
, которая выглядит так:Это показывает совокупное время ЦП, которое было использовано в различных категориях, в единицах мгновений. Вам нужно взять сумму значений в этой строке, чтобы получить
time_total
меру.Читайте как
utime
иstime
для процесса вы заинтересованы в, и читатьtime_total
с/proc/stat
. Затем поспите на секунду или около того и прочитайте их снова. Теперь вы можете рассчитать использование ЦП процессом за время выборки с помощью:Есть смысл?
источник
/proc/stat
сообщает вам, сколько джиффов выполнил в целом ЦП, и/proc/<PID>/stat
сообщает вам, сколько джиффов было выполнено единый процесс.man proc
is your friend (search for/proc/[pid]/stat
)/proc
псевдофайловой системы: обучение стандартным функциям доступа к файловой системе C, таким какfopen()
и, неscanf()
относится к делу .getrusage () может помочь вам определить использование текущего процесса или его дочернего процесса.
Обновление: я не могу вспомнить API. Но все детали будут в / proc / PID / stat, поэтому, если мы сможем его проанализировать, мы сможем получить процент.
РЕДАКТИРОВАТЬ: поскольку CPU% не просто вычислить, вы можете использовать здесь выборки. Считайте ctime и utime для PID в определенный момент времени и снова прочитайте те же значения через 1 секунду. Найдите разницу и разделите на сто. Вы получите использование этого процесса за последнюю секунду.
(может быть сложнее, если процессоров много)
источник
Простой шаг за шагом для новичков вроде меня:
/proc/stat
чтобы получитьtotal_cpu_usage1
./proc/pid/stat
гдеpid
находится PID процесса, который вы хотите узнать об использовании ЦП, например:usertime
иsystemtime
и получитьproc_times1
total_cpu_usage2
иproc_times2
Формула:
Вы можете получить количество CPU от
/proc/cpuinfo
.источник
#include <unistd.h>
и назовите этот методint nb = sysconf(_SC_NPROCESSORS_ONLN);
Я написал две маленькие функции C на основе ответа cafs для расчета использования процессора пользователем + ядром для процесса: https://github.com/fho/code_snippets/blob/master/c/getusage.c
источник
Вы можете прочитать справочную страницу для proc для получения более подробной информации, но в целом вы можете прочитать / proc / [number] / stat, чтобы получить информацию о процессе. Это также используется командой ps.
Все поля и их спецификаторы формата scanf задокументированы в proc manpag e.
Вот часть информации из скопированной man-страницы (она довольно длинная):
источник
ps aux
лучше :)Взгляните на команду "pidstat", она звучит именно так, как вам нужно.
источник
Это мое решение ...
источник
Когда вы хотите отслеживать указанный процесс, обычно это делается с помощью скриптов. Вот пример Perl. Это ставит проц так же, как и верхнюю, с привязкой к одному процессору. Тогда, когда какой-то процесс активен, работающий с 2 потоками, использование процессора может быть более 100%. Особенно посмотрите, как подсчитываются ядра процессора: D, тогда позвольте мне показать свой пример:
Надеюсь, это поможет вам в любом мониторинге. Конечно, вы должны использовать scanf или другие функции C для преобразования любых регулярных выражений Perl, которые я использовал, в исходный код C. Конечно, 1 секунда для сна не обязательна. вы можете использовать в любое время. эффект в том, что вы получите среднюю нагрузку за указанный период времени. Когда вы будете использовать его для мониторинга, конечно, последние значения вы должны выставить снаружи. Это необходимо, потому что мониторинг обычно периодически вызывает скрипты, и скрипт должен завершить свою работу как можно скорее.
источник
Установить
psacct
илиacct
упаковать. Затем используйтеsa
команду для отображения времени процессора, используемого для различных команд. страница руководстваХороший МЕТОДИЧЕСКИЕ с сайта nixCraft.
источник
Думаю, стоит посмотреть исходный код команды GNU "time". time Выводит время процессора пользователя / системы вместе с реальным прошедшим временем. Он вызывает системный вызов wait3 / wait4 (если доступен), а в противном случае вызывает системный вызов times. Системный вызов wait * возвращает структурную переменную "rusage", а системный вызов раз возвращает "tms". Также вы можете взглянуть на системный вызов getrusage, который также возвращает очень интересную информацию о времени. время
источник
Вместо того, чтобы разбирать это из процедуры, можно использовать такие функции, как getrusage () или clock_gettime (), и вычислить использование процессора как соотношение или время настенных часов и время процесса / потока, используемого на процессоре.
источник
Использование strace обнаружило, что использование ЦП необходимо рассчитывать по периоду времени:
источник