關於我自己

2019年2月13日 星期三

[經驗分享]分析 Proxmox VE 客體機 DISK I/O 效能



在 Proxmox VE 上面運作的虛擬機器越來越多情況下,若又是搭配 Share Storage,遇到效能問題時要怎麼追查到底是那一台 VM 造成的呢?



雖然 PVE 已經有為每一台虛擬機器提供 Summary 概觀,點進去 Dashboard 儀表板可以查到 Disk I/O 效能圖表,但是問題來了。

這個功能一次只能查看一台虛擬機器,要比對不同台的時候要不斷的切來切去,既浪費時間也無法一次比對,效益太差,更致命的問題是,沒辦法切換要看的時間範圍,過去的時間無法查看,也無法調整刻度。

PVE 虛擬機器磁碟 IO 效能圖表


有沒有什麼比較好的方法可以方便的查看呢?

當然有,不然我幹麻寫這篇文章。







方案一:LibreNMS

有看到我過去文章的朋友一定知道,我是 LibreNMS 的超級愛好者,經由 LibreNMS 可以做到非常多的監控能力,簡單好用。


LibreNMS


可惜,人生偶爾會遇到幾個 But。

LibreNMS 查看磁碟 I/O 效能



LibreNMS 非常好用,但偏偏在做磁碟 I/O 效能監測就是他的罩門,遇到幾個問題:
  • 無法一次查看所有虛擬機磁碟 I/O 效能數據 (無法以 PVE Host 取出)
  • Windows 作業系統無法提供磁碟 I/O 效能數據 (無法以 PVE Guest 取出)
  • 無法容易的將所有虛擬機排在同一張圖表上比對效能
  • 無法做到小於分鐘級的時間粒度效能監測 (無法看到即時與精確的數據)

尤其是最後一點,是重要的問題所在,因此這個情況需要考慮其它方案。






方案二:netdata

netdata 是一款數據即時又詳細的監控工具,在絕大多數需要小於分鐘級的監測,我會使用 netdata。

netdata


可惜,人生偶爾又遇到很多個 But。

netdata 查看磁碟 I/O 效能


netdata 精美、快速、好用,但偏偏在做 PVE 虛擬機器的磁碟 I/O 效能監測也是他的罩門,遇到幾個問題:
  • 無法查看虛擬機磁碟 I/O 效能數據 (無法以 PVE Host 取出)
  • Windows 作業系統不支援 (無法以 PVE Guest 取出)
  • 無法容易的將所有虛擬機排在同一張圖表上比對效能
  • 無法跨機器做效能圖表總覽

尤其是第一點,雖然可以參考前陣子的另一篇文章使用,但該文章是針對虛擬磁碟放在本機 ZFS 裡面的才有用,這次的案例是放在 Share Storage 上,並沒有辦法一體適用。因此,還是需要考慮其它方案。






方案三:Prometheus + Grafana

Prometheus 與 Grafana 是兩套非常熱門的開源套件,當它們強強聯手以後,是極具彈性、數據即時又詳細的監控工具組合,在絕大多數需要小於分鐘級且需要交叉比對的監測,我會使用它們。

在此提供快速的中文發音法:Prometheus = 普羅米修斯,Grafana = 廣發納

Prometheus


Grafana


前面我用了「才使用」這個詞,為什麼會不常用它呢?

因為 Grafana 的圖表需要手工定製,不像 LibreNMS 或 netdata 那樣,安裝好就已有許多現成圖表或套件可以使用,前置作業較為耗時。

Prometheus + Grafana 查看 PVE 磁碟 I/O 效能


經過一連串的建置與調整程序後,成功的在 Grafana 上呈現 PVE 的所有客體機 (KVM 虛擬機器 + LXC 容器) 磁碟 I/O 圖。

在這張圖中,讓我一眼就看出異常的頻繁讀取的虛擬機器,從而對症下藥進行處理。

為什麼說是從這張圖才能看到?難道 PVE 儀表板提供的圖不可以嗎?讓我們來看看:



Grafana 數據圖表




PVE 效能數據圖表


