2011-08-19 103 views
18

我正在创建在Linux服务器上运行的Web应用程序。应用程序不断地访问250K文件 - 它将它加载到内存中,读取它并向用户发送一些信息。由于这个文件一直被读取,所以我的客户建议使用类似memcache的内容将其缓存到内存中,这可能是因为它会使读取操作更快。Linux文件系统缓存文件是否有效?

但是,我认为Linux文件系统可能已经将文件缓存在内存中,因为它经常被访问。是对的吗?在你看来,memcache会提供一个真正的改进吗?还是它会做同样的事情,Linux已经在做什么?

我并不十分熟悉Linux和memcache,所以如果有人能够澄清这一点,我将非常感激。

+3

没有“Linux文件系统”。有许多Linux支持的文件系统。 – cdhowie

+2

对于您尝试解决的任何问题,单块250k blob听起来像是错误的解决方案。 – tripleee

+3

这听起来像'mmap'可能更好,并将内存全部留给内核。 –

回答

18

是的,如果您每次打开时都不修改该文件。

Linux会将文件信息保存在内存中的写时复制页面上,并且将文件“加载”到内存中应该非常快(页表交换最糟糕)。

编辑:虽然,正如cdhowie指出的,没有'linux文件系统'。但是,我相信相关的代码是在linux的内存管理中,因此独立于有问题的文件系统。如果你很好奇,你可以阅读linux源代码,主要介绍如何处理linux/mm/mmap.c中的vm_area_struct对象。

+3

要添加到答案中,您可以使用'vmtouch'来确保文件在内存中。此链接解释:http://hoytech.com/vmtouch/ 实际上,您可以使用'vmtouch'将文件强制保存在文件系统缓存中。请参阅上面的链接。 – goblinjuice

2

是的,绝对。它将无限期地将访问的文件保存在内存中,除非其他内容需要内存。

您可以使用fadvise系统调用来控制此行为(某种程度上)。有关更多详细信息,请参阅其“man”页面。

读/写系统调用仍然通常需要复制数据,因此如果看到这样做的真正瓶颈,可以考虑使用mmap(),它可以通过将缓存页直接映射到进程中来避免复制。

3

正如人们所说,mmap在这里是一个很好的解决方案。

但是,一个250k文件非常小。您可能需要将其读入并将其放入某种内存结构中,该结构与启动时要发送给用户的内容相匹配。也就是说,如果它是一个文本文件的行数列可能是一个不错的选择,等等。

1

我想把该文件放入虚拟磁盘(tmpfs)可能会做出足够的优势,没有大的修改。除非你真的对微秒单位的响应时间非常认真。

2

该文件应该被缓存,但要确保在mount上设置了noatime选项,否则访问时间将尝试保存到文件中,导致缓存无效。

相关问题