有没有办法限制 Linux 中的缓冲区缓存大小?

有没有办法限制 Linux 中的缓冲区缓存大小?

我的程序在 I/O 操作期间消耗了大量内存,这是执行大量 I/O 操作的副作用。当我使用 direct_io 运行程序时,内存问题消失了,但程序完成任务所需的时间却增加了四倍。

有什么方法可以减少缓冲区缓存(I/O 操作期间使用的内核缓冲区)的最大大小吗?最好不要更改内核源代码。

我尝试过减少/proc/sys/vm/dirty_bytes 等。但似乎并没有带来明显的区别。

更新:echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches 在程序运行期间使用可暂时减少使用的内存量。

我能以某种方式限制页面缓存、目录项和 inode,而不是不断释放它们吗?那可能可以解决我的问题。

之前没有注意到,但问题出现在每个 I/O 操作上,而不仅仅是分区。看起来 Linux 正在缓存通过 I/O 的所有内容,直到达到几乎最大可用内存的某个点,留下 4 MB 的可用内存。因此,对于可以为 I/O 缓存多少内存存在某种上限。但我找不到它在哪里。有点绝望。如果我无法在内核源代码中的某个地方将其除以 2,我很乐意这样做。

2016 年 12 月 12 日更新:我放弃了修复这个问题,但有些东西引起了我的注意,让我想起了这个问题。我家里有一个旧的故障硬盘,当我尝试用它做某事时,它会疯狂地浪费资源。

这可能是硬盘故障导致的吗?有问题的硬盘在问题发生后一个月内就坏了。如果是这样,我找到了答案。

答案1

正如你问到的程序,你可以使用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)

或者在此 cgroup 内执行你的应用程序:

cgexec -g memory,cpu:group1 your_app_name

相关内容