有没有办法使用标准 Linux/Unix 工具来确定进程在用户模式下花费了多少时间以及等待内核多少时间?
换句话说,正是您在使用时获得的“user”和“sys”值time
,但是期间进程运行时间?
笔记:一种方法是使用 WBEM 并枚举 Linux_UnixProcess,但我需要使用其他比这个工具;我的目的是验证 WBEM 提供商告诉我的内容,即我需要使用不同的工具。
答案1
在 Linux 上,该信息位于字段 14 到 17 中/proc/$pid/stat
(请参阅过程(5)详情):
字段有:
- 14:用户时间(时钟滴答数)
- 15:系统时间
- 16:用户等待孩子的时间
- 17:等待孩子的系统时间
(给定进程的所有线程都具有相同的值)
它们不是由 直接报告的ps
。
ps
报告 14 + 15ps -o time
和14 + 15 + 16 + 17
。ps --cumulative -o bsdtime
请注意,中的第二个字段/proc/$pid/stat
可能包含空格或换行符,因此您无法使用 awk 的$1
, $2
...来解析它。
你可以perl
这样使用:
$ perl -MPOSIX -l -0777 -ne '@f = /\(.*\)|\S+/gs;
printf "utime: %.2f\nstime: %.2f\ncutime: %.2f\ncstime: %.2f\n",
map {$_/POSIX::sysconf( &POSIX::_SC_CLK_TCK )}@f[13..16]' "/proc/$pid/stat"
utime: 3.79
stime: 2.06
cutime: 56.49
cstime: 34.27
进程可以使用getrusage(RUSAGE_SELF)
和检索自己的时间getrusage(RUSAGE_CHILDREN)
。
还有一个times
系统调用可以检索相同的信息。 POSIX shell 有一个times
内置的功能。有些 shell 还提供该信息time
(不带参数)。
$ times
0m3.800s 0m2.060s
0m56.512s 0m34.276s
$ ps -o time -p "$$"
TIME
00:00:05
$ ps --cumulative -o bsdtime -p "$$"
TIME
1:36