Linux

以程式方式測量磁碟 IO

  • November 1, 2013

我想以程式方式測量給定時間跨度內與磁碟 io 相關的一些數字。這意味著我不想通過更喜歡從 proc 等中讀取某些內容來生成像 iostat 這樣的程序來獲取我的號碼。

我需要知道:

  • 寫入磁碟的塊數
  • 從磁碟讀取的塊數
  • 從磁碟讀取但在磁碟記憶體中找到的塊數
  • 即將寫入磁碟但尚未寫入的塊數,以了解我可能期望的後續 IO 數量。

如果我只通過磁碟或分區獲取這些資訊……那就更好了,因為我不需要知道我從 proc 中讀取了多少資訊。

如果我還知道該過程等待 IO 完成的時間……那就更好了。

這是否可以通過一些 IO 呼叫或通過讀取和解析 /proc 文件來實現?

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.

引用自:https://serverfault.com/questions/245291