宿主机没跑别的任务,iostat 里 vda 的 util 一直 100%,同机接口 P99 从 80ms 涨到 900ms,容器里 CPU 和内存都正常,问题只在磁盘这一层,很容易误判成应用变慢。乍看像缓存或者权限的锅,追下去往往不是。

iostat -x 1 3
sudo pidstat -d 1 5
cat /sys/fs/cgroup/system.slice/docker-<id>.scope/io.max
docker stats --no-stream

追下去是这么回事:容器默认共享宿主机的 IO 队列,密集写日志或者跑批不吃 CPU 也能把磁盘打满,blkio 权重没设置时所有容器平等抢,关键服务就吃亏。

「容器 IO 争抢」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

具体做法是,用 iotop 或者 pidstat 找写量最大的进程和容器 按累计写入排序;查 cgroup 里的 io.max 与权重是否真的配了 很多容器根本没设;给批处理容器限速或者把任务挪到低峰时段 简单但有效。

验收就看一点,iostat 的 await 回落 关键接口 P99 恢复到百毫秒以内 再观察一个高峰时段 再压一次。

作者 9823189