共享内存不足问题
背景
这是一次使用的时候发现的很蛋疼的问题。起因是我们在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