在Linux上将文件缓存/预加载到RAM


73

我有一台比较旧的服务器,它具有4GB的RAM,并且几乎全天都在提供相同的文件,但是它是从硬盘驱动器来完成的,而3GB的RAM是“免费的”。

曾经尝试运行ram驱动器的任何人都可以见证它在速度方面很棒。该系统的内存使用率通常不会高于1GB / 4GB,因此我想知道是否有一种方法可以使用额外的内存来获得良好的性能。

  • 是否可以告诉文件系统始终在RAM之外提供某些文件?
  • 是否可以使用RAM来提高文件读取能力的其他方法?

更具体地说,我不是在这里寻找“黑客”。我希望文件系统调用可以从RAM提供文件,而无需创建ram驱动器并手动将文件复制到那里。或至少有一个脚本可以帮我做到这一点。

这里可能的应用是:

  • 具有大量静态文件的Web服务器
  • 具有大型库的应用程序服务器
  • 具有过多RAM的台式计算机

有任何想法吗?

编辑:

  • 发现此信息非常有用:Linux Page Cache和pdflush
  • 正如Zan所指出的,内存实际上并不是空闲的。我的意思是应用程序没有使用它,我想控制应该在内存中缓存的内容。

1
我也正在按照这些思路寻求帮助。我不认为一般文件系统磁盘块缓存是答案。假设我希望磁盘块X始终被缓存。有东西访问它,内核对其进行缓存。到目前为止一切顺利,但是下一个进程需要块Y,因此内核将丢弃我的块X并缓存Y。想要X的下一个进程将不得不等待它离开磁盘;那就是我要避免的。我想要的(以及我认为原始发布者也想这样做的)是将直写式缓存覆盖到文件系统上,以确保文件始终

1
鉴于似乎已经达成共识,即Linux应该已经为您缓存了常用文件,我想知道您是否真的可以使用此处的建议进行任何改进。在我看来,尝试手动控制缓存可能对预热缓存很有用,但是使用您描述的使用模式(“整天提供相同的文件”),对已经热身的服务器没有帮助很多,如果有的话。
Nate CK

您说您不是在寻找黑客,但是Linux默认已经完成了您想做的事情。下面的等式:“整天提供相同的文件” +“告诉文件系统始终将某些文件提供RAM之外的文件”从定义上等于“ Hack”。您实际上注意到任何性能改进吗?根据我的经验,Linux缓存是文件系统读取的对象。
迈克S

2
为了澄清起见,Linux会缓存文件,但是会针对每个请求针对每个文件验证元数据。在生锈的情况下,在繁忙的Web服务器上有很多小文件,这仍可能导致IO争用并过早损坏驱动器。静态内容和脚本可以rsync到/ dev / shm或在应用程序启动时自定义tmpfs挂载。我已经这样做了几十年,而且我的驱动器不会过早磨损。同样,我的站点可以更好地承受突发负载。从最昂贵的企业硬件到商品硬件,这都有帮助。
亚伦

Answers:


56

vmtouch似乎是完成这项工作的好工具。

强调:

  • 查询缓存了多少目录
  • 查询缓存了多少文件(还有哪些页面,图形表示)
  • 将文件加载到缓存
  • 从缓存中删除文件
  • 锁定缓存中的文件
  • 作为守护程序运行

vmtouch手册

编辑:vmtouch Hompage的 示例5中列出了问题中的用法用法

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: 正如指出的意见,现在有一个git仓库使用。


5
对于将来的查看者,请尝试使用vmtouch git存储库,而不要遵循链接页面上的说明。这样,您将获得一个makefile并可以提取更新。
2015年

似乎文件大小(4GB)有限制。还有其他选择吗?
Alix Axel

好的,这是我的实际用例:带有旧SD卡的RPi1,在那里做Stuff的地方。在我去那里旅行并更换卡(可能还有电源)之前,我希望OS谨慎接触卡,最好不要接触。FS缓存不错,但超出了我的控制范围;/ bin和/ sbin已经在tmpfs上,获取/ home / user同样具有其他缺点。vmtouch非常适合这个利基市场。
Piskvor

vmtouch与tmpfs有何不同?
爱德华·托瓦尔兹

26

也可以使用vmtouch 虚拟内存触摸程序实用程序

该工具使您可以控制Linux系统上的文件系统缓存。您可以强制或锁定VM缓存子系统中的特定文件或目录,或使用它来检查VM中包含文件/目录的哪些部分。

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

要么...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

3
这是一个很棒的实用程序,并且完全可以执行OP的要求。如果他愿意,他会接受这个答案。
laebshade

您知道这是否适用于ZFS吗?
CMCDragonkai 2015年

1
@CMCDragonkai我认为ZFS不需要这样做...想一想:ARC和L2ARC
ewwhite

21

一个可怜的人将东西放入文件系统缓存的窍门是简单地将其分类并将其重定向到/ dev / null。


1
同意。并且,如果您要确保缓存了某些文件,请执行cron作业,cat以定期将文件保存到/ dev / null
乔什(Josh)

18

在对2.6内核交换和页面缓存功能进行了广泛的阅读之后,我发现了'fcoretools'。其中包含两个工具;

  • fincore:将显示应用程序已在核心内存中存储了多少页
  • fadvise:允许您操作核心内存(页面缓存)。

(以防其他人觉得这个有趣,我在这里发布)


1
我认为有一个程序可以在某个地方做到这一点。+1
布拉德·吉尔伯特

17

Linux将在内存中尽可能多地缓存磁盘IO。这就是缓存和缓冲存储器的统计信息。与存储正确的东西相比,它可能会做得更好。

