Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux cgroups blkio 子系統管理磁碟 I/O 完整實戰指南

編輯:關於 Linux

Linux cgroups (Control Groups) 不僅能限制 CPU、記憶體,其 blkio 子系統 更提供精細的區塊裝置 I/O 流控能力。本文詳細介紹兩大核心模式——Throttle (節流限制) 與 Weight (權重分配) 的操作實戰、監控指標與注意事項。

blkio 子系統核心參數

參數類型功能單位
blkio.throttle.read_bps_deviceThrottle限制每秒讀取位元組數Bytes/sec
blkio.throttle.read_iops_deviceThrottle限制每秒讀取 IOPSIOPS
blkio.throttle.write_bps_deviceThrottle限制每秒寫入位元組數Bytes/sec
blkio.throttle.write_iops_deviceThrottle限制每秒寫入 IOPSIOPS
blkio.weightWeight進程/群組 I/O 權重 (相對)10-1000 (預設 500)
blkio.weight_deviceWeight特定裝置權重10-1000

概念區別:

  • Throttle:硬性上限,類比 CPU quota。適合「租戶隔離、防止單一應用佔滿頻寬」。
  • Weight:相對比例,類比 CPU shares。適合「優先級區分、閒時充分利用」。

環境準備


# 掛載 blkio cgroup (systemd 通常已自動掛載)
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

# 建立測試控制群組
mkdir /sys/fs/cgroup/blkio/test_throttle
mkdir /sys/fs/cgroup/blkio/test_weight1
mkdir /sys/fs/cgroup/blkio/test_weight2

# 確認目標裝置主次裝置號
ls -l /dev/sda
# brw-rw---- 1 root disk 8, 0 ... → 主:8 次:0

模式一:Throttle 硬性限流實戰

1. 產生基準負載


# 背景持續讀取 /dev/sda
dd if=/dev/sda of=/dev/null &
# 記下 PID,假設 2750

2. 觀察無限制狀態


iotop -o
# 或
pidstat -d 1 -p 2750

3. 套用限制:限制讀取 1MB/s


# 格式: "主:次 限制值"
echo "8:0 1048576" > /sys/fs/cgroup/blkio/test_throttle/blkio.throttle.read_bps_device

# 將進程加入控制群組
echo 2750 > /sys/fs/cgroup/blkio/test_throttle/tasks

4. 驗證效果


iotop -o
# 讀取速度應降至 ~1MB/s 左右

5. 解除限制


echo "8:0 0" > /sys/fs/cgroup/blkio/test_throttle/blkio.throttle.read_bps_device

⚠️ Throttle 重要限制

  • 採樣間隔內的突發 I/O 不會被即時限制(核心定期檢查)
  • 僅適用於直接 I/O 或繞過頁面快取的 I/O;Buffered I/O 受頁面快取影響大
  • cgroups v2 介面不同(io.max),本文針對 v1

模式二:Weight 權重比例分配實戰

1. 環境準備:建立大檔案、關閉快取干擾


# 建立 2 個 4GB 測試檔
dd if=/dev/zero of=/tmp/file_1 bs=1M count=4096
dd if=/dev/zero of=/tmp/file_2 bs=1M count=4096

# 關閉虛擬機宿主機快取 (VirtualBox: 儲存控制器 → 使用主機 I/O 快取 → 取消勾選)
# 清空系統頁面快取
sync; echo 3 > /proc/sys/vm/drop_caches

2. 設定權重比例 5:1


echo 500 > /sys/fs/cgroup/blkio/test_weight1/blkio.weight
echo 100 > /sys/fs/cgroup/blkio/test_weight2/blkio.weight

3. 在對應 cgroup 執行 dd 測試


# 終端機 1
cgexec -g blkio:test_weight1 dd if=/tmp/file_1 of=/dev/null &

# 終端機 2
cgexec -g blkio:test_weight2 dd if=/tmp/file_2 of=/dev/null &

4. 觀察 I/O 比例


iotop -o
# 應呈現約 5:1 讀取速度比例

5. 裝置級權重


# 針對特定裝置設定權重 (格式:主:次 權重)
echo "8:0 200" > /sys/fs/cgroup/blkio/test_weight1/blkio.weight_device

blkio 監控統計指標完整表

所有指標皆為累計值,可用 echo 1 > blkio.reset_stats 歸零。

檔案含義單位/格式
blkio.time各裝置 I/O 總耗時毫秒
blkio.sectors各裝置讀寫扇區數扇區數
blkio.io_serviced各類型 I/O 操作完成次數read/write/sync/async/total
blkio.io_service_bytes各類型 I/O 傳輸位元組數Bytes
blkio.io_service_time各類型 I/O 服務時間微秒
blkio.io_wait_time各類型 I/O 佇列等待時間微秒
blkio.io_merged各類型 I/O 合併次數次數
blkio.io_queued各類型 I/O 當前佇列深度次數

查看範例


cat /sys/fs/cgroup/blkio/test_throttle/blkio.io_serviced
# 輸出格式:
# 8:0 Read 1234
# 8:0 Write 567
# 8:0 Sync 100
# 8:0 Async 1701
# 8:0 Total 1801

實務應用場景建議

場景推薦模式設定範例
資料庫核心業務保障Weight 高權重weight=800,其他服務 weight=200
備份/批次作業限速Throttlewrite_bps=50MB/s,避免衝擊線上
多租戶雲端主機Throttle + Weight各租戶硬性上限 + 保障最低權重
日誌收集器防寫滿Throttlewrite_iops=1000
建置/編譯伺服器Weight依專案優先級分配

cgroups v2 簡要對照

新版核心 (4.5+) 推出 cgroups v2,blkio 介面統一為 io.*:

  • io.max:對應 throttle (格式: `8:0 rbps=1048576 wbps=524288`)
  • io.weight:對應 weight (預設 100,範圍 1-10000)
  • 統計介面:io.stat (JSON 格式)

若系統使用 systemd 且啟用 Unified Hierarchy,請改用 v2 介面。

總結

  • Throttle = 硬上限,防噪鄰居,設定簡單但受快取影響
  • Weight = 相對比例,需測試環境排除快取干擾才能觀察明顯效果
  • 監控指標豐富,適合建立 I/O 觀測儀表板
  • 生產環境建議結合 systemd-run --scope -p IOReadBandwidthMax=... -p IOWriteBandwidthMax=... 臨時限流

善用 blkio cgroups,讓磁碟 I/O 資源分配不再靠「運氣」,而是可預測、可觀測、可控制。

Copyright © Windows教程網 All Rights Reserved