我们在 Linux 服务器(3.2 内核)上遇到了页面分配失败。我们被告知该问题与缓存内存使用率过高直接相关;这会导致外部碎片,并最终导致页面分配错误。以下是 top 输出的摘录:
top - 10:45:09 up 3 days, 17:10, 0 users, load average: 1.00, 0.97, 1.08
Tasks: 313 total, 3 running, 310 sleeping, 0 stopped, 0 zombie
Cpu(s): 7.9%us, 1.2%sy, 0.0%ni, 89.8%id, 0.2%wa, 0.0%hi, 0.9%si, 0.0%st
Mem: 8174056k total, 7948312k used, 225744k free, 278412k buffers
Swap: 2072348k total, 180k used, 2072168k free, 4676676k cached
我们被告知通过定期释放缓存可以缓解此问题:
echo 3 > /proc/sys/vm/drop_caches
有人告诉我,为了彻底解决问题,必须减少缓存使用量。但我不愿意相信缓存会导致页面分配错误。我理解分配给磁盘缓存的内存基本上是空闲内存(根据http://www.linuxatemyram.com) 和缓存的高内存使用率实际上是一个好兆头。当然,这会导致外部碎片,但内核是否会无法回收这个空间以满足例如 4 阶分配请求?示例程序可在http://www.linuxatemyram.com表明应用程序在这种情况下分配内存没有问题,但如果内核需要分配相同数量的内存,情况会有什么不同吗?
答案1
Linux 将使用未使用的 RAM 进行磁盘缓存,这是众所周知的,正如您所说。但是,如果您的应用程序在短时间内同时使用大量 RAM,则可能没有足够的可用内存,系统无法足够快地转储磁盘缓存,从而导致您描述的故障。
关键是首先解决页面分配失败问题。如果可以的话,增加更多 RAM 肯定会有所帮助,增加交换空间(通常我看到大多数应用程序的交换空间=RAM)也可以处理峰值。这这个问题还详细说明了您可以进行的一些内核调整。