我正在创build一个运行在Linux服务器上的Web应用程序。 应用程序正在不断地访问一个250K文件 – 它将其加载到内存中,读取它并向用户发回一些信息。 由于这个文件一直被读取,所以我的客户端build议使用类似于memcache的东西来将其caching到内存中,这可能是因为它会使读取操作更快。
不过,我认为Linux文件系统可能已经将文件caching在内存中,因为它经常被访问。 是对的吗? 在你看来,memcache会提供一个真正的改进吗? 还是要做和Linux一样的事情?
我并不十分熟悉Linux和memcache,所以如果有人能够澄清这一点,我将不胜感激。
是的,如果每次打开文件都不修改文件。
Linux将把文件的信息保存在内存中的写时复制页面上,并且将文件“加载”到内存中应该是非常快的(最坏的情况是页表交换)。
编辑:虽然,正如cdhowie指出,没有“Linux文件系统”。 但是,我相信相关的代码是在linux的内存管理中,因此独立于所讨论的文件系统。 如果你好奇,你可以在linux源代码里读到关于处理linux / mm / mmap.c中的vm_area_struct对象的问题。
正如人们所提到的,mmap在这里是一个很好的解决方案。
但是,一个250K文件是非常小的。 您可能需要将其读入并将其放入与启动时要发送给用户的某种内存结构相匹配的内存结构中。 也就是说,如果它是一个文本文件,一行行可能是一个不错的选择,等等。
当然是。 它将无限期地将访问的文件保存在内存中,除非其他东西需要内存。
您可以用fadvise系统调用来控制这种行为(在某种程度上)。 有关更多详细信息,请参阅其“man”页面。
读/写系统调用通常仍然需要复制数据,所以如果你看到一个真正的瓶颈,可以考虑使用mmap()来避免复制,直接将缓存页面映射到进程中。
该文件应该被缓存,但是要确保在mount上设置了noatime选项,否则访问时间会试图保存到文件中,导致缓存无效。
我想把这个文件放入虚拟磁盘(tmpfs)可能会有足够的优势,而不需要大的修改。 除非你真的对微秒单位的反应时间非常认真。