内存回收不及时导致卡死
一直不管负载会到100+
/var/log/message
Jan 21 12:25:50 k8s-node16 kernel: XFS: 6(6472) possible memory allocation deadlock size 384 in kmem_alloc (mode:0x250)
问题原因:
内存回收不及时,碎片化。当某进程执行时,在 xfs 的申请内存中有连续的大块内存申请请求。就会导致内存一直分配不到。例如执行 docker 命令,kubelet 等操作,回一直阻塞在 kmem_alloc 循环中, 反复申请内存,由于内存碎片没有被组合,因此就一直申请不到执行命令也会卡住,这也就验证了执行某些 ps,ssh 都会失败。
由于内存碎片过多,无法分配连续大块内存导致进程等待内存回收。
min_free_kbytes设置过小,CentOS默认设置60M
解决方式:
Linux 提供了 min_free_kbytes ,用来确定系统开始回收内存的阈值,控制系统的空闲内存。值越高,内核越早开始回收内存,空闲内存越高。
调整为4G
(1)立即释放
echo 4194304 > /proc/sys/vm/min_free_kbytes
(2)永久设置
vi /etc/sysctl.conf
vm.min_free_kbytes = 4194304
参考文献:
echo 2097152 > /proc/sys/vm/min_free_kbytes
vi /etc/sysctl.conf
vm.min_free_kbytes = 2097152