1 Вопрос: Временная память GNU также учитывает дочерние процессы?

вопрос создан в Thu, May 2, 2019 12:00 AM

При выполнении времени GNU (/usr/bin/time) и проверке использования памяти, выводит ли его вывод данные об использовании памяти дочерними процессами моей целевой программы?

Не удалось найти ничего на временной странице GNU.

    
0
  1. Можете ли вы опубликовать пример вывода утилиты времени? Можете ли вы точно определить, какое измеренное значение вы спрашиваете? О %K? Я вижу, что GNU Time по-разному использует wait3 и просто анализирует возвращенную информацию (она также вызывает некоторые times и gettimeofday, но не имеет отношения к измерению памяти). wait3 говорит «вернуть информацию об использовании ресурсов о дочернем элементе» - я думаю, что это подразумевает информацию о ресурсах только об одном и одном дочернем элементе.
    2019-05-02 16: 22: 11Z
  2. 1) export TIME="\t%E real,\t%U user,\t%S sys,\t%K amem,\t%M mmem" 2) выполните следующее /usr/bin/time my_program.sh. Вывод из /usr/bin/time: 0:00.74 real, 1.16 user, 0.14 sys, 0 amem, 68636 mmem
    2019-05-02 18: 25: 02Z
  3. @ KamilCuk вы ошибаетесь. вы всегда должны брать документацию linux с небольшим количеством соли; -)
    2019-05-02 22: 08: 46Z
1 ответ                              1                         

Да.

Вы можете легко проверить с помощью:

$ /usr/bin/time -f '%M' sh -c 'perl -e "\$y=q{x}x(2*1024*1024)" & wait'
8132
$ /usr/bin/time -f '%M' sh -c 'perl -e "\$y=q{x}x(8*1024*1024)" & wait'
20648

Время GNU использует wait4 системный вызов Linux (через оболочку glibc wait3), и, хотя она не документирована, использование ресурсов, возвращаемое в struct rusage, также включает в себя потомки ожидаемого процесса. Вы можете посмотреть на реализацию ядра wait4 в kernel/exit.c для всех деталей:

$ grep -C2 RUSAGE_BOTH include/uapi/linux/resource.h
#define RUSAGE_SELF     0
#define RUSAGE_CHILDREN (-1)
#define RUSAGE_BOTH     (-2)            /* sys_wait4() uses this */
#define RUSAGE_THREAD   1               /* only the calling thread */

FreeBSD и NetBSD также имеют wait6 системный вызов, который возвращает отдельную информацию для ожидающего процесса и его потомков. Они также четко документируют, что в список возвращенных wait3 и wait4 также включены внуки.

    
2
2019-05-02 22: 05: 58Z
источник размещен Вот