记一次go程序在k8s中内存虚高不下问题

线上程序跑了一周, 内存奔到5G
使用命令:kubectl top pod -n {namespace}


image.png

使用pprof查看是否是go内存泄漏

注:程序运行时加上pprof才能查看(_ "net/http/pprof")
升级时存了一份当时的内存文件
只要下载现在的内存文件做一下比较,看是否有内存泄漏

go tool pprof http://10.3.0.200:30985/debug/pprof/heap

go tool pprof -base .\pprof.monitorweb.alloc_objects.alloc_space.inuse_objects.inuse_space.003.pb.gz .\pprof.monitorweb.alloc_objects.alloc_space.inuse_objects.inuse_space.004.pb.gz
image.png

比较后发现内存并没有增大多少

进入容器中查看

image.png

查看虚拟内存虚高
查看内存真实占有


image.png

查了好久想到seelog日志量增大了, 看是否是日志cache导致
接着把回滚日志(就是归档日志)备份了一个, 把原日志文件删除了,发现内存降下来了

原来问题出在之前的每日的日志还占用cash

解决问题
先在k8s中限制一下pod的内存, 不能影响到其他pod,观察一段时间

//yaml
resources:
      requests:
         cpu: "200m"
         memory: "128Mi"
       limits:
         cpu: "500m"
         memory: "512Mi"

后续: 限制后内存不超过512M后一直保持在300多M,也不往上涨了,应该是缓存被及时清理了

你可能感兴趣的:(记一次go程序在k8s中内存虚高不下问题)