
本文目錄
使用 Proxmox VE 以後,隨著虛擬機器越來越多,最常遇到的效能瓶頸就是磁碟 I/O 卡住,但是當系統已經很忙的時候要怎麼知道是問題在那裡呢?
尤其是使用了 ZFS 的情況下,要如何快速得知就是一個重要的關鍵,以下分享一些自己在查修時的經驗,提供參考。
一、查看 zfspool 效能指令
先查看 zfspool 的使用情況,若有多個 zfspool,可以釐清目前是那一個比較吃重。
查看 zfspool 效能
zpool iostat
執行以後如圖,依據不同的 zfspool 顯示目前的讀寫使用頻寬。

這個數據太籠統了,繼續往下看。
二、查看 zfs 磁碟效能指令
zfspool 是由多個磁碟組成,可以經由加入參數來顯示更詳細的資訊。
查看 zfspool 與磁碟效能
zpool iostat -v
執行以後如圖,依據不同的 zfspool 以及 disk 顯示目前的讀寫使用頻寬。

好了,到這裡已經可以顯示個別磁碟的使用情況,可以判斷出到底吃重或是瓶頸卡在那裡。
如何自動重新整理顯示
此時您可能會想到個問題,上面的指令都是執行一次才顯示一次,對於觀察數字改變很不直覺,能不能讓他自動重新整理顯示?
可以的,您可搭配 watch 這個指令來提升便利性。預設是每2秒重新整理一次,若您想要變更重新整理的頻率,可以在 watch 後方加入數字參數,例如:
每秒自動重新整理查看 zfspool 與磁碟效能
watch -n 1 zpool iostat -v

三、查看磁碟效能指令
除了 zfs 的相關指令以外,其實 Linux 也有內建相關的指令,可以查看磁碟效能的數據。
查看磁碟效能
iostat -xdm
執行以後如圖,顯示每一個 disk 顯示目前的讀寫使用頻寬。

在這張表,我們關注的是 await 與 %util 這兩個欄位。到這裡,已經能夠以指令掌握磁碟的使用情況。
四、查看磁碟效能工具
指令用久了也許會想,有沒有更方便的工具可以查看呢?
有的,筆者曾介紹過的一款工具 glances 就相當不錯。

執行 glances 以後,左下方的有一個「DISK I/O」的區塊,這裡就羅列了各個磁碟即時的讀寫速度。
五、查看磁碟效能圖形介面
雖然有了 glances 可方便查看,但是好像缺少了圖表,比較難看出不同時間下的變化?
有的,筆者曾提過的一款工具 netdata 就相當不錯。

有了 netdata,不僅可以有秒級的圖表可以觀察時間變化,而且只需要瀏覽器就可以很方便的查看不同主機資訊,是管理者的重要幫手。
等等,講了半天都在談 disk 效能,但我到底要怎麼知道是那一個 VM 或 Process 吃掉我的效能?
以下就來提供幾個作法。
六、查看佔用磁碟效能的程序
我們希望知道是那一個程序的讀寫量大,或是它已經在等待磁碟IO (IO Delay),要用什麼指令呢?
查看佔用磁碟效能程序
pidstat -d

確實能夠看出讀寫數據與 iodelay 欄位,可是資料太多,能不能有更簡單的查看方式?
有的,請往下看。
七、查看佔用磁碟效能的程序排行榜
上面的指令資訊太多,能不能搞個排行榜最快了?最好還可以自動更新顯示?
查看佔用磁碟效能排行榜
iotop

確實能夠看出吃掉磁碟效能的排行榜,知道是那一支 Process 在作怪。
問題又來了,我使用 Proxmox VE,我想知道現在是那一個 VM 吃掉我的磁碟效能,有什麼更快的方法?
八、查看佔用磁碟效能的虛擬機
想要知道是那一個 VM 吃掉,我們可以利用 zfs 的特性。
相信各位在上面的 iostat、glances、netdata 可能都有發現一件事:一般的磁碟都是像 sda、sdb、sdc 之類的,怎麼還會跑出 zd0、zd48、zd64 之類的裝置?這是什麼東東?
其實在 zfs 上,所有 VM 的 Disk 都會被對應成一個 /dev/zdN 的裝置,我們正好可以利用這個特性衍生一個方便查出 VM 佔用磁碟的小技巧。
當我們先用 iostat -x 指令查看,對其中的 zd112 可能有點疑慮:

查看 zdN 所對應的 VM 磁碟
udevadm info /dev/zd112

其中的資訊明確顯示,這個 zd112 是來自於 vmimage 這個 pool 下,編號為 104 虛擬機的第一個磁碟。

經由這樣的方式,我們就可以很明確的判斷是那一台虛擬機的那一個磁碟正面臨著大量存取所帶來的磁碟效能不足。
同場加映:查看磁碟資訊
既然發現 zdN 裝置的玩法,順便也推薦一個用在 Proxmox VE 的 Host 機上極為方便的指令。
查看 zdN 的磁碟資訊
blkid | grep zd

從結果可以看到,在 Host 機即可對 zdN 裝置取出它的 type、uuid、label 等資訊,可以快速的判斷裡面的格式為 zfs/dos/ext2... 等,也可以立即從 label 名稱判斷這是那一台虛擬機的磁碟或是其用途。
參考
- zpool 指令用法
https://linux.die.net/man/8/zpool - watch 指令用法
https://linux.die.net/man/1/watch - iostat 指令用法
https://linux.die.net/man/1/iostat - [經驗分享]資訊全面的系統監控神器
http://blog.jason.tools/2017/04/glances-monitor-useful.html - netdata 專案
https://github.com/netdata/netdata - pidstat 指令用法
https://linux.die.net/man/1/pidstat - iotop 指令用法
https://linux.die.net/man/1/iotop - udevadm 指令用法
https://linux.die.net/man/8/udevadm - blkid 指令用法
https://linux.die.net/man/8/blkid

