Linux 上超快 Web 服务器的内存映射文件

Linux 上超快 Web 服务器的内存映射文件

有没有什么简单的方法可以告诉 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 通过读取此虚拟内存空间的区域来访问文件。如果文件尚未加载到内存中,内核将从磁盘中检索它们并将文件存储在内存中,直到内存压力导致内核清空文件缓存。

相关内容