cgroups blkio 子系統提供塊裝置 I/O 的節流 與權重分配兩大控制模式,並內建豐富的統計介面。本文通過實戰示範如何限制進程讀寫頻寬、按權重分配 I/O、監控關鍵指標並針對不同裝置實施差異化策略。
| 參數 | 類型 | 功能 | 單位 |
|---|---|---|---|
blkio.throttle.read_bps_device | 節流 | 限制每秒讀取位元組數 | Bytes/sec |
blkio.throttle.write_bps_device | 節流 | 限制每秒寫入位元組數 | Bytes/sec |
blkio.throttle.read_iops_device | 節流 | 限制每秒讀取操作數 | IOPS |
blkio.throttle.write_iops_device | 節流 | 限制每秒寫入操作數 | IOPS |
blkio.weight | 權重 | CFQ 排程器下相對 I/O 權重 (10~1000) | 相對權重 |
blkio.weight_device | 權重 | 針對特定裝置設定權重 | 相對權重 |
dd if=/dev/sda of=/dev/null &
# 假設 PID=2750
ls -l /dev/sda
# brw-rw---- 1 root disk 8, 0 ... → 主:次 = 8:0
mkdir -p /sys/fs/cgroup/blkio/foo
echo '8:0 1048576' > /sys/fs/cgroup/blkio/foo/blkio.throttle.read_bps_device
echo 2750 > /sys/fs/cgroup/blkio/foo/tasks
iotop 觀察):# 限制前:~66 MB/s
# 限制後:~1 MB/s (約 1048576 B/s)
echo '8:0 0' > /sys/fs/cgroup/blkio/foo/blkio.throttle.read_bps_device
注意:節流採用 Token Bucket 演算法,對小於取樣間隔的突發 I/O (如 1 秒內 100MB 尖峰) 無法精確限制。
mkdir -p /sys/fs/cgroup/blkio/foo /sys/fs/cgroup/blkio/bar
echo 500 > /sys/fs/cgroup/blkio/foo/blkio.weight
echo 100 > /sys/fs/cgroup/blkio/bar/blkio.weight
dd if=/dev/zero of=/tmp/file_1 bs=1G count=1
dd if=/dev/zero of=/tmp/file_2 bs=1G count=1
sync && echo 3 > /proc/sys/vm/drop_caches
cgexec -g "blkio:foo" dd if=/tmp/file_1 of=/dev/null &
cgexec -g "blkio:bar" dd if=/tmp/file_2 of=/dev/null &
iotop:兩進程讀取頻寬比約維持 5:1 (500:100)。優勢:非繁忙時可充分利用頻寬;繁忙時按比例保障,比節流更彈性。
blkio.weight_device 格式:主:次 權重。
# 針對 sda (8:0) 給 foo 組權重 800,sdb (8:16) 給 200
echo '8:0 800' > /sys/fs/cgroup/blkio/foo/blkio.weight_device
echo '8:16 200' > /sys/fs/cgroup/blkio/foo/blkio.weight_device
| 檔案 | 含義 |
|---|---|
blkio.time | 各裝置 I/O 服務時間 (毫秒) |
blkio.sectors | 各裝置讀/寫扇區數 |
blkio.io_serviced | 各類型 (read/write/sync/async/total) I/O 操作次數 |
blkio.io_service_bytes | 各類型 I/O 傳輸位元組數 |
blkio.io_service_time | 各類型 I/O 服務時間 (微秒) |
blkio.io_wait_time | 各類型 I/O 在佇列等待時間 |
blkio.io_merged | 各類型 I/O 請求合併次數 |
blkio.io_queued | 各類型 I/O 當前佇列深度 |