Для измерения общего процессорного времени пользователя я использую поле «utime» из /proc/[pid]/stat
:
utime %lu Amount of time that this process has been scheduled in user
mode, measured in clock ticks (divide by
sysconf(_SC_CLK_TCK). This includes guest time, guest_time
(time spent running a virtual CPU, see below), so that
applications that are not aware of the guest time field do
not lose that time from their calculations.
(от man proc (5) )
Итак, «user utime» - это сумма utime
всех идентификаторов PID, запущенных этим пользователем.
Я надеюсь, что это даст мне точное значение количества процессорных секунд, которые потратил этот пользователь. Я на правильном пути?
Некоторые вещи, которые я пока не понимаю и не принимаю во внимание:
- Каждый PID также имеет родительский PID (или ноль). Но я считаю все PID, а не только те, у которых ppid равен 0. Это правильно?
- Есть, кроме utime, stime, cutime и cstime. Нужно ли беспокоиться о них? Я предполагаю, что utime - это общее количество процессорных секунд для PID, не считая родителя.
Если я вычисляю общее время процессора в системе /proc/uptime
, это значение довольно близко к моей сумме для всех пользователей, но разница значительна. Например (в минутах):
system cpu_time: 96.13
sum of users_cputime: 111.45
Исправление:
Я получаю "разумно выглядящие" значения для всех видов вещей. На данный момент я использую сумму utime, stime, cutime и cstime. И он сообщает значения, которые, хотя я их не понимаю, очень хорошо коррелируют с измерениями из time
.
Если я полностью на неправильном пути, есть другой вопрос:
- Какой самый справедливый способ контролировать общее время процессора - на пользователя? (+500 Bounty) в Ask Ubuntu
/proc/cputime
У меня нет никакой информации о времени, затрачиваемом процессорами на выполнение процессов, поэтому я озадачен тем, как выглядит ваш «системный cpu_time». Если вы что-то делаете со вторым номером, это время, потраченное на простое задание ; Я не знаю точно, что это значит на практике./proc/uptime
? Тогда я думаю, что ввод-вывод, относящийся к неработающей задаче, объяснит разницу. Я ничего не знаю об этой теме, поэтому я подозреваю, что упускаю что-то важное: я не ожидал бы, что так много произойдет в бездействующей задаче, особенно если учесть, что ваша сумма пользователей cputime, вероятно, пропускает много коротких живые процессы.Ответы:
Традиционный способ регистрировать и отслеживать пользовательское процессорное время - учет процессов . В Linux установите утилиты учета GNU , обычно предоставляемые пакетом
acct
. Я не уверен, насколько точным будет отслеживание времени, проведенного в очень недолговечных процессах, но он по крайней мере перечислит все процессы, которые когда-либо выполнялись.Запустите,
lastcomm
чтобы получить список всех команд, выполненных любым пользователем, и время, затраченное на каждую (округлено до ~ 10 мс для недолговечных процессов, ожидайте увидеть много0.00
). Запуститеsa
для отображения различных сумм и статистики. В частности,sa -m
отображает итоги по каждому пользователю. Статистические данные, собранные заsa
период с момента последнего чередования учетных журналов (обычно расположены в/var/log/account/
).Обратите внимание, что вы не собираетесь отлавливать все процессы путем выборки через определенные промежутки времени, а не на большом расстоянии. Вы пропустите почти все краткосрочные процессы и последние несколько секунд длительных процессов. Учет процессов действительно перечисляет все прошлые процессы.
В
/proc/$pid/stat
действительности, пользовательское время - это время, затрачиваемое на выполнение вычислений, а не системное время, затрачиваемое на выполнение операций ввода-вывода. Какой из них рассчитывать, зависит от того, что вы хотите сделать с информацией.Подсчет всех PID - это правильно. Я не знаю, какое отношение родительский PID имеет к этому.
На системной стороне ваше описание
/proc/uptime
кажется неправильным. Википедия это правильно, как я пишу. Первое поле - это реальное время, прошедшее с момента загрузки системы, за вычетом времени, проведенного в приостановленном состоянии или в режиме гибернации. Второе поле - совокупное время, проведенное в задаче бездействия на всех процессорах. Я не уверен, что это действительно означает; это конечно не общее время простоя на моей машине. В ядре, величина суммируется вuptime_proc_show
от переменных обновленных вaccount_idle_time
.источник
sa
завершения процесса, прежде чем сообщать о времени процессора?