共享内存不足问题

背景

这是一次使用的时候发现的很蛋疼的问题。起因是我们在k8s部署一个开发的服务的时候,发现这个服务不停的core

找出问题

组内大佬找到了core文件,用gdb发现了是写共享内存的时候写不进去导致服务core了。跟代码的时候发现这个是宏定义的。

继续跟进问题

根据上面的情况,检查空间后发现k8s分配的容器,/dev/shm 是固定的64M。

根据网上找的资料发现,可以发现,挂载一个emptyDir 即可解决这个问题。手工修改尝试后确实解决了这个问题

进一步的思考

可以看到,挂载emptyDir 之后,查看/dev/shm的大小就跟磁盘空间一样大了,那这么干是不是意味着内存的空间就无限了呢?实际上并不是的,内存空间依然是优先的,只不过这种方式会偷偷的使用了宿主机的内存,但是这种使用k8s的调度器是感知不到的。

这样就会引发一个问题,k8s的调度器觉得目前这个node还可以继续创建pod,但是实际上这个node的内存已经被使用完了,一旦创建,就会出现超发的情况,node的资源不够使用,又会反过来触发k8s的调度逻辑,强制把这个node上的某些pod进行驱逐。而从我们外部的表现来看,就是部分pod被重建了。

参考文档

设置kubernetes Pod的shared memory (ieevee.com)

docker - Define size for /dev/shm on container engine - Stack Overflow

Last Updated: 3/14/2022, 10:30:40 PM