使用C++在Linux中计算磁盘读/写

Abh*_*sal 1 c++ linux profiling

我的要求是使用总磁盘读/写操作(或读/写数据量)来分析当前进程磁盘读/写操作.我需要第二次采样,并绘制这两者之间的图表.我需要在Linux(Ubuntu 12.10)上用c ++做这个.

是否有可用于此任务的API /工具?我发现了一个工具,iotop但我不知道如何将其用于当前进程与系统范围的使用.

谢谢

Mat*_*son 7

您可以/proc/diskstats每秒读取该文件.每行代表一个设备.

从kernel的"Documentation/iostat.txt":

Field  1 -- # of reads completed
    This is the total number of reads completed successfully.
Field  2 -- # of reads merged, field 6 -- # of writes merged
    Reads and writes which are adjacent to each other may be merged for
    efficiency.  Thus two 4K reads may become one 8K read before it is
    ultimately handed to the disk, and so it will be counted (and queued)
    as only one I/O.  This field lets you know how often this was done.
Field  3 -- # of sectors read
    This is the total number of sectors read successfully.
Field  4 -- # of milliseconds spent reading
    This is the total number of milliseconds spent by all reads (as
    measured from __make_request() to end_that_request_last()).
Field  5 -- # of writes completed
    This is the total number of writes completed successfully.
Field  7 -- # of sectors written
    This is the total number of sectors written successfully.
Field  8 -- # of milliseconds spent writing
    This is the total number of milliseconds spent by all writes (as
    measured from __make_request() to end_that_request_last()).
Field  9 -- # of I/Os currently in progress
    The only field that should go to zero. Incremented as requests are
    given to appropriate struct request_queue and decremented as they finish.
Field 10 -- # of milliseconds spent doing I/Os
    This field increases so long as field 9 is nonzero.
Field 11 -- weighted # of milliseconds spent doing I/Os
    This field is incremented at each I/O start, I/O completion, I/O
    merge, or read of these stats by the number of I/Os in progress
    (field 9) times the number of milliseconds spent doing I/O since the
    last update of this field.  This can provide an easy measure of both
    I/O completion time and the backlog that may be accumulating.
Run Code Online (Sandbox Code Playgroud)

对于每个进程,您都可以使用/proc/<pid>/io,这会生成如下内容:

rchar: 2012
wchar: 0
syscr: 7
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0
Run Code Online (Sandbox Code Playgroud)
  • rchar,wchar:读/写的字节数.
  • syscr,syscw:读/写系统调用的数量.
  • read_bytes,write_bytes:读/写到存储介质的字节数.
  • cancelled_write_bytes:从我理解的最好,由调用"ftruncate"导致取消挂起写入同一文件引起的.可能最常见的是0.