如何让 Linux 保持“缓存”较高?

如何让 Linux 保持“缓存”较高?

我们在 Debian 上运行着一项繁重的服务。我们的服务会产生大量文件 i/o,其性能取决于 Linux 内核缓存文件的能力。

我们的系统有 64GB 内存。总文件大小为 500GB(很多小文件)。这些文件通过 raid 上的 reiserfs 提供。内核现在是 3.2.9。(这不是一个新问题。我们已经有这个问题好几年了。)

通常,大多数文件内容都被缓存,我们的系统运行顺利。free(1)命令显示14G内存缓存,10G内存缓冲区和8G内存是空闲的。

然而,在我们的高峰时段,我发现 Linux 内核释放了大部分缓存/缓冲区并将它们保持在空闲状态。在我看来,将内存保持在空闲状态是一种巨大的浪费,我猜这就是我们的服务在繁忙时段过载的原因。free(1) 命令显示类似 2G 缓存、2G 缓冲区和 28G 空闲的内容。

我的问题是,在什么情况下 Linux 内核想要释放内存而不是缓存/缓冲。如何避免这种行为?我们可以调整任何配置吗?

(如果您需要有关我们的硬件/系统/服务的更多信息,请告诉我)

答案1

发生这种情况有两个主要原因。

一种情况是有人或脚本命令它这样做,我希望你能排除这种情况。例如,有人向 发送命令/sys/vm/drop_caches

另一种情况是,如果该内存用于其他目的。如果应用程序需要大量内存,内核将为该应用程序提供该内存,并根据需要减少缓存。当应用程序用完该内存后,它将变为空闲。随着时间的推移,它只会用缓存数据重新填充。

如果是这种情况,您可以采取一些措施。例如,如果内存占用是由于您尝试同时处理四个请求而发生的,您可能希望重新配置为最多同时处理两个请求。如果这可以让您在缓存中保留更多数据,那么总体而言,这可能是一种性能提升。

答案2

是否可以将任何东西放入 ramdisk?如果您愿意,可以使用显式缓存。不确定您正在做的事情是否适合这一点,您可能已经考虑过,但我会把它扔出去 ;)

请看这里: http://www.linuxinsight.com/proc_sys_vm_hierarchy.html

有一些位您可以轻松调整,只需通过“cat”输入值即可。vfs_cache_pressure 和 zone_reclaim_mode 跳出,警告:我只调整过 swappiness。

答案3

内存过大free可能是由一个或多个需要大量内存的短命进程造成的。Linux 内核将使用空闲内存进行缓存,但如果某个进程在短时间内获取更多内存,这些缓存将被丢弃,而不是使用交换。从您提供的数字来看,系统似乎会看到额外的在高峰时段,20 GB 的 RAM 负载对于您的系统来说太多了,因为缓存太小了。

我会尝试在您看到缓存下降时记录正在运行的进程(例如,date; free -m; ps auxw每 5 秒记录一次到文件中,直到您发现问题)。

相关内容