
以下是 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