it-swarm.cn

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

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

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

  • 是否可以告诉文件系统始终将某些文件从RAM中提供?
  • 我还有其他方法可以通过使用RAM来提高文件读取功能吗?

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

这里可能的应用是:

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

有任何想法吗?

编辑:

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

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:就像注释中的 noted 一样,现在有 git仓库 可用。

60
seeker

也可以使用 vmtouchVirtual Memory Toucher实用程序

该工具使您可以控制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
26
ewwhite

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

23
cagenut

Linux将在内存中缓存尽可能多的磁盘IO。这就是缓存和缓冲内存的统计信息。在存储正确的内容方面,它可能会做得比您更好。

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

 # mount -t ramfs ram /mnt/ram 

要么

 # mount -t tmpfs tmp /mnt/tmp

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

18
David Pashley

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

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

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

18
Andrioid

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

波动

告诉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中,从而大大加快了处理速度。)

7
Petr Pudlák

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

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

3
Zan Lynx

您也许可以拥有一个仅mmaps个文件然后保持运行的程序。

3
Brad Gilbert

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

3
Thorbjørn Ravn Andersen

http://www.coker.com.au/memlockd/ 这样做

尽管您确实不需要它,但linux会很好地自行缓存正在使用的文件。

0
Justin

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

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

0
Daniel Lawson

不完全是问什么,但我用

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

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

0
Federico

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

0
sybreon

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

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

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

0
Kyle Brandt

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

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

0
Bogus Name

台式计算机(例如ubuntu)在启动时已使用预加载文件(至少是流行的共享库)到内存中。它用于加快FF,OO,KDE和GNOME(带有Evolution bloat-mailer)等各种bloware的启动和启动时间。

该工具名为readaheadhttp://packages.ubuntu.com/dapper/admin/readahead

还有一个相应的系统调用:readahead(2)http://linux.die.net/man/2/readahead

还有一个预加载守护程序的项目: http://linux.die.net/man/8/preload

0
osgx

我使用find/-name随机字符字符串会很有帮助

0
user50472