为什么kmalloc在有空闲物理地址时返回失败但在删除页面缓存后返回成功

时间:2016-05-13 12:36:50

标签: memory memory-management kernel

机器的状态被描述为打击:

机器有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操作。

0 个答案:

没有答案