我想以编程方式测量给定时间范围内与磁盘 io 相关的一些数字。这意味着我不想生成像 iostat 这样的进程来获取我的数字,而是更喜欢从 proc 或类似程序中读取一些内容。
我需要知道:
- 写入磁盘的块数
- 从磁盘读取的块数
- 从磁盘读取但在磁盘缓存中找到的块数
- 即将写入磁盘但尚未写入的块的数量,以便了解我可能预期有多少成功的 IO。
如果我仅通过磁盘或分区获取这些信息……那就更好了,因为我不需要知道从 proc 读取了多少信息。
如果我还知道该进程等待 IO 完成的时间...那就更好了。
通过一些 IO 调用或者读取和解析 /proc 文件可以实现这一点吗?
答案1
iostat 读取/proc/diskstats
- 不过我无法告诉您哪一列对应什么。这需要一点调查。此外,如果您想获取有关特定进程的更多信息,则/proc/[processID]
包含与该进程相关的信息,例如 io 和 mem
文件中的一行如下所示:
8 0 sda 1576985 366566 29817737 8671588 4847477 21489330 210704848 14116392 0 14120880 22772188
从/usr/src/linux-*/Documentation/iostats.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 6 -- # of writes merged
See the description of field 2.
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.