Есть ли альтернатива 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)