如何計算磁碟IO負載百分比?

如何計算磁碟IO負載百分比?

以下是 net-snmp 輸出,如您所見,diskIOLA 不可用:

SNMP table: UCD-DISKIO-MIB::diskIOTable

diskIOIndex diskIODevice diskIONRead diskIONWritten diskIOReads diskIOWrites diskIOLA1 diskIOLA5 diskIOLA15 diskIONReadX diskIONWrittenX

      25          sda   845276160     2882477056      576632     42597061         ?         ?          ?   5140243456    883350772736

根據這裡的定義http://www.net-snmp.org/docs/mibs/ucdDiskIOMIB.html:

磁碟IOLAx表示磁碟x分鐘平均負載(%)。

表中的其他值是:

  • diskIONRead - 自啟動以來從此裝置讀取的位元組數。
  • diskIONWritten - 自啟動以來寫入該裝置的位元組數。
  • diskIOReads - 自啟動以來從此裝置讀取存取的次數。
  • diskIOWrites - 自啟動以來對此裝置的寫入存取次數

那麼,由於該負載沒有在伺服器中收集,如何手動計算呢?

最後,我們希望向用戶展示圖表,讓他們可以了解磁碟 IO 是否繁忙。我們可以使用讀取/寫入位元組/秒或讀/寫請求/秒來顯示它。

如果我們單獨顯示每秒讀取/寫入請求數,我們就可以知道正在發生大量 I/O。但我們不知道磁碟讀/寫速度是否受此影響。

僅顯示 R/W 速度並不能告訴我們速度受到影響的原因 - 是否是因為 I/O 操作過多或沒有足夠的緩衝記憶體用於非同步寫入。因此,我們需要同時顯示兩者。

但是,磁碟 IOLoad 的另一個值是什麼意思,我們如何計算它,以及為什麼它沒有被 snmp 收集。如果啟用此功能會導致巨大的負載嗎?如果收集這個值造成很大的負載,那麼我們可以手動計算它。但是,公式是什麼?

答案1

您所提供的資訊不足以計算磁碟利用率百分比。磁碟利用率% 計算如下disk_time_spent_in_io / elapsed_time
例如,如果您的磁碟在 1 秒的時間內花費 0.25 秒執行 IO,則您的磁碟利用率為 25%。

對於利用率百分比而言,操作次數毫無意義。根據您的磁碟以及您正在執行的 IO 類型(批次與隨機),它可能在 10 IOPS 或 10000 IOPS 時獲得 100% 的使用率。唯一了解的方法是查看磁碟執行這些 IOP 所花費的時間。

答案2

對於每個尋找解決方案的人,iostat 都會計算一個百分比/sys/block/sda/stat。公式大致為:

{now,past}_tot_ticks = total time this block device has been active (/sys/block/sda/stat)
{now,past}_uptime = uptime in /proc/uptime (first value)

percentage = (now_tot_ticks - past_tot_ticks) / (now_uptime - past_uptime) / 10

取得一秒內 IO 負載百分比的指令:

$ cat \
    <(cat /sys/block/sda/stat && cat /proc/uptime)            \
    <(sleep 1 && cat /sys/block/sda/stat && cat /proc/uptime) \
    | awk -v RS="" '{printf "%.2f%\n", ($27-$10)/($33-$16) / 10}';

延伸閱讀:
[1]https://www.kernel.org/doc/Documentation/block/stat.txt
[2]https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-uptime
[3]https://github.com/sysstat/sysstat/blob/v11.4.3/iostat.c

相關內容