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

And*_*oid 84 linux cache virtual-memory

我有一个相当旧的服务器,它有 4GB 的 RAM,它几乎整天都在提供相同的文件,但它是从硬盘驱动器这样做的,而 3GB 的 RAM 是“免费的”。

任何曾经尝试过运行 ram 驱动器的人都可以见证它在速度方面非常棒。这个系统的内存使用量通常不会超过 1GB/4GB,所以我想知道是否有办法使用额外的内存来做一些好的事情。

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

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

这里可能的应用是:

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

有任何想法吗?

编辑:

  • 发现这个信息量很大:Linux Page Cache and pdflush
  • 正如 Zan 指出的那样,内存实际上并不是空闲的。我的意思是它没有被应用程序使用,我想控制应该在内存中缓存的内容。

小智 70

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

强调:

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

vmtouch 手册

编辑: 问题中所问的用法列在vmtouch Hompage上的示例 5 中

Example 5

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

vmtouch -dl /var/www/htdocs/critical/
Run Code Online (Sandbox Code Playgroud)

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

  • 对于未来的观众,请尝试使用 vmtouch [git 存储库](https://github.com/hoytech/vmtouch) 而不是按照链接页面上的说明进行操作。这样你就可以得到一个 makefile 并可以拉取更新。 (6认同)

eww*_*ite 31

这也可以使用vmtouch Virtual 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
Run Code Online (Sandbox Code Playgroud)

或者...

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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很棒的实用程序,并且完全符合 OP 的要求。如果他能接受这个作为答案就好了。 (4认同)

cag*_*nut 26

将内容放入文件系统缓存的一个穷人的技巧是简单地将其捕获并将其重定向到 /dev/null。


Dav*_*ley 20

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

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

 # mount -t ramfs ram /mnt/ram 
Run Code Online (Sandbox Code Playgroud)

或者

 # mount -t tmpfs tmp /mnt/tmp
Run Code Online (Sandbox Code Playgroud)

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

  • 如果只有某种方法可以自动标记最常用的文件。 (11认同)
  • 天哪,讽刺并不好传播,是吗:) (4认同)
  • 您可以通过访问来“标记”要缓存的文件。 (3认同)
  • 是的,谢谢。我理解IO缓存的概念。我什至在我的回答中解释了它。似乎您没有阅读有关讽刺的微妙评论。 (3认同)

And*_*oid 18

在对 2.6 内核交换和页面缓存功能进行了大量阅读之后,我找到了“fcoretools”。其中包含两个工具;

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

(如果其他人觉得这很有趣,我会在这里发布)


Pet*_*etr 9

即使不使用其他工具,也有两个内核设置可以提供很大帮助:

互换性

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

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

vfs_cache_pressure

vm.txt引用:

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

在 vfs_cache_pressure=100 的默认值下,内核将尝试以相对于页面缓存和交换缓存回收的“公平”速率回收 dentry 和 inode。降低 vfs_cache_pressure 会导致内核更喜欢保留 dentry 和 inode 缓存。...


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

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