跳到主內容

解決虛擬機器上的 k3s 問題 — 硬碟延遲過高 / IOPS 過慢

摘要

當執行 k3s 的虛擬機器其由 Ceph 支援的區塊卷宗是從快照克隆而來,且 RBD 映像尚未被扁平化時,這些虛擬機器會出現異常高的磁碟延遲以及 IOPS 下降的情況。 每次寫入操作都會對父快照產生「寫入時複製」的開銷,即使磁碟利用率看似較低,仍會導致 I/O 資源飽和。 執行 fstrim 並無法解決此問題。 將 RBD 影像展平即可解決此問題。

詳細資訊

請根據以下症狀,確認這篇知識庫文章是否適用於您的環境。

  • 症狀 A — 磁碟使用率偏低但延遲偏高: df -h 顯示的使用率正常(例如,在 200 GiB 的磁碟區上為 13%),但應用程式卻出現讀寫效能緩慢的情況。
  • 症狀 B — Ceph 卷具有一個有效的父卷參照: rbd info 顯示 parent: 欄位指向一個快照,且儘管虛擬機器端的利用率較低,rbd du 卻報告 USED 值接近 PROVISIONED
  • 症狀 C — fstrim 未能改善情況: 在虛擬機器上執行 fstrim -av 雖能順利完成且未出現錯誤,但延遲時間仍維持不變。
  • 根本原因: 該 Ceph RBD 卷是從快照克隆而來,且該映像從未經過扁平化處理。 所有寫入操作都會觸發針對父快照鏈的「寫入時複製」,這會增加顯著的延遲並降低有效 IOPS。

確認父節點參照

在 Ceph 叢集上執行以下指令,以檢查是否存在父子關係:

rbd du cinder-volumes/<volume-id>

如果輸出內容包含 parent: 這一行(如下所示),則該卷仍與其快照來源相關聯,必須進行扁平化處理。

parent: cinder-volumes/volume-04d1fa55-7990-43a9-8018-9c1658fe87f9@snapshot-46874354-44b6-448e-be22-daa70ef24fc0
overlap: 200 GiB

適用版本

所有 CubeCOS 版本。

決議

請選擇最符合您部署時程的修復方案。

將影像扁平化會切斷其與父快照之間的依賴關係。 所有資料都會直接複製到卷本身中,從而消除「寫入時複製」所產生的開銷。 此操作在線上執行,無需重新啟動虛擬機器,但在複製過程中會暫時增加 Ceph 的 I/O 負載。

請在 Ceph 叢集上執行以下指令:

rbd flatten cinder-volumes/<volume-id>

持續監控進度直至完成:

Image flatten: 100% complete...done.

完成扁平化後,請確認 rbd info 已不再顯示 parent: 欄位。 磁碟延遲應立即恢復至基準水準。

選項 2:重新導向 k3s 資料目錄(使用者端解決方案)

如果無法立即進行扁平化處理,您可以將 k3s 指向延遲較低的卷或路徑,藉此減輕其影響。 請在伺服器啟動時使用 --data-dir 參數來指定其他位置:

k3s server --data-dir /path/to/fast-volume/k3s

有關 --data-dir 選項及受支援路徑的完整詳細資訊,請參閱 k3s 伺服器 CLI 參考手冊


其他資訊

  • 「寫入時複製」的性能開銷與子卷與其父快照之間的重疊程度成正比。 大規模的重疊(例如如 rbd du 所示的 200 GiB)會造成最嚴重的延遲影響。
  • fstrim 在檔案系統/虛擬機器層級運作,對 Ceph 層的「寫入時複製」鏈無任何影響。 這是預期的行為。
  • RBD 影像特徵(例如上例中的 object-mapfast-diff)並非造成此問題的原因,因此無需將其停用。

接下來會發生什麼

將 RBD 影像進行平坦化處理後:

  1. 在虛擬機器上使用 fioiostat 驗證基準 IOPS,以確認延遲是否已恢復至預期水準。
  2. 請檢視您的磁碟設定工作流程,以確保未來的克隆本在掛載至生產環境工作負載之前已完成扁平化處理。
  3. 若有多台虛擬機器出現類似症狀,請使用 rbd lsrbd info 指令,檢查所有 Ceph 卷是否存在有效的父卷引用。