我试图监视子进程的峰值内存使用情况。time -v 是一个选项,但它在 solaris 中不起作用。那么有没有办法从 shell 脚本中获取 rusage 结构中的详细信息?
1 回答
您可以使用/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()
在此实现中,结构的
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 上似乎不提供对进程内存使用情况的访问。事实上,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)