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

标签 c++ linux profiling

我的要求是用总的磁盘读/写操作(或读/写的数据量)来分析当前进程的磁盘读/写操作。我需要每秒钟取样并绘制这两者之间的图表。我需要在 Linux (Ubuntu 12.10) 上使用 C++ 执行此操作。

是否有可用于此任务的 API/工具?我找到了一个名为 iotop 的工具,但我不确定如何将其用于当前进程与系统范围的使用。

谢谢

最佳答案

您可以阅读文件 /proc/diskstats每一秒。每行代表一个设备。

来自内核的“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.

对于每个进程,你可以使用/proc/<pid>/io ,它会产生这样的东西:

rchar: 2012
wchar: 0
syscr: 7
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0
  • rchar, wchar: 读取/写入的字节数。
  • syscr、syscw:读/写系统调用次数。
  • read_bytes、write_bytes:读取/写入存储介质的字节数。
  • cancelled_write_bytes:据我所知,由调用“ftruncate”取消对同一文件的未决写入引起。可能最常见的是 0。

关于c++ - 使用 C++ 在 Linux 中计算磁盘读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14525390/

相关文章:

c++ - for(int i=0;i<myVector.size();++i) 调用了多少次 size()?

c++ - 继承是否会破坏 C++ 中的封装

ruby - gem 安装错误

php - 在php代码中用python导入caffe

ruby-on-rails - 为 Rails 性能测试生成代表性数据

c++ - 根据字符串反转 "formula"

c++ - 结构类型转换时信息丢失

Linux 用户态执行

javascript - Nodejs Profiling : What to do with v8. 日志文件

haskell - 我的库中的更改使它变慢了。分析对我没有帮助。减速的原因可能是什么?