gzip
не извлекает больше, чем нужно, вы только что достигли 32-битного ограничения в поле размера, поэтому gzip -l
не может дать правильный результат , но добыча может.
Вы можете найти Самый быстрый способ определения несжатого размера большого файла GZIPPED релевантным!
Заключение:
Если вы не хотите читать все объяснение, просто прочитайте это:
Да, значение, содержащееся в /proc/[PID]/stat, позволяет определить количество процессорного времени, используемого процессом и его потомками.
Однако вы не можете использовать его для мониторинга в режиме реального времени, потому что значение процессорного времени дочерних процессов обновляется только после смерти дочернего процесса.
Пояснение:
Согласно man time
время возвращает следующую статистику:
These statistics consist of (i) the elapsed real time between invocation and termination, (ii) the user CPU time (the sum of the tms_utime and tms_cutime values in a struct tms as returned by times(2)), and (iii) the system CPU time (the sum of the tms_stime and tms_cstime values in a struct tms as returned by times(2)).
Если прочитать man times
, можно узнать, что структура определяется как:
struct tms {
clock_t tms_utime; /* user time */
clock_t tms_stime; /* system time */
clock_t tms_cutime; /* user time of children */
clock_t tms_cstime; /* system time of children */
};
Это означает, что эта команда возвращает суммарное время пользователя и системного ЦП процесса и всех его дочерних элементов.
Теперь нам нужно знать, что мы можем извлечь из /proc
. В man proc
в секции /proc/[PID]/stat
вы можете извлечь следующую информацию:
(14) 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.
(15) stime %lu
Amount of time that this process has been scheduled in kernel mode, measured in clock ticks (divide by sysconf(_SC_CLK_TCK)).
(16) cutime %ld
Amount of time that this process's waited-for children have been scheduled in user mode, measured in clock ticks (divide by sysconf(_SC_CLK_TCK)). (See also times(2).) This includes guest time, cguest_time (time spent running a virtual CPU, see below).
(17) cstime %ld
Amount of time that this process's waited-for children have been scheduled in kernel mode, measured in clock ticks (divide by sysconf(_SC_CLK_TCK)).
Таким образом, в основном этот /proc/[PID]/stat
файл содержит значение, используемое по времени для определения времени процессора в секундах
Опираясь на эти знания, я попытался запустить свой скрипт вот так time load.sh
и добавил конец скрипта cat /proc/$$/stat
Вот результаты:
9398 (load.sh) S 5379 9398 5379 34817 9398 4194304 1325449 7562836 0 0 192 520 3964 1165 20 0 1 0 814903 14422016 1154 18446744073709551615 4194304 5242124 140726473818336 0 0 0 65536 4 65538 1 0 0 17 3 0 0 818155 0 0 7341384 7388228 9928704 140726473827029 140726473827049 140726473827049 140726473830382 0
вывод команды time
:
real 0m38,783s
user 0m41,576s
sys 0m16,866s
Согласно man proc
нам нужно посмотреть на столбцы 14,15,16 и 17 :192 520 3964 1165
, поэтому, если мы суммируем время, проведенное в процессоре пользователя/системы процессом и его потомками.
192+3964 = 4156 <=> user 0m41,576s
520+1165 = 1685 <=> sys 0m16,866s
И вуаля, время ЦП не является кумулятивным, но вы можете довольно точно рассчитать (сантисекунды )время ЦП, используемое вашей программой и ее дочерними элементами, используя /proc/[PID]/stat
.
РЕДАКТИРОВАТЬ:
После дальнейшего тестирования и общения с людьми,Наконец-то я получил ответ, я запустил скрипт, который просто содержит:
#!/bin/bash
sleep 5
time stress --cpu 4 -t 60s --vm-hang 15
sleep 5
cat /proc/$$/stat | cut -d ' ' -f 14-17
exit
И одновременное использование часов для мониторинга метрики в /proc/$$/stat
. Пока дочерний процесс не завершен, счетчик не обновляется. Когда stress
завершается, значение, отображаемое в /proc/$$/stat
, обновляется и заканчивается аналогичным результатом между командой time
и столбцами с 14 по 17 в /proc
.
Старая редакция Я думал, что все уже закончилось, но, проведя еще несколько исследований, я попробовал то же самое с помощью командыstress
time stress --cpu 4 -t 60s
stress: info: [18598] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
stress: info: [18598] successful run completed in 60s
real 1m0,003s
user 3m53,663s
sys 0m0,349s
Во время выполнения я смотрю 2 раза в секунду на результат команды:
cat /proc/11223/stat | cut -d ' ' -f 14-17
0 0 0 0
В то время как ps faux | grep stress
дал бы мне этот конкретный PID в качестве отца четырех потоков stress
.