有没有办法限制 Linux 中“缓冲区”内存的使用?

有没有办法限制 Linux 中“缓冲区”内存的使用?

我想限制 Linux 服务器将 RAM 分配到磁盘缓存缓冲区中,而是让它处于闲置状态。(如果重要的话,CentOS 5)。我知道最好将每一滴可用的物理 RAM 都用于某物即使只是缓存磁盘 - Linux 在这方面很出色。大多数时候我甚至不会考虑尝试击败它。让我告诉你我为什么要这样做(我是不是担心监控):

我的公司与第三方签订了某些虚拟机的合同,我们的月度账单中包含承诺的内存限制。超额费用非常昂贵。其中 2 个虚拟机运行一个应用程序,它只是咀嚼在进程启动期间,RAM 会消耗殆尽,但一旦稳定,使用率就会大幅下降。开发人员向我保证,这就是这项服务应该做的事情,而且短期内不会“好转”。因此,我为这些虚拟机配置了正常运行模式下通常所需 RAM 的 2 倍左右。一旦稳定,多余的 RAM 就会被扔进缓冲区缓存中,每个人都会很高兴。除了财务人员。

我们的提供商会将分配给缓冲区缓存的 RAM 计入我们为虚拟数据中心承诺的总金额,因此我们每个月都要为此付费。很多。我认为我不在乎缓存的内容 - 我很乐意使用更少的 RAM(即更少的缓存)并在文件访问上承受一些性能损失(我假设......)除非应用程序从头开始启动并且需要该 RAM 来避免实际交换到地狱和回程。

因此,我正在寻找一种方法来告诉 Linux,例如“嘿,只使用 1GB(或更好,x%)的可用 RAM 用于磁盘缓存缓冲,是的,​​继续浪费其余的 RAM!”。我们可以在多年内节省大量资金,因为如果该 RAM 实际上保持空闲状态并且不分配给缓冲区,则它不会计入我们承诺的金额,我们也不必“租用”它。但是由于某物正在使用它,即使只是缓冲区缓存,我们也要为它付费。

我搜索了很多,大多看到这样的问题:“天哪,为什么我的服务器一直处于 100% 的状态...”人们对他们的监控/警报/nms 感到恐慌,并从回复中得到启发 - 这就是不是我的问题是:10 年前我也曾有过同样的反应,但在这种情况下,我真的不想使用那部分 RAM,这样当应用程序不需要它时,我就不必为它“支付租金”。

如果您想到其他方法来实现此目的,欢迎提出其他建议。

非常感谢...

答案1

vm.min_free_kbytes 看起来可能会有帮助。例如执行

echo 524288 > /proc/sys/vm/min_free_kbytes # Value should be in MB

会强制系统始终保持 512MB 的 RAM 可用。如果某个进程需要内存,它会获得内存,之后系统将很难再次释放该数量的内存,可能是通过释放缓冲区缓存或换出其他进程。您可以在应用程序启动后设置此参数。

答案2

我不知道您是否可以阻止缓存,但您可以定期要求 Linux 删除缓存。操作方法如下:https://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux-system 如果您在命令sync之前执行此echo to /proc/sys/vm/drop_caches操作,它应该会释放大量的内存。

Linux 不会主动打开文件并缓存它们来填充您的内存。只有实际活动的文件才会被缓存。这些文件可能是您的应用程序使用的文件,包括程序的二进制代码。

它也可能是日志文件。您可以使用网络日志来避免这种情况。

另一种方法是在虚拟机中运行您的应用程序,使用更少的 RAM,并使用 RAM 磁盘作为交换设备(然后控制 sappiness 级别),但这有点复杂。

我想知道您的提供商如何知道您的系统分配了多少 RAM 但未使用。即使未使用,这些 RAM 页也不会是空的。

答案3

如果该应用程序创建了缓存,我认为你可以使用cgroups应用程序稳定后:

创建一个名为 group1 的 cgroup,并设置内存限制(例如 50GB,还支持 CPU 等其他限制,示例中也提到了 CPU):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

然后在启动后将应用程序纳入该cgroup中:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

相关内容