проблема с ext4 на очень старой машине

Заключение:
Если вы не хотите читать все объяснение, просто прочитайте это:
Да, значение, содержащееся в /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.

1
17.01.2020, 18:15
1 ответ

Вы можете использовать mke2fs -t ext3для форматирования файловой системы, совместимой с ext3 на старых ядрах. Это отключит новые функции ext4.

0
27.01.2020, 23:55

Теги

Похожие вопросы