命令行相当于`getrusage()`

时间:2014-06-19 10:33:38

标签: bash command-line io

我想跟踪给定命令 disk io getrusage()可用于C;我能以某种方式在命令行中获得相同的内容吗?

timetimes显示用户和系统花费的时间,后者包括自己/孩子的故障,所有其他位如何,如磁盘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
...

3 个答案:

答案 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显示系统写入/读取光盘。遗憾的是,不是针对特定的流程,而是针对整个系统,但是如果您使用的是开发机器,我想这可能很糟糕。