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_bytes
cgroup的参数来限制它可以使用的最大内存。
memory.memsw.limit_in_bytes
设置内存和交换使用总和的最大数量。如果未指定单位,则将该值解释为字节。但是,可以使用后缀来表示更大的单位——k 或 K 代表千字节,m 或 M 代表兆字节,g 或 G 代表千兆字节。
参考:
[1] - GlusterFS Linux 内核调优
[2] - RHEL 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)
归档时间: |
|
查看次数: |
68493 次 |
最近记录: |