pprof分析dockerd进程内存占用

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

参考文档

Dockerd内存泄露

  • go tool pprof用法
  • 客户端调用ContainerSta未设置超时,dockerd服务端也没有超时,定时获取所有容器stats信息,创建大量chan,造成fd泄露

Dockerd 资源泄露怎么办

  • dockerd采用uds(Unix Domain Socket)对外提供服务,使用socat进行端口转发以便于调试
  • kubelet日志中出现大量无法删除容器的日志,ps aux 发现很多D进程
  • dockerd尝试删除不存在的容器,但是容器内有D进程,无法删除,不能发出take exit 信号,docker持续创建大量kill和wait的goroutine,导致资源泄露
  • 注:D 进程:即被称为“死掉的进程”或“不可中断的进程”,通常是由于进程在等待某些资源时被阻塞,而这些资源无法得到满足,导致进程无法继续执行。D 进程通常只能通过重启系统来清除。

dockerd占用内存高

  • dockerd进程打开文件数100K+
  • Pod丢失,kubelet在反复重启container

[译] 如何在大型代码库上使用 pprof 调查 Go 中的内存泄漏

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容