我想跟踪磁盘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
...发布于 2014-06-23 12:54:29
理想情况下,像这样的东西应该内置到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发布于 2014-06-23 12:59:08
按照chris‘s的回答,我在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))它似乎奏效了:)
我仍在寻找自我与子女和孙辈之间的关系。欢迎新的答案:)
发布于 2014-06-23 12:38:03
iostat显示系统写入/读取光盘。遗憾的是,这不是一个特定的过程,而是整个系统,但是如果您是在您的开发机器上,我想这可能是可以的。
https://stackoverflow.com/questions/24304486
复制相似问题