在上面這兩張圖可以清楚的看到一個重點,Grafana 看到的圖有非常多超過 30MB/s 以上甚至有突破 40MB/s 者,但 PVE 看到的始終都在 6MB/s 附近徘徊,差異極大。

這種差距的問題來自於先前提到的時間粒度問題,不夠精細導致遺失許多重要的細節。

舉個例子,過去我在 LibreNMS 推廣簡報上用一張圖解釋了時間粒度的重要性:



不同監測工具的時間粒度差異圖


由上而下分別是 LibreNMS、Proxmox VE、netdata,可以在這張比對圖中非常清楚的看到細節失真程度。

雖然說越精細越能看出問題,但別忘記了,精細的數據是要用系統效能、儲存空間換來的。因此,要針對需要的項目再做,以免還沒做好效能監測,這台監測主機自己就先把自己給拖垮了。







如何使用

要讓 PVE 的數據接到 Grafana 顯示,並不是那麼容易的事,我們需要以下的多種套件。
  • Prometheus
  • Grafana
  • Prometheus Proxmox VE Exporter

由於 Prometheus 與 Grafana 都是較為複雜的套件,無法在這一一介紹,在此假設已經預先安裝好這兩個套件,並且已俱備相關基礎知識。

可以使用 pip 指令直接安裝,若沒有 pip,請先參考相關教學完成後再回頭來做。
安裝 Prometheus PVE Exporter
pip install prometheus-pve-exporter

接著,請先在 PVE WebUI 上建立一個 Role 角色,使其具有 PVEAuditor 的權限,接著再建立一個帳號並賦予他剛剛建立的 Role 角色。



建立好效能監控用的角色




將效能監控用的角色指派給帳號


接下來,請建立 pve.yml,內容如下:
建立 pve.yml 設定檔
default:
    user: monitoring@pve
    password: yourpassword
    verify_ssl: false


完成後,即可執行 pve_exporter 讓他運作起來,如果 pve.yml 在其它位置,也可以在後面用帶入完整的路徑與檔名資訊。

再來,請到 Prometheus 上進行設定,讓 Prometheus 開始對 pve_exporter 進行資料 Pull 拉取。
修改 prometheus.yml 設定檔
  - job_name: 'pve'
    static_configs:
      - targets:
        - 192.168.100.172  # Proxmox VE node.
    metrics_path: /pve
    params:
      module: [default]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.100.172:9221  # PVE exporter.

到這裡即可完成 Prometheus 的相關設定。

下一步,請登入 Grafana 在儀表板上選擇建立 Graph 圖表,在 Data Source 處選擇 Prometheus,並到 Query 欄位處輸入 pve_ 開頭的字串,即可將需要的數據做為圖表呈現。

Grafana 設定 pve_exporter 提供數據


Grafana 顯示 pve_exporter 效能數據


pve_exporter 所能提供的數據有以下幾種:
  • pve_cluster_info
  • pve_cpu_usage_limit
  • pve_cpu_usage_ratio
  • pve_disk_read_bytes
  • pve_disk_size_bytes
  • pve_disk_usage_bytes
  • pve_disk_write_bytes
  • pve_guest_info
  • pve_memory_size_bytes
  • pve_memory_usage_bytes
  • pve_network_receive_bytes
  • pve_network_transmit_bytes
  • pve_node_info
  • pve_storage_info
  • pve_up
  • pve_uptime_seconds
  • pve_version_info

由於名稱已經足夠淺顯易懂,就不做解釋,但使用到 pve_disk_read_bytes / pve_disk_write_bytes 之類的數據時要注意,他所提供的數字是「總量」。

若想要知道每一個時間點當時的存取量是多少,請在 Grafana 上搭配 Prometheus PromQL 的 irate 或 rate 函數,才能取得正確結果,函數的使用感謝 邱宏瑋 Hwchiu 大大指點。






結論

效能監測與問題找尋,需要先了解什麼樣的問題場景,以及數據與時間的對應關係,才能從中選擇正確的工具以及資料來源,對症下藥,精確打擊。






參考資料