Ubuntu18.04 Docker容器Python进程被杀的系统kill信号日志查询方法
资源超限进程被杀的默认日志记录情况
Linux内核以及Docker层面默认会记录内存超限触发的OOM kill事件,其他资源(CPU、磁盘IO、文件句柄等)超限默认不会主动杀死进程,也不会默认生成kill事件日志。
内存超限(OOM)事件查询方法
内存超限是容器进程被强制杀死的最高频原因,且被内核杀死的进程不会输出任何stderr日志,和你当前docker logs无相关输出的表现完全吻合,可通过以下路径查询默认记录:
- 查内核日志缓冲区:执行
dmesg | grep -i 'killed process',输出会明确标注被杀死进程的PID、进程名、内存占用量,以及所属的cgroup路径(可以对应到具体Docker容器ID)。 - 查系统syslog归档:Ubuntu 18.04默认会把内核日志写入syslog,执行
grep -i 'oom-killer' /var/log/syslog,重启过的系统可查/var/log/syslog.1等历史归档文件。 - 查Docker daemon日志:如果是Docker配置的容器内存限制触发的OOM,可执行
journalctl -u docker.service | grep -i 'oom',直接得到触发OOM的容器ID。
其他资源超限的日志配置方案
如果排查后确认不是OOM,需要手动配置日志采集规则来定位其他资源问题:
开启cgroup资源统计
修改Docker daemon配置文件/etc/docker/daemon.json,添加如下配置开启完整的cgroup资源统计:
{ "cgroup-parent": "/docker", "exec-opts": ["native.cgroupdriver=cgroupfs"] }
执行systemctl restart docker重启服务生效。
配置auditd记录进程 kill 事件
auditd可以记录所有进程被杀死的事件,方便溯源:
- 安装auditd:
apt update && apt install -y auditd - 添加监控规则:
auditctl -a exit,always -F arch=b64 -S kill -S exit_group -k process_kill - 后续查询事件:
ausearch -k process_kill -i,可以看到进程退出的信号类型,SIGKILL(信号9)就是被强制杀死的事件,结合cgroup的资源占用记录就能对应到触发超限的资源类型。
容器资源打点配置
启动容器时添加健康检查参数,定时输出资源使用率到Docker日志,方便定位峰值:
docker run -d \ --log-driver json-file --log-opt max-size=10m \ --health-cmd "python3 -c 'import psutil; print(\"mem_usage:%s,cpu_usage:%s\" % (psutil.virtual_memory().percent, psutil.cpu_percent()))'" \ --health-interval 10s \ 你的镜像名
后续直接执行docker logs ${container_id}就能看到间隔10秒的资源打点数据。
内容的提问来源于stack exchange,提问作者0-_-0
相关产品推荐
相关产品推荐

