守护进程崩溃需绕过日志,从systemd状态、dockerd进程行为、containerd日志、存储驱动、cgroup兼容性、dmesg内核线索及日志驱动反向拖垮等七维反推根因。

直接查 /var/log/docker.log 或 journalctl -u docker.service 是常见做法,但微服务生产环境里,守护进程崩溃往往不是日志“写不进去”,而是底层驱动(如 overlay2、containerd、cgroup)已失联或卡死,此时传统日志可能早已停更。真正有效的排查,得绕过日志本身,从系统行为和驱动状态反推异常根源。
确认守护进程是否真“崩溃”而非“假死”
先排除网络或权限干扰,避免误判:
- 执行
systemctl is-active docker—— 若返回activating或卡住,说明 systemd 已无法获取其状态,大概率是进程僵死或内核级阻塞 - 运行
ps aux | grep dockerd—— 若进程存在但 CPU 占用为 0、RSS 持续飙升、或堆栈长时间停留在futex_wait_queue_me类调用,属于典型驱动层挂起 - 检查
/var/run/docker.sock是否可访问:curl --unix-sockets http://localhost/version—— 返回超时或 connection refused,比日志报错更早暴露底层通信中断
聚焦 containerd 和存储驱动的实时状态
Docker守护进程严重依赖 containerd,而它又直连内核存储与 cgroup。崩溃常始于这两层:
- 查
containerd日志:journalctl -u containerd --no-pager -n 100—— 关注failed to mount、failed to create snapshot、cannot set memory limit等关键词,这些是 overlay2 或 cgroup v2 配置失败的直接证据 - 验证存储驱动健康:
docker info | grep -E "(Storage Driver|Driver Status)"—— 若显示overlay2但Driver Status为空或报invalid argument,说明驱动初始化失败,需检查/var/lib/docker/overlay2目录是否损坏或被只读挂载 - 检查 cgroup 版本兼容性:
cat /proc/1/cgroup看路径是否含unified;再对照docker info | grep "Cgroup"—— 若主机用 cgroup v2,但daemon.json强制启用了"exec-opts": ["native.cgroupdriver=systemd"],就会导致 dockerd 启动后数分钟内静默退出
抓取内核级线索:dmesg 和 proc 文件系统
当 journalctl 日志断更,dmesg 往往保留着最后的内核告警,是定位驱动级崩溃的黄金窗口:
- 立即执行
dmesg -T | tail -50—— 重点关注overlayfs、ext4 error、memory: out of memory、nf_conntrack: table full等输出。例如出现overlayfs: failed to get index dir,基本可锁定 overlay2 元数据损坏 - 检查关键 proc 接口:
ls -l /proc/sys/fs/inotify/max_user_watches和/proc/sys/user/max_user_namespaces—— 微服务容器数量多时,这两个值过低会触发 containerd watch 失败,最终使 dockerd 无法响应新容器请求,但日志里几乎不体现 - 查看
/sys/fs/cgroup/memory/docker/下是否有残留的空目录或权限异常的子目录 —— 这类残留常导致后续容器创建时no space left on device报错,实则与磁盘无关,而是 cgroup 子系统拒绝分配新内存控制器
验证是否由日志驱动反向拖垮守护进程
很多人忽略:json-file 日志驱动若配置不当(如 max-size 未设限),大量容器并发刷日志时,会因频繁 fsync 和 inode 锁竞争,把 dockerd 主线程堵死在内核 IO 调度队列中:
- 执行
lsof -p $(pgrep dockerd) | grep json.log—— 若发现数百个打开的-json.log文件描述符,且du -sh /var/lib/docker/containers/*/显示某几个容器日志超 GB 级,就是典型诱因 - 临时禁用日志写入验证:
systemctl stop docker && rm -f /var/lib/docker/containers/*/*-json.log && systemctl start docker—— 若重启后 dockerd 立即恢复响应,即可确认日志驱动是压垮骆驼的最后一根稻草 - 生产环境应全局启用日志轮转:
/etc/docker/daemon.json中强制设置"log-driver": "json-file", "log-opts": {"max-size": "10m", "max-file": "3"},避免单点日志失控引发级联故障



















