Linux cgroups (Control Groups) 不僅能限制 CPU、記憶體,其 blkio 子系統 更提供精細的區塊裝置 I/O 流控能力。本文詳細介紹兩大核心模式——Throttle (節流限制) 與 Weight (權重分配) 的操作實戰、監控指標與注意事項。
| 參數 | 類型 | 功能 | 單位 |
|---|---|---|---|
| blkio.throttle.read_bps_device | Throttle | 限制每秒讀取位元組數 | Bytes/sec |
| blkio.throttle.read_iops_device | Throttle | 限制每秒讀取 IOPS | IOPS |
| blkio.throttle.write_bps_device | Throttle | 限制每秒寫入位元組數 | Bytes/sec |
| blkio.throttle.write_iops_device | Throttle | 限制每秒寫入 IOPS | IOPS |
| blkio.weight | Weight | 進程/群組 I/O 權重 (相對) | 10-1000 (預設 500) |
| blkio.weight_device | Weight | 特定裝置權重 | 10-1000 |
概念區別:
# 掛載 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
# 背景持續讀取 /dev/sda
dd if=/dev/sda of=/dev/null &
# 記下 PID,假設 2750
iotop -o
# 或
pidstat -d 1 -p 2750
# 格式: "主:次 限制值"
echo "8:0 1048576" > /sys/fs/cgroup/blkio/test_throttle/blkio.throttle.read_bps_device
# 將進程加入控制群組
echo 2750 > /sys/fs/cgroup/blkio/test_throttle/tasks
iotop -o
# 讀取速度應降至 ~1MB/s 左右
echo "8:0 0" > /sys/fs/cgroup/blkio/test_throttle/blkio.throttle.read_bps_device
io.max),本文針對 v1
# 建立 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
echo 500 > /sys/fs/cgroup/blkio/test_weight1/blkio.weight
echo 100 > /sys/fs/cgroup/blkio/test_weight2/blkio.weight
# 終端機 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 &
iotop -o
# 應呈現約 5:1 讀取速度比例
# 針對特定裝置設定權重 (格式:主:次 權重)
echo "8:0 200" > /sys/fs/cgroup/blkio/test_weight1/blkio.weight_device
所有指標皆為累計值,可用 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 |
| 備份/批次作業限速 | Throttle | write_bps=50MB/s,避免衝擊線上 |
| 多租戶雲端主機 | Throttle + Weight | 各租戶硬性上限 + 保障最低權重 |
| 日誌收集器防寫滿 | Throttle | write_iops=1000 |
| 建置/編譯伺服器 | Weight | 依專案優先級分配 |
新版核心 (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 介面。
systemd-run --scope -p IOReadBandwidthMax=... -p IOWriteBandwidthMax=... 臨時限流善用 blkio cgroups,讓磁碟 I/O 資源分配不再靠「運氣」,而是可預測、可觀測、可控制。