使用 gdb 分析进程内存问题
正确方法一:利用gcore直接对进程“搜魂”(无须重启,抓取最真实内存)
如果cri-docker进程目前已经吃了很多内存,千万别重启。我们可以直接通过 Linux 的gcore(GNU 内存转储工具)把该进程的全部内存直接“镜像”下来。
sudo apt install gdb -y # Ubuntu/Debian # 或 sudo yum install gdb -y # CentOS/RHEL找到cri-dockerd的进程 PID:
pidof cri-dockerd # 或者从你之前的系统日志看,PID 是 56786抓取核心转储(Core Dump)文件:
# 这会把进程当前的 60G 内存生成一个映像文件(确保目标磁盘空间足够!) sudo gcore -o cri_docker_memory.dump <cri-dockerd的PID>使用viewcore或gdb进行离线账单分析:拿到 dump 文件后,可以在任何装有 Go 环境的开发机上,使用 Go 官方的viewcore工具(或者直接用 gdb)来强行读取里面的 Goroutine 列表和内存堆栈:
# 查看当前内存里堆积的所有 Goroutine 状态 gdb /usr/bin/cri-dockerd cri_docker_memory.dump -ex "thread apply all bt" > goroutines_track.log通过goroutines_track.log,你可以直接肉眼看到几万个卡在exec、stream或network上的僵尸线程。
gdb 介绍
