1

我试图监视子进程的峰值内存使用情况。time -v 是一个选项,但它在 solaris 中不起作用。那么有没有办法从 shell 脚本中获取 rusage 结构中的详细信息?

4

1 回答 1

1

您可以使用/usr/bin/timex

从手册/usr/bin/timex

执行给定的命令;执行所花费的时间、用户时间和系统时间以秒为单位报告。可选地,可以列出或汇总命令及其所有子进程的进程记帐数据,并且可以报告执行间隔期间的总系统活动。

...

-p 列出命令及其所有子进程的进程记帐记录。此选项仅在安装了进程记帐软件时才有效。子选项 f、h、k、m、r 和 t 修改报告的数据项。选项如下:

...

从手册页开始,acctadm以启用进程记帐。

请注意,在 Solaris 上,getrusage()wait3()不会返回内存使用统计信息。请参阅http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/syscall/rusagesys.c上的(有些过时的)getrusage()源代码和http://src上的源代码.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/sys/common/wait.c#158(这实际上是 OpenSolaris 源,Oracle 放弃了对它的支持,它可能不代表当前的 Solaris 实现,尽管在 Solaris 11.2 上进行的一些测试表明 RSS 数据实际上仍然为零。)wait3()

此外,从Solarisgetrusage()手册页

在此实现中,结构的ru_maxrssru_ixrssru_idrssru_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 上似乎不提供对进程内存使用情况的访问。事实上,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

于 2016-08-03T13:46:46.837 回答