Install Go
Go-配置Go开发环境
version=1.20.5
wget --no-check-certificate https://studygolang.com/dl/golang/go${version}.linux-amd64.tar.gz
tar zxf go${version}.linux-amd64.tar.gz -C /tmp/
export PATH="/tmp/go/bin:$PATH"
go version
开启debug端口
sudo yum install -y socat
sudo socat -d -d TCP-LISTEN:8080,fork,bind=0.0.0.0 UNIX:/var/run/docker.sock
pprof heap
实时分析
go tool pprof http://$(hostname -i):8080/debug/pprof/heap
离线分析
curl -sK -v http://localhost:8080/debug/pprof/heap > heap-dockerd.out
ls -alh heap-dockerd.out
go tool pprof heap-dockerd.out
pprof goroutine
curl -sK -v http://localhost:8080/debug/pprof/goroutine?debug=1 > goroutine-dockerd.out
ls -alh goroutine-dockerd.out
go tool pprof goroutine-dockerd.out
参考文档
- go tool pprof用法
- 客户端调用ContainerSta未设置超时,dockerd服务端也没有超时,定时获取所有容器stats信息,创建大量chan,造成fd泄露
- dockerd采用uds(Unix Domain Socket)对外提供服务,使用socat进行端口转发以便于调试
- kubelet日志中出现大量无法删除容器的日志,ps aux 发现很多D进程
- dockerd尝试删除不存在的容器,但是容器内有D进程,无法删除,不能发出take exit 信号,docker持续创建大量kill和wait的goroutine,导致资源泄露
- 注:D 进程:即被称为“死掉的进程”或“不可中断的进程”,通常是由于进程在等待某些资源时被阻塞,而这些资源无法得到满足,导致进程无法继续执行。D 进程通常只能通过重启系统来清除。
- dockerd进程打开文件数100K+
- Pod丢失,kubelet在反复重启container