使用 C++ 计算 Linux 中的磁盘读/写
Calculating Disk Read/Write in Linux with C++
我的要求是使用总磁盘读/写操作(或读/写数据量)来分析当前进程磁盘读/写操作。我需要先取样本,并在这两者之间绘制一个图表。我需要在 Linux (Ubuntu 12.10) 的 c++ 上执行此操作。
是否有任何可用于此任务的 API/工具?我找到了一个工具,即iotop
但我不确定如何将它用于当前进程与系统范围的使用。
谢谢
您可以每秒/proc/diskstats
读取文件。每行代表一个设备。
来自内核的"文档/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++ 对象的 std::vector 保存到磁盘?
- 根据 GetLastError 直接写入磁盘会导致错误代码 5
- 矢量和其他容器如何在磁盘上工作?
- 如何从整个磁盘中排除要装载的一个文件
- 如何将 IPropertyBag 保存到磁盘
- 防止临时对象文件访问 MSVC 中的磁盘
- 即使使用 FILE_FLAG_DELETE_ON_CLOSE 属性创建文件,文件也会保留在磁盘上
- Linux 源代码中普通磁盘文件的"轮询"功能在哪里实现?
- 文件删除(使用取消链接)与释放所有磁盘空间之间的延迟
- 在 Visual Studio 中调试时,是否可以将一些 C/C++ 结构内容保存到磁盘?
- 使用程序生成来创建磁盘,但纹理无法正常工作
- 使用C++项目将数据保存在磁盘上
- 将数据复制到磁盘上新位置的语法
- 通过C++与fst将对象写入R中的磁盘
- 如何使用PHP将上传到本地主机的一个html文件重定向到磁盘上的另一个html文档
- 磁盘已满时,Boost日志崩溃
- 使用大磁盘文件的 C++ 循环缓冲区
- 如何将 numpy 二维数组作为一种可以用C++读取的二进制格式存储在磁盘上
- 在磁盘上使用循环缓冲区
- 在数据写入磁盘之前,fwrite 会阻塞吗?