Является ли сумма всех PID «utime» общей системой utime?

9

Для измерения общего процессорного времени пользователя я использую поле «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.

Если я полностью на неправильном пути, есть другой вопрос:

Стефано Палаццо
источник
/proc/cputimeУ меня нет никакой информации о времени, затрачиваемом процессорами на выполнение процессов, поэтому я озадачен тем, как выглядит ваш «системный cpu_time». Если вы что-то делаете со вторым номером, это время, потраченное на простое задание ; Я не знаю точно, что это значит на практике.
Жиль "ТАК - перестань быть злым"
1
Ваше «пользовательское время» должно будет также добавить значения utime из всех мертвых процессов. Как вы принимаете это во внимание?
Жиль "ТАК - перестань быть злым"
Mhh. То, что я называю «системным временем процессора», является просто первым значением из / proc / uptime, «системными секундами». Я бы подумал, что это слишком много, поскольку он также подсчитывает потоки ядра, но, как вы можете видеть, сумма всех значений "utime" все еще выше, чем системное время из / proc / utime. Ваша ссылка, насколько я могу судить, объясняет почему. Хотя, чтобы быть ясным: я не заинтересован в этом числе на самом деле. Я заинтересован в "время процессора на пользователя".
Стефано Палаццо
Что касается второго комментария: на данный момент я планировал измерять это периодически (скажем, каждую секунду), которое будет игнорировать кратковременные процессы.
Стефано Палаццо
Итак, ваш системный процессор вычисляет время ($ 1- $ 2 / $ number_of_cups), где $ 1 и $ 2 являются значениями от /proc/uptime? Тогда я думаю, что ввод-вывод, относящийся к неработающей задаче, объяснит разницу. Я ничего не знаю об этой теме, поэтому я подозреваю, что упускаю что-то важное: я не ожидал бы, что так много произойдет в бездействующей задаче, особенно если учесть, что ваша сумма пользователей cputime, вероятно, пропускает много коротких живые процессы.
Жиль "ТАК - перестань быть злым"

Ответы:

3

Традиционный способ регистрировать и отслеживать пользовательское процессорное время - учет процессов . В 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завершения процесса, прежде чем сообщать о времени процессора?
Стефано Палаццо
@StefanoPalazzo Да, учетные данные записываются, когда процесс умирает. Это также означает, что, насколько я знаю, вы не получаете данных для процессов, которые выполнялись после сбоя системы.
Жиль "ТАК ... перестать быть злым"
Это проблема - это значит, что я не могу его использовать, так как у нас будет много длительных процессов.
Стефано Палаццо