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


25

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

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

(*)根据Vtune在称为的函数中,在启动的这一分钟内,应用程序在新内存中出现故障,但将其100%的时间花费在内核中pageblock_pfn_to_page。此功能似乎与查找大型页面所需的内存压缩有关,这使我相信碎片实际上是问题所在。


1
有一种叫做缓存分层的东西。ceph osd池设置{cachepool} hit_set_count 1 ceph osd池设置{cachepool} hit_set_period 3600 ceph osd池设置{cachepool} target_max_bytes 1000000000000例如。docs.ceph.com/docs/master/rados/operations/cache-tiering
Michael D.

2
由于此问题显然仅影响内存密集型应用程序的启动,因此也许您可以通过在实际启动之前清除缓存的脚本来启动应用程序。也许这可以更快地启动它们,同时在它们运行时仍将缓存管理留给内核。
Thawn

Answers:


14

如果您不希望绝对限制,而只是向内核施加压力以更快地冲走缓冲区,则应查看 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资源管理指南


1
一个带有limit_in_bytesset 的cgroup 似乎可以做到。谢谢!
2016年

4
我认为vfs_cache_pressure只清除dentry和inode缓存,与缓冲区缓存无关。
kawing-chiu

如果您没有足够的RAM来处理工作负载vfs_cache_pressure100则增加上述值可能会有所帮助。这将减少RAM使用量,但总体上将导致I / O性能下降。
Mikko Rantalainen

3

我不知道A%,但是,您可以设置时间限制,以便在x分钟后将其降低。

首先在终端

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

清除当前缓存。

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

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches

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

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

free -m | sed -n -e '3p' | grep -Po "\d+$

我觉得这里有点多余。据我所知,3 > drop_caches包括sync
–andras.tim

1
@ andras.tim否-同步将脏页写入磁盘,将3写入drop_caches仅回收/释放干净页和其他缓存使用的内存。您不必运行同步,但如果这样做,则在删除缓存时,更多的内存将被清除而不是变脏,并且将释放更多的内存
Daniel S. Sterling

2

我认为您在问题末尾的直觉是正确的。我怀疑是A,NUMA感知的内存分配在CPU之间迁移页面,还是B,更可能是透明大页面的碎片整理代码,试图找到连续的对齐区域。

已识别出大页面和透明大页面,这不仅可以在某些工作负载上显着提高性能,还可以在不带来太多好处的情况下消耗大量CPU时间。

了解您正在运行的内核,/ proc / meminfo的内容(或至少是HugePages_ *值),以及(如果可能)更多参考pageblock_pfn_to_page()的vtune事件探查器调用图,将很有帮助。

另外,如果您沉迷于我的猜测,请尝试使用以下命令禁用大页面碎片整理:

回声'从不'> / sys / kernel / mm / transparent_hugepage / defrag

(这可能取决于您的内核:)

回声'从不'> / sys / kernel / mm / redhat_transparent_hugepage / defrag

最后,这个应用程序是否使用了您写的数十演出的ram?什么语言?

由于您使用了“内存页面故障”一词,所以我想您对操作设计和虚拟内存已经很熟悉了。我很难想象一个情况/应用程序会如此严重地发生故障,以致无法读取大量的I / O-几乎总是从您要限制的缓冲区高速缓存中读取。

(如果您感到好奇,请查看mmap(2)标志,例如MAP_ANONYMOUS和MAP_POPULATE以及mincore(2),这些标志可用于查看哪些虚拟页面实际上具有映射的物理页面。)

祝好运!


2

如果Ceph OSD是一个单独的进程,则可以使用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

0

tuned是一个动态自适应系统调整守护程序,可根据用途动态调整系统设置。

 $ man tuned

请参阅相关文档和配置文件。

 /etc/tuned
 /etc/tuned/*.conf
 /usr/share/doc/tuned-2.4.1
 /usr/share/doc/tuned-2.4.1/TIPS.txt

This parameter may be useful for you.

** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs

附加信息

同步命令刷新缓冲区,即强制所有未写入的数据被写入到磁盘上,而当一个人想确保一切都安全地写入可以使用。在传统的UNIX系统中,有一个称为update的程序在后台运行,该程序每30秒执行一次同步,因此通常不必使用sync。Linux还有一个附加的守护进程bdflush,它更频繁地执行更不完美的同步,以避免由于有时导致同步的磁盘I / O过多而突然冻结。

在Linux下,bdflush由更新启动。通常没有理由担心它,但是如果bdflush由于某种原因而死了,内核会发出警告,您应该手动启动它(/ sbin / update)。


1
这不是仅用于肮脏的条目吗?我认为这不是我系统上的问题,因为它们都是干净的—延迟不是写回脏页,而是通过删除干净的页对空间进行碎片整理。
2016年

是的,这是针对脏页的,我认为您还可以通过将调整为动态模式设置来解决其他性能问题。
Ijaz Ahmad Khan

“自Linux 2.6起,[bdflush]系统调用已被弃用,不执行任何操作。在将来的内核版本中,它可能会完全消失。如今,由bdflush()执行的任务已由内核pdflush线程处理。” man7.org/linux/man-pages/man2/bdflush.2.html
sourcejedi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.