有没有什么简单的方法可以告诉 Linux 将文件目录保留在内存中缓存?
我意识到 Node.Js 和 Apache 大部分时间都花在文件 I/O 上,如果文件很多(尤其是脚本和模板文件;如果表不是太大,数据库可以很好地根据需要缓存内容),用户就会等待。当然,你应该使用 Squid 或其他方式来加快速度,但这需要大量配置,而且不能轻易自动完成,而我的重点是“可部署性”(即使是交互式安装也会对普通用户要求过高。当然,必须考虑所有安全问题(包括自动修补所包含的 httpd 配置)。)。
另一方面,内存映射文件应该是一件轻而易举的事,因为你实际上只是想告诉系统:“嘿,将该文件保留在内存中,直到我告诉你删除它或直到重新启动”;或者甚至是一些侵入式 API,将其挂钩直接放入相关的 POSIX 或系统调用中,并在用户空间中执行此操作。就这么简单吗?我似乎找不到一些简单的代码片段或一组指令来完成此操作(不适用于 Linux 或 Windows)。
非常感谢您的帮助!
答案1
您可以使用vmtouch 实用程序将文件甚至文件目录锁定到内存中。
vmtouch -dl /var/www/html/important_files
用法:
vmtouch v0.8.0 - the Virtual Memory Toucher by Doug Hoyte
Portable file system cache diagnostics and control
Usage: vmtouch [OPTIONS] ... FILES OR DIRECTORIES ...
Options:
-t touch pages into memory
-e evict pages from memory
-l lock pages in physical memory with mlock(2)
-L lock pages in physical memory with mlockall(2)
-d daemon mode
-m <size> max file size to touch
-f follow symbolic links
-v verbose
-q quiet
因此我可以获取这样的目录并查看内存中有多少空间:
[root@xt /var/www/html/xt/centos]# vmtouch .
Files: 146
Directories: 14
Resident Pages: 0/5996 0/23M 0%
Elapsed: 0.059768 seconds
所以我可以“触摸”目录并将它们放入缓存中:
[root@xt /var/www/html/xt/centos]# vmtouch -t .
Files: 146
Directories: 14
Touched Pages: 5996 (23M)
Elapsed: 0.64321 seconds
后续检查显示:
[root@xt /var/www/html/xt/centos]# vmtouch .
Files: 146
Directories: 14
Resident Pages: 5996/5996 23M/23M 100%
Elapsed: 0.001846 seconds
答案2
从磁盘读取的文件始终存储在文件缓存中。CPU 无法直接访问硬盘。所有磁盘 I/O 都映射到虚拟内存空间,CPU 通过读取此虚拟内存空间的区域来访问文件。如果文件尚未加载到内存中,内核将从磁盘中检索它们并将文件存储在内存中,直到内存压力导致内核清空文件缓存。