限制 Linux 中缓冲区缓存的大小

Wim*_*Wim 41 buffer linux-kernel

有没有办法告诉 Linux 内核只将一定比例的内存用于缓冲区缓存?我知道/proc/sys/vm/drop_caches可以用来临时清除缓存,但是否有任何永久设置可以防止它增长到超过主内存的 50%?

我想这样做的原因是,我有一台运行 Ceph OSD 的服务器,它不断地从磁盘提供数据,并设法在几个小时内用完整个物理内存作为缓冲区缓存。同时,我需要运行将分配大量(数十 GB)物理内存的应用程序。与流行的看法相反(请参阅关于几乎所有有关缓冲区缓存的问题的建议),通过丢弃干净的缓存条目来自动释放内存不是即时的:当缓冲区缓存已满时,启动我的应用程序可能需要长达一分钟的时间( *),而在清除缓存后(使用echo 3 > /proc/sys/vm/drop_caches),相同的应用程序几乎立即启动。

(*) 根据 Vtune 在一个名为pageblock_pfn_to_page. 这个功能似乎与查找大页面所需的内存压缩有关,这让我相信实际上是碎片化的问题。

小智 18

如果您不想要绝对限制,而只是向内核施压以更快地清除缓冲区,则应该查看 vm.vfs_cache_pressure

此变量控制内核回收用于缓存 VFS 缓存的内存的趋势,而不是页面缓存和交换。增加此值会增加 VFS 缓存的回收率。

范围从 0 到 200。将其移向 200 以获得更高的压力。默认设置为 100。您还可以使用该slabtop命令分析内存使用情况。在您的情况下,dentry*_inode_cache值必须很高。

如果你想要一个绝对限制,你应该查找cgroups. 将 Ceph OSD 服务器放在一个 cgroup 中,并通过设置memory.limit_in_bytescgroup的参数来限制它可以使用的最大内存。

memory.memsw.limit_in_bytes设置内存和交换使用总和的最大数量。如果未指定单位,则将该值解释为字节。但是,可以使用后缀来表示更大的单位——k 或 K 代表千字节,m 或 M 代表兆字节,g 或 G 代表千兆字节。

参考:

[1] - GlusterFS Linux 内核调优

[2] - RHEL 6 资源管理指南

  • 我认为 `vfs_cache_pressure` 只清除 dentry 和 inode 缓存,与缓冲区缓存无关。 (6认同)
  • 如果您没有足够的 RAM 来满足工作负载,则将“vfs_cache_Pressure”增加到“100”以上可能会有所帮助。它会减少 RAM 使用量,但会导致整体 I/O 性能较差。 (2认同)

Ale*_*nov 6

如果 Ceph OSD 是一个单独的进程,您可以使用cgroup来控制进程使用的资源:

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

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1
Run Code Online (Sandbox Code Playgroud)

然后,如果您的应用程序已经在运行,请将应用程序放入此 cgroup 中:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)
Run Code Online (Sandbox Code Playgroud)

或者在此 cgroup 中执行您的应用程序:

cgexec -g memory,cpu:group1 your_app_name
Run Code Online (Sandbox Code Playgroud)


小智 5

我不知道 A %,但是,您可以设置一个时间限制,以便它在 x 分钟后删除它。

首先在终端

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

清除当前缓存。

使其成为cron-job 按 Alt-F2,键入gksudo gedit /etc/crontab然后在底部附近添加此行。

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

**每 15 分钟清洁一次。如果您确实想要,可以将第一个参数更改为 * 或/5 而不是/15,将其设置为 1 或 5 分钟

要查看您的可用 RAM(缓存除外):

free -m | sed -n -e '3p' | grep -Po "\d+$"                          
Run Code Online (Sandbox Code Playgroud)

  • @andras.tim no --sync 将脏页写入磁盘,3 到 drop_caches 仅回收/释放干净页和其他缓存使用的内存。你不必运行同步,但如果你这样做,更多的内存将是干净的而不是脏的,并且当你删除缓存时将释放更多的内存 (5认同)