如何配置Linux优先于内容缓存文件元数据?


14

我想将系统设置为使用大多数RAM进行文件系统元数据缓存,但仅使用相当少量的空间进行读/写缓存和预取文件。理想情况下,我希望能够浏览文件系统(尽可能多地容纳在RAM中),而无需旋转磁盘,直到我真正打开文件为止。

详细信息如下:

我有一个自制的文件服务器。LVM卷中约有9TB的空间有五个磁盘,但只有4GB的RAM。由于服务器除了处理文件外没有做其他事情,因此大多数RAM用于缓存。(“免费”报告用于缓​​存的3.9G中有3.4G。)

该服务器位于我的卧室里,如果所有磁盘都在旋转,它发出的噪音足以使它安静时变得烦人。(我并不是说寻求噪声,只是旋转噪声。磁盘的制造商和型号各不相同,我认为转速的微小差异会产生干扰。磁盘本身并不嘈杂,但是如果其中一些磁盘一起旋转,则有因此,我将服务器配置为在大多数情况下将磁盘降速旋转。

当然,如果当我在文件管理器中打开文件夹时磁盘旋转下来,则延迟会延迟哪个磁盘旋转该文件夹。只是那没什么大不了的。但是根据我的位置,如果LVM恰好在不同的磁盘上散布每个子文件夹的元数据,它可能会连续发生几次。

我怀疑Linux主要将文件内容以及可能的预取数据填充到其缓存中。缓存不足以确保顺利播放,只有几个MB。如果我刚看过电影,可能很快就不会再看了。如果发生预取,则在超过几MB后,对我而言也是完全没有用的。

但是人们会认为4GB应该足以缓存大多数文件系统元数据,至少是那些已经被访问过的部分,这样我就可以浏览文件而无需旋转磁盘,如果事实证明它们是睡眠。

打开文件时仍然会有延迟,但是没关系。比较“点击;等待 ; 点击 等待 ; 点击 等待 ; 玩; 观看”和“点击”;点击 点击 玩; 等待 ; 看”。前者令人沮丧。后者几乎是可以预期的。

笔记:

  1. 重要的是,内核是3.2,操作系统是Debian,卷是lvm2,而FS是ext4。

  2. 旋转的唯一原因是晚上的噪音。否则服务器将连续运行。(我尽可能将其设置为低功耗。)降速延迟根据一天中的时间而有所不同。

  3. 硬盘仅用于介质。操作系统位于单独的(小型)闪存驱动器上。(这意味着任何加速延迟都来自数据,而不仅仅是因为它需要一些/usr东西。如果可以以某种方式帮助解决我的问题,我可以在其中节省一些GB。

  4. 对性能的合理影响并不大。无论如何,这些磁盘都比我的网络快。

Answers:


10

要控制Linux缓存内容的方式,请参阅此 https://www.kernel.org/doc/Documentation/sysctl/vm.txt

特别要看一下vfs_cache_pressure,您可能想要一个非常低的值,甚至可能是零(不过,对我来说1听起来更安全一些):

vfs_cache_pressure
------------------

Controls the tendency of the kernel to reclaim the memory which is used for
caching of directory and inode objects.

At the default value of vfs_cache_pressure=100 the kernel will attempt to
reclaim dentries and inodes at a "fair" rate with respect to pagecache and
swapcache reclaim.  Decreasing vfs_cache_pressure causes the kernel to prefer
to retain dentry and inode caches. When vfs_cache_pressure=0, the kernel will
never reclaim dentries and inodes due to memory pressure and this can easily
lead to out-of-memory conditions. Increasing vfs_cache_pressure beyond 100
causes the kernel to prefer to reclaim dentries and inodes.

另外,您可能需要进行修改,swappiness以使您从不交换数据或进行数据交换,以使其仅在极端情况下发生。

drop_caches对于显式删除不再想要缓存的数据,该选项可能很方便。

我确定可能还有其他选项可能会有所帮助,因此请查看内核文档。

要应用它们,我将输入要更改的设置,/etc/sysctl.conf或者您的操作系统必须在启动时恢复它们的任何设置。


3
祝您工作顺利,但鉴于OP的目标,您可能希望进行尽可能多的交换。交换只会影响用户内存,因此增加了交换到磁盘的趋势,然后为缓存留出了更多的物理内存。交换增加会释放内存,但是如果增加过多,则会降低应用程序的速度(确定最有效的位置基本上是迭代的客户期望)
Bratchley

嗨,凯尔,谢谢你的主意。vfs_cache_pressure可以正常工作,但是还不够。这是我所做的:
bogdanb

当我将vcp设置为0时,如果执行a find / -ls > /dev/null,则旋转磁盘,然后find再次旋转所有文件,磁盘则不会旋转。free显示执行此操作时缓冲区增加到约202MB。但是,如果我执行find,则cat /file/bigger/than/ram > /dev/null,然后会free显示cached上升以填充空白空间,并且由于某种原因buffers会下降到大约195MB。然后,如果我旋转光盘并find再次旋转,则磁盘仍然旋转:-(
bogdanb

关于swappiness:设置为默认值60,但是机器没有任何交换分区,因此我不确定它是否有很多作用。我想我可以将交换文件放在闪存驱动器上,但是我不知道它会如何帮助或如何调整大小。
bogdanb

1
Linux试图在缓存方面变得更聪明。我不确定设置vfs = 0是否会按您期望的方式工作。我认为当来自应用程序(例如malloc())的压力要求更多内存时,它将尝试收回这些其他条目。至于一种告诉linux不要使用超过2GB的缓存的方法,我没有意识到。在大多数情况下,这将浪费RAM。您可能要看的另一件事是“笔记本电脑模式”,它试图以不同的方式做事,以保持笔记本电脑的磁盘旋转速度。我还没有用过,所以我对此不太了解。
凯尔
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.