我想跟踪给定命令的 disk io 。 getrusage()
可用于C;我能以某种方式在命令行中获得相同的内容吗?
time
和times
显示用户和系统花费的时间,后者包括自己/孩子的故障,所有其他位如何,如磁盘io,spwap,峰值内存?
一个例子:
[user@hsot ~]$ time sqlite3 haha.db vacuum
real 1m6.439s
user 0m7.407s
sys 0m10.000s
# what I'd like in addition
blocks in 1228349
blocks out 34523
maxrss 45634953
...
答案 0 :(得分:4)
理想情况下,这样的东西会被构建到bash(或者你正在使用的任何shell)中。不幸的是,没有AFAIK这样的东西。
但是使用getrusage()创建自己的包装器是微不足道的:
#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>
int main(int argc, char** argv) {
system(argv[1]);
struct rusage ru;
getrusage(RUSAGE_CHILDREN, &ru);
printf("\nblocks in:\t%li\nblocks out:\t%li\nmaxrss:\t\t%li\n",
ru.ru_inblock, ru.ru_oublock, ru.ru_maxrss);
}
编译它:
$ gcc -o process_io process_io.c
并使用它:
$ ./process_io "dd if=/dev/urandom of=foobar bs=1k count=10000"
10000+0 records in
10000+0 records out
10240000 bytes (10 MB) copied, 0.922149 s, 11.1 MB/s
blocks in: 0
blocks out: 80128
maxrss: 1676
答案 1 :(得分:1)
按照克里斯的回答,我在Python中有这个:
#!/usr/bin/env python
import sys
import resource
import subprocess
bsel = resource.getrusage(resource.RUSAGE_SELF)
bchl = resource.getrusage(resource.RUSAGE_CHILDREN)
subprocess.Popen(sys.argv[1:]).communicate()
for i in range(10**7): pass # test children/self independence
asel = resource.getrusage(resource.RUSAGE_SELF)
achl = resource.getrusage(resource.RUSAGE_CHILDREN)
print("""--child--
user\t%s
sys\t%s
mem\t%s
inb\t%s
oub\t%s
maj\t%s
nivcsw\t%s""" % (achl.ru_utime - bchl.ru_utime,
achl.ru_stime - bchl.ru_stime,
achl.ru_maxrss,
achl.ru_inblock - bchl.ru_inblock,
achl.ru_oublock - bchl.ru_oublock,
achl.ru_majflt - bchl.ru_majflt,
achl.ru_nivcsw - bchl.ru_nivcsw))
print("""--self--
user\t%s
sys\t%s
mem\t%s
inb\t%s
oub\t%s
maj\t%s
nivcsw\t%s""" % (asel.ru_utime - bsel.ru_utime,
asel.ru_stime - bsel.ru_stime,
asel.ru_maxrss,
asel.ru_inblock - bsel.ru_inblock,
asel.ru_oublock - bsel.ru_oublock,
asel.ru_majflt - bsel.ru_majflt,
asel.ru_nivcsw - bsel.ru_nivcsw))
似乎有效:)
P.S。我仍然在寻找自我与儿童对孙子女的澄清。也欢迎新的答案:)
答案 2 :(得分:0)
iostat显示系统写入/读取光盘。遗憾的是,不是针对特定的流程,而是针对整个系统,但是如果您使用的是开发机器,我想这可能很糟糕。