机器的状态被描述为打击:
机器有96个物理内存。实际使用内存约为64G,页面缓存约使用32G。我们也使用交换区域,那时我们有大约10G(我们将交换最大大小设置为32G)。那时,我们找到了xfs报告
Apr 29 21:54:31 w-openstack86 kernel: XFS: possible memory allocation deadlock in kmem_alloc (mode:0x250)
阅读源代码后。此消息显示在此行
ptr = kmalloc(size, lflags);
if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP)))
return ptr;
if (!(++retries % 100))
xfs_err(NULL,
"possible memory allocation deadlock in %s (mode:0x%x)",
__func__, lflags);
congestion_wait(BLK_RW_ASYNC, HZ/50);
错误是由kmalloc()函数引起的,系统中没有足够的内存。但仍有32G页面缓存。
所以我跑
echo 3 > /proc/sys/vm/drop_caches
删除页面缓存。
然后系统很好。但我真的不知道原因。 为什么在运行drop_caches操作后kmalloc()函数会成功?我认为即使我们使用整个物理内存,但我们只使用64真正的内存,32G内存是页面缓存,我们还有足够的交换空间。那么为什么内核不会刷新页面缓存或交换以保留kmalloc操作。