但是,如果您坚持将数据存储在内存中,则可以使用tmpfs或ramfs创建一个ram驱动器。区别在于ramfs将分配您要求的所有内存,就像tmpfs仅使用您的块设备正在使用的内存一样。我的记忆有点生锈,但是您应该可以做到:

 # mount -t ramfs ram /mnt/ram 

要么

 # mount -t tmpfs tmp /mnt/tmp

然后将您的数据复制到目录中。显然,当您关闭计算机或卸载该分区时,您的数据将丢失。


1
感谢您的回答,但这显然是我要避免的事情。否则,我只是编写脚本,以便计算机创建ramdrive,复制文件并象征性地链接到ramdrive。但是那时我的数据不一致。我希望有一个可以标记某些文件以缓存在内存中的文件系统。但是也许我有点太乐观了。
Andrioid

3
您通过访问来“标记”要缓存的文件。
womble

9
如果只有某种方法可以自动标记最常用的文件。
大卫·帕什利

4
Blimey,讽刺做得不好:)
David Pashley 09年

2
是的,谢谢。我了解IO缓存的概念。我什至在回答中对此做了解释。似乎您没有读到那是讽刺的微妙评论。
David Pashley,2009年

7

即使不使用其他工具,有两种内核设置也可以极大地帮助您:

交换性

告诉linux内核它应该如何积极地使用swap。引用维基百科文章:

Swappiness是Linux内核的属性,它改变了换出运行时内存之间的平衡,与从系统页面缓存中删除页面相反。透明度可以设置为介于0和100之间的值。较低的值表示内核将尽量避免交换,而较高的值将使内核积极尝试使用交换空间。默认值为60,对于大多数台式机系统,将其设置为100可能会影响整体性能,而将其设置为较低(甚至为0)可能会改善交互性(减少响应延迟)。

vfs_cache_pressure

引用vm.txt

控制内核回收用于缓存目录和inode对象的内存的趋势。

在默认值vfs_cache_pressure = 100时,内核将尝试以相对于页面缓存和swapcache回收的“合理”速率回收牙科和索引节点。减小vfs_cache_pressure会导致内核倾向于保留dentry和inode缓存。...


通过设置为swappiness高(例如100),内核将移动不需要交换的所有内容,从而释放RAM来缓存文件。并通过将其设置得vfs_cache_pressure较低(比如说50,而不是0!),将有利于缓存文件,而不是将应用程序数据保留在RAM中。

(我在一个大型的Java项目上工作,每次运行它都会占用大量RAM并刷新磁盘缓存,因此,下次我编译该项目时,所有内容都再次从磁盘读取。通过调整这两个设置,我可以管理将源代码和编译后的输出缓存在RAM中,从而大大加快了处理速度。)


3

我非常怀疑它实际上是从具有3 GB RAM的磁盘中提供文件。Linux文件缓存非常好。

如果您看到磁盘IO,我将调查您的日志记录配置。许多日志设置为无缓冲,以确保发生崩溃时可以获取最新的日志信息。在无论如何都必须快速的系统中,请使用缓冲日志IO或远程日志服务器。


是的,我只是想控制要缓存的内容。
Andrioid

3

如果您有足够的内存,则可以简单地读取要用cat或类似文件缓存的文件。Linux将会很好地保持它。


3

您也许可以拥有一个程序,该程序只需mmap将您的文件保存下来,然后继续运行。


3
据我所知,这几乎就是“ fadvise”(fcoretools)的作用。
Andrioid

0

您可以使用多种ramfs系统(例如ramfs,tmpfs),但通常,如果实际上经常读取文件,它们就位于文件系统缓存中。如果您的工作文件集大于可用内存,则文件将被清除-但是如果您的工作集大于可用内存,则也无法将所有文件都放入ramdisk。

检查外壳程序中“ free”命令的输出-最后一列中“ Cached”下的值是您的可用内存中有多少被用于文件系统缓存。


0

至于后一个问题,请确保您的RAM位于不同的内存通道上,以便处理器可以并行获取数据。


0

我认为这可能在应用程序级别上可以更好地解决。例如,可能有专门的Web服务器,或者您可以考虑使用Apache的mod_cache。如果您有一个特定的目标,例如更快地提供Web内容,则可以从我认为的这种情况中得到改进。

但是您的问题本质上是通用的,Linux内存子系统旨在提供最佳的RAM通用使用。如果要针对某些类型的性能,请考虑在/ proc / sys / vm中查找所有内容。

fcoretools软件包很有趣,我会对任何有关其应用程序的文章感兴趣... 此链接讨论了在应用程序中使用的实际系统调用。


1
查找/ var / lib / mysql | xargs fadvise -willneed(肮脏,但是它应该提供对数据库文件的更快访问;例如)
Andrioid

很不错的黑客,但这种黑客不会禁用的从MySQL等待fsync作业数量很多:(需要fsync作业,以确保ACID(原子性,一致性,隔离性,持久性)。
osgx



0

我刚刚尝试了dd if = / dev / yourrootpartition = / dev / null \ bs = 1Mcount =要存储多少内存

它没有给我您想要的控制权,但至少尝试使用浪费的内存


0

我使用find / -name stringofrandomcharacter它可以帮助很多


0

不完全是问什么,但我用

找到BASE_DIRECTORY -type f -exec cat {}> / dev / null \;

触发从快照创建的AWS卷中文件的初始化。如果您只想读取某些文件,它比使用dd的官方建议更加集中。


-1

有时我可能想将文件缓存在某个文件夹及其子文件夹中。我只是转到该文件夹​​并执行以下命令:

找 。-exec cp {} / dev / null \;

这些文件被缓存

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.