现象
系统突然很卡顿, 分析内存和磁盘状态缺都很正常, 部署pod一直失败.
查看/var/log/messages
日志文件发现一直报错如下
Jul 18 21:29:01 ip-10-10-17-135 kernel: [186998.252395] SLUB: Unable to allocate memory on node -1 (gfp=0x2080020)
Jul 18 21:29:01 ip-10-10-17-135 kernel: [186998.252402] cache: kmalloc-2048(2412:6c2c4ef2026a77599d279450517cb061545fa963ff9faab731daab2a1f672915), object size: 2048, buffer size: 2048, default order: 3, min order: 0
Jul 18 21:29:01 ip-10-10-17-135 kernel: [186998.252407] node 0: slabs: 135, objs: 1950, free: 64
Jul 18 21:29:01 ip-10-10-17-135 kernel: [186998.252409] node 1: slabs: 130, objs: 1716, free: 0
解决办法
-
手动执行
sync
命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件) -
执行
echo 3 > /proc/sys/vm/drop_caches
命令清除pagecache和slab分配器中的缓存对象 -
java 10之后JVM 参数中使用
-XX:-UseContainerSupport
关闭容器支持可能会有帮助, 但是原博主VonC测试后发现对处理页面缓存没有太大用处
原因
内核bug, 执行slabtop
和iostat
命令可获取相关信息, 详细分析过程及相关问题讨论可查看参考链接
参考
1. https://stackoverflow.com/questions/57103486/docker-memory-limit-causes-slub-unable-to-allocate-with-large-page-cache
2. https://www.lmlphp.com/user/151653/article/item/3675464/
3. https://stackoverflow.com/questions/43405813/linux-slub-unable-to-allocate-memory-on-node