Есть ли альтернатива wait3 для получения структуры rusage в сценариях оболочки?

Я пытался отслеживать пиковое использование памяти дочерним процессом. Время -v это опция, но она не работает в solaris. Так есть ли способ получить детали, которые находятся в структуре rusage, из сценариев оболочки?

1 ответ

Ты можешь использовать /usr/bin/timex

Из /usr/bin/timex справочная страница:

Данная команда выполнена; истекшее время, пользовательское время и системное время, потраченное на выполнение, указываются в секундах. При желании данные учета процессов для команды и всех ее дочерних элементов могут быть перечислены или суммированы, а также может быть сообщена общая активность системы за интервал выполнения.

...

-p Вывести список учетных записей для команды и всех ее дочерних элементов. Эта опция работает, только если установлено программное обеспечение учета процессов. Подопции f, h, k, m, r и t изменяют сообщаемые элементы данных. Возможны следующие варианты:

...

Начните со страницы руководства для acctadm чтобы включить учет процессов.

Обратите внимание, что в Solaris getrusage() а также wait3() не возвращать статистику использования памяти. Смотрите (несколько устаревший) getrusage() исходный код на http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/syscall/rusagesys.c и wait3() исходный код на http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/sys/common/wait.c#158 (на самом деле это источник OpenSolaris, из которого Oracle отказалась от поддержки for, и он может не представлять текущую реализацию Solaris, хотя несколько тестов на Solaris 11.2 показывают, что данные RSS на самом деле все еще равны нулю.)

Также из соляриса getrusage() справочная страница:

ru_maxrss, ru_ixrss, ru_idrss, а также ru_isrss члены rusage структура установлена ​​в 0 в этой реализации.

Есть почти наверняка другие способы получить данные, такие как dtrace,

Редактировать:

dtrace к сожалению, не очень поможет. Попытка запустить это dtrace сценарий с dtrace -s memuse.d -c bash

#!/usr/sbin/dtrace -s

#pragma D option quiet

profile:::profile-1001hz
/ pid == $target /
{
    @pct[ pid ] = max( curpsinfo->pr_pctmem );
}

dtrace:::END
{
    printa( "pct: %@u %a\n", @pct );
}

привело к следующему сообщению об ошибке:

dtrace: failed to compile script memuse.d: line 8: translator does not define conversion for member: pr_pctmem

dtrace в Solaris не обеспечивает доступ к использованию памяти процесса. На самом деле, Солярис 11.2 /usr/lib/dtrace/procfs.d переводчик для procfs Данные содержат этот комментарий:

/*
 * Translate from the kernel's proc_t structure to a proc(4) psinfo_t struct.
 * We do not provide support for pr_size, pr_rssize, pr_pctcpu, and pr_pctmem.
 * We also do not fill in pr_lwp (the lwpsinfo_t for the representative LWP)
 * because we do not have the ability to select and stop any representative.
 * Also, for the moment, pr_wstat, pr_time, and pr_ctime are not supported,
 * but these could be supported by DTrace in the future using subroutines.
 * Note that any member added to this translator should also be added to the
 * kthread_t-to-psinfo_t translator, below.
 */

Просмотр исходного кода Illumos.org, поиск ps_rssize указывает на то, что procfs данные вычисляются только при необходимости и не обновляются непрерывно во время выполнения процесса. (См. http://src.illumos.org/source/search?q=pr_rssize&defs=&refs=&path=&hist=&project=illumos-gate)

Другие вопросы по тегам