Docker daemon持续写磁盘致Shell命令卡顿问题求助(v19.03)
Docker Daemon 持续写入磁盘导致系统缓慢的原因与解决方法
我之前也碰到过类似的Docker磁盘写入过高导致系统卡顿的问题,结合你提供的进程信息和Docker 19.03版本的情况,大概率是以下几个原因造成的,给你一一分析并给出解决办法:
可能的原因
- 容器日志无限制输出:Docker默认会将容器的标准输出/错误日志以json-file格式存在本地,且没有大小和数量限制。如果有容器持续输出大量日志(比如调试日志、错误日志),dockerd会不断将这些日志写入磁盘,占用大量IO资源。
- 未开启自动清理机制:Docker运行过程中会产生大量无用的镜像、容器、卷、网络等资源,19.03版本默认没有开启自动清理,dockerd在后台扫描或维护这些资源时会频繁读写磁盘。
- Containerd日志或元数据频繁写入:你使用containerd作为runtime,如果containerd配置为debug日志级别,会产生大量日志文件;或者其元数据存储有异常,也会导致持续写入。
- 后台镜像拉取/更新任务:如果有定时拉取镜像、自动更新容器的脚本或第三方工具(比如watchtower),dockerd会在后台持续操作磁盘。
排查与解决步骤
1. 先定位具体写入的文件
首先用工具确认dockerd到底在写哪些文件,方便针对性解决:
- 用
iotop -oP查看实时IO情况,找到dockerd进程对应的写入文件路径; - 或者用
lsof -p <dockerd-pid> | grep -E "(REG|DIR)"列出dockerd打开的文件,重点看频繁写入的日志或数据文件。
2. 限制容器日志大小(最常见解决方案)
修改Docker daemon配置文件/etc/docker/daemon.json(如果没有就新建),添加日志轮转规则:
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
这个配置会让每个容器的日志最多保留3个10MB的文件,超过后自动轮转删除旧日志。修改后重启Docker:
systemctl restart docker
3. 开启自动清理无用资源
- 先手动清理一次所有无用资源:
docker system prune -af
- 然后设置定时任务自动清理(比如每周日凌晨2点),编辑crontab:
crontab -e
添加一行:
0 2 * * 0 docker system prune -af > /dev/null 2>&1
也可以在daemon.json中配置自动清理(19.03版本部分支持,建议测试):
{ "events": { "gc": { "enabled": true, "interval": "24h", "prune-filters": ["label!=keep"] } } }
4. 调整Containerd日志配置
查看containerd的配置文件/etc/containerd/config.toml,找到log_level选项,将其从debug改为info(减少日志输出):
[plugins."io.containerd.grpc.v1.cri"] log_level = "info"
修改后重启containerd:
systemctl restart containerd
5. 禁用不必要的后台任务
检查是否有定时拉取镜像的脚本,或者watchtower这类自动更新工具,暂时禁用这些服务,观察磁盘写入是否下降。
6. 检查存储驱动与磁盘状态
- 查看当前Docker存储驱动:
docker info | grep Storage Driver
如果使用overlay2,确保磁盘没有碎片化,且剩余空间充足(磁盘使用率超过80%会导致写入性能急剧下降)。可以考虑清理磁盘空间,或者对磁盘进行碎片整理。
内容的提问来源于stack exchange,提问作者Wallace
相关产品推荐
相关产品推荐

