我有一个相当旧的服务器,它有 4GB 的 RAM,它几乎整天都在提供相同的文件,但是它是从硬盘驱动器上这样做的,而 3GB 的 RAM 是“免费的”。
任何尝试过运行 ram-drive 的人都可以见证它在速度方面的出色表现。这个系统的内存使用量通常不会超过 1GB/4GB,所以我想知道是否有办法将额外的内存用于一些好的事情。
- 是否可以告诉文件系统始终从 RAM 中提供某些文件?
- 有没有其他方法可以通过使用 RAM 来提高文件读取能力?
更具体地说,我不是在这里寻找“黑客”。我希望文件系统调用从 RAM 中提供文件,而无需创建 ram 驱动器并手动复制文件。或者至少是一个为我执行此操作的脚本。
这里可能的应用是:
- 带有大量读取的静态文件的 Web 服务器
- 具有大型库的应用程序服务器
- 具有过多 RAM 的台式计算机
有任何想法吗?
编辑:
- 发现这个非常有用:Linux Page Cache and pdflush
- 正如 Zan 指出的那样,内存实际上并不是免费的。我的意思是它没有被应用程序使用,我想控制应该缓存在内存中的内容。
vmtouch似乎是完成这项工作的好工具。
强调:
vmtouch手册
编辑: 问题中所问的用法列在vmtouch Hompage上的示例 5 中
EDIT2: 如评论中所述,现在有一个可用的git 存储库。
这也可以使用vmtouch Virtual Memory Toucher实用程序来实现。
该工具允许您控制 Linux 系统上的文件系统缓存。您可以强制或锁定 VM 缓存子系统中的特定文件或目录,或使用它来检查文件/目录的哪些部分包含在 VM 中。
或者...
一个穷人将东西放入文件系统缓存的技巧是简单地对它进行分类并将其重定向到/dev/null。
Linux 会在内存中缓存尽可能多的磁盘 IO。这就是缓存和缓冲内存统计信息。在存储正确的东西方面,它可能会比你做得更好。
但是,如果您坚持将数据存储在内存中,则可以使用 tmpfs 或 ramfs 创建一个 ram 驱动器。不同之处在于 ramfs 将分配您要求的所有内存,因为 tmpfs 只会使用您的块设备正在使用的内存。我的记忆有点生疏,但你应该能够做到:
或者
然后将您的数据复制到目录中。显然,当您关闭机器或卸载该分区时,您的数据将会丢失。
在大量阅读 2.6 内核交换和页面缓存功能后,我发现了“fcoretools”。其中包括两个工具;
(如果其他人觉得这很有趣,我会在这里发布)
即使不使用其他工具,也有两个内核设置可以提供很大帮助:
交换性
告诉 linux 内核它应该多积极地使用交换。引用维基百科的文章:
vfs_cache_pressure
引用vm.txt:
通过设置
swappiness
高(如 100),内核移动它不需要交换的所有内容,释放 RAM 用于缓存文件。通过设置vfs_cache_pressure
较低(假设为 50,而不是 0!),它将有利于缓存文件而不是将应用程序数据保存在 RAM 中。(我在一个大型 Java 项目上工作,每次运行它都会占用大量 RAM 并刷新磁盘缓存,所以下次我编译项目时,一切都从磁盘读取。通过调整这两个设置,我管理将源代码和编译后的输出缓存在 RAM 中,从而大大加快了进程。)
您也许可以拥有一个程序,该程序只
mmap
存储您的文件,然后保持运行。如果你有足够的内存,你可以简单地用 cat 或类似的方法读入你想要缓存的文件。然后,Linux 会很好地保留它。
我非常怀疑它实际上是从具有 3 GB RAM 空闲的磁盘中提供文件。Linux 文件缓存非常好。
如果您看到磁盘 IO,我会查看您的日志记录配置。许多日志被设置为无缓冲,以保证在发生崩溃时可以获得最新的日志信息。在无论如何都必须快速的系统中,使用缓冲日志 IO 或使用远程日志服务器。
台式计算机(例如 ubuntu)已经在启动时使用预加载文件(至少是流行的共享库)到内存中。它用于加快不同bloarware的引导和启动时间,如 FF、OO、KDE 和 GNOME(带有进化 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