简体   繁体   English

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

[英]Calculating Disk Read/Write in Linux with C++

My requirement is to profile current process disk read/write operations with total disk read/write operations (or amount of data read/written). 我的要求是使用总磁盘读/写操作(或读/写的数据量)来分析当前进程磁盘的读/写操作。 I need to take samples evry second and plot a graph between these two. 我需要第二次取样并在这两者之间绘制图表。 I need to do this on Linux (Ubuntu 12.10) in c++. 我需要在c ++中的Linux(Ubuntu 12.10)上执行此操作。

Are there any APIs/Tools available for this task ? 是否有任何API /工具可用于此任务? I found one tool namely iotop but I am not sure how to use this for current process vs system wide usage. 我找到了一个工具iotop但是我不确定如何在当前进程和系统范围内使用该工具。

Thank You 谢谢

You can read the file /proc/diskstats every second. 您可以/proc/diskstats读取文件/proc/diskstats Each line represents one device. 每行代表一个设备。

From kernel's "Documentation/iostat.txt": 从内核的“ 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.

For each process, you can get use /proc/<pid>/io , which produces something like this: 对于每个进程,您都可以使用/proc/<pid>/io ,它会生成如下内容:

rchar: 2012
wchar: 0
syscr: 7
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0
  • rchar, wchar: number of bytes read/written. rchar,wchar:读取/写入的字节数。
  • syscr, syscw: number of read/write system calls. syscr,syscw:读/写系统调用的数量。
  • read_bytes, write_bytes: number of bytes read/written to storage media. read_bytes,write_bytes:读取/写入存储介质的字节数。
  • cancelled_write_bytes: from the best of my understanding, caused by calls to "ftruncate" that cancel pending writes to the same file. cancelled_write_bytes:据我所知,是由于调用“ ftruncate”导致取消了对同一文件的未决写操作。 Probably most often 0. 可能最经常为0。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM