在Linux上将文件caching/预加载到RAM中

我有一个相当老的服务器,有4GB的内存,它几乎是整天服务于相同的文件,但它是从硬盘驱动器,而3GB的RAM是“免费的”。

任何曾经尝试过运行ram-drive的人都可以见证它的速度真棒 。 这个系统的内存使用率通常不会高于1GB / 4GB,所以我想知道是否有一种方法可以使用额外的内存。

  • 是否有可能告诉文件系统总是从RAM中提供某些文件?
  • 有没有其他方法可以用来改善使用RAM的文件读取function?

更具体地说,我不是在这里寻找“黑客”。 我想要文件系统调用来从RAM提供的文件,而不需要创build一个ram驱动器,并手动复制那里的文件。 或者至less有一个脚本,为我做这个。

这里可能的应用是:

  • 具有可读取的静态文件的Web服务器
  • 应用程序服务器与大型库
  • 台式电脑内存太多

有任何想法吗?

编辑:

  • 发现这非常丰富的: Linux页面caching和pdflush
  • 正如Zan指出的那样,记忆并不是真正的自由。 我的意思是它没有被应用程序使用,我想控制什么应该被caching在内存中。

    vmtouch似乎是一个很好的工具。

    强调:

    • 查询多less目录被caching
    • 查询多less文件被caching(也是哪些页面,graphics表示)
    • 将文件加载到caching中
    • 从caching中删除文件
    • lockingcaching中的文件
    • 作为守护进程运行

    vmtouch手册

    编辑:问题中问的使用情况在vmtouch主页上的示例5中列出

    Example 5 Daemonise and lock all files in a directory into physical memory: vmtouch -dl /var/www/htdocs/critical/ 

    编辑2:正如在评论中指出的那样 ,现在有一个可用的git仓库 。

    这也可以使用vmtouch 虚拟内存 Toucher工具 。

    该工具允许您控制Linux系统上的文件系统caching。 您可以强制或locking虚拟机caching子系统中的特定文件或目录,或者使用它来检查虚拟机中包含的文件/目录的哪些部分。

     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 

    经过对2.6内核交换和页面cachingfunction的大量阅读,我发现了“fcoretools”。 它由两个工具组成;

    • fincore:将显示应用程序在核心内存中存储了多less页
    • fadvise:允许你操纵核心内存(page-cache)。

    (如果有人发现这个有趣的我在这里发布这个)

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

    但是,如果您坚持将数据存储在内存中,则可以使用tmpfs或ramfs创buildram驱动器。 不同之处在于ramfs会分配你所要求的所有内存,因为tmpfs只会使用你的块设备正在使用的内存。 我的记忆有点生疏,但你应该能够做到:

      # mount -t ramfs ram /mnt/ram 

    要么

      # mount -t tmpfs tmp /mnt/tmp 

    然后将您的数据复制到目录。 显然,当您closures机器或卸载该分区时,您的数据将会丢失。

    一个穷人把文件放到文件系统caching中的技巧就是简单地把它放到/ dev / null中。

    有两个内核设置可以在不使用其他工具的情况下提供相当大的帮助:

    swappiness

    告诉Linux内核它应该使用交换的积极性。 引用维基百科的文章:

    Swappiness是Linux内核的一个属性,它改变了运行时内存之间的平衡,而不是从系统页面caching中删除页面。 Swappiness可以设置为0到100之间的值。 一个较低的值意味着内核将尝试尽可能地避免交换,而更高的值会使内核积极尝试使用交换空间。 默认值为60,对于大多数桌面系统,将其设置为100可能会影响整体性能,而将其设置为较低(即使为0)可能会提高交互性(降低响应延迟)。

    vfs_cache_pressure

    从vm.txt引用:

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

    在vfs_cache_pressure = 100的默认值下,内核将尝试以相对于pagecache和swapcache回收的“公平”的速率回收dentries和inode。 减lessvfs_cache_pressure会导致内核倾向于保留dentry和inodecaching。 …


    通过将swappiness设置swappiness高(如100),内核将移动不需要交换的所有内容,释放RAM以caching文件。 通过设置vfs_cache_pressure (比方说50,而不是0!),它将有利于caching文件,而不是将应用程序数据保存在RAM中。

    (我在一个大型的Java项目上工作,每次运行它时,都花费了大量的RAM和刷新磁盘caching,所以下次我编译项目时,所有的东西都是从磁盘上读取的。通过调整这两个设置,我pipe理保持源和编译输出caching在RAM中,这大大加快了处理速度。)

    我非常怀疑它实际上是提供3 GB的RAM免费的磁盘文件。 Linux文件caching非常好。

    如果你看到磁盘IO,我会查看你的日志configuration。 许多日志被设置为无缓冲,以保证最新的日志信息在发生崩溃时可用。 在必须快速运行的系统中,使用缓冲的日志IO或使用远程日志服务器。

    如果你有足够的内存,你可以简单地读取你想要caching与猫或类似的文件。 然后,Linux会做好保持的工作。

    你可能有一个程序,只是mmap你的文件,然后保持运行。

    有各种各样的ramfs系统可以使用(例如,ramfs,tmpfs),但是一般来说,如果文件经常被读取,它们就坐落在文件系统caching中。 如果你的工作集文件比你的免费内存大,那么文件将被清除 – 但是如果你的工作集大于你的免费内存,那么你也不可能把它全部装入虚拟内存中。

    在shell中检查“free”命令的输出 – “Cached”下的最后一列中的值是多less免费ram用于文件系统caching。

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

    我认为这可能会在应用程序层面更好地解决。 例如,可能有专门的Web服务器,或者你可能会考虑Apache的mod_cache 。 如果你有一个特定的目标,比如更快地提供networking内容,那么你可以从我认为的这种事情上得到改进。

    但是你的问题本质上是一般的,Linux内存子系统被devise为提供RAM的最佳通用。 如果要针对某些types的性能,请考虑查找/ proc / sys / vm中的所有内容。

    fcoretools包很有趣,我会对任何有关它的应用的文章感兴趣… 这个链接讲述了在应用程序中使用的实际系统调用。

    台式电脑(例如ubuntu)已经在启动时使用预加载文件(至less是stream行的共享库)到内存。 它用来加速FF,OO,KDE和GNOME等不同恶意软件的启动和启动时间(使用evolution bloat-mailer)。

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

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

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

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

    虽然你真的不需要它,但linux会自动caching你正在使用的文件。

    我只是试图dd if = / dev / yourrootpartition = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

    它并没有给我你想要的控制权,但它至less试图使用浪费的内存

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

    不是确切的问题,但我使用

    findBASE_DIRECTORY -type f -exec cat {}> / dev / null \;

    触发从快照创build的AWS卷中的文件的初始化。 如果你只是想读一些文件,它比官方build议使用dd更为重要。

    有时候我可能想caching某个文件夹及其子文件夹中的文件。 我只是去这个文件夹,并执行以下内容:

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

    这些文件被caching