【问题标题】:Does the Linux filesystem cache files efficiently?Linux 文件系统是否有效地缓存文件?
【发布时间】:2011-10-30 10:02:57
【问题描述】:

我正在创建一个在 Linux 服务器上运行的 Web 应用程序。应用程序不断地访问一个 250K 的文件——它将它加载到内存中,读取它并将一些信息发送回用户。由于这个文件一直被读取,所以我的客户建议使用 memcache 之类的东西将其缓存到内存中,大概是因为它会使读取操作更快。

但是,我认为 Linux 文件系统可能已经将文件缓存在内存中,因为它被频繁访问。那正确吗?在您看来,memcache 会提供真正的改进吗?还是它会做 Linux 已经在做的事情?

我对 Linux 和 memcache 都不是很熟悉,所以如果有人能澄清这一点,我将不胜感激。

【问题讨论】:

  • 没有“Linux 文件系统”。 Linux 支持许多文件系统。
  • 听起来mmap 可能会更好,并将内存全部留给内核。
  • 和往常一样,当问这种问题时,会有“你做错了”之类的答案。你不知道项目的细节,所以请不要吝啬我的光顾。
  • 基于猜测甚至来自 SO 的知情意见进行优化几乎总是浪费时间。分析应用程序,查看文件访问是否是瓶颈。可能不是,但这里没有人可以肯定地告诉你。我会说 250k 听起来像是需要担心的内存量非常小。

标签: linux filesystems memcached


【解决方案1】:

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

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

编辑:虽然,正如 cdhowie 指出的那样,没有“linux 文件系统”。但是,我相信相关代码在 linux 的内存管理中,因此与相关的文件系统无关。如果你好奇,你可以阅读 linux 源码,主要是在 linux/mm/mmap.c 中处理 vm_area_struct 对象。

【讨论】:

  • 要添加答案,您可以使用vmtouch 确保文件在内存中。此链接说明:hoytech.com/vmtouch 实际上,您可以使用vmtouch 强制文件始终保存在文件系统缓存中。请参阅上面的链接。
【解决方案2】:

是的,当然。它会将访问的文件无限期地保存在内存中,除非其他东西需要内存。

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

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

【讨论】:

    【解决方案3】:

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

    但是,一个 250k 的文件非常小。您可能希望将其读入并将其放入某种内存结构中,该结构与您希望在启动时发送回用户的内容相匹配。即,如果它是一个文本文件,则行数组可能是一个不错的选择,等等。

    【讨论】:

      【解决方案4】:

      我猜将该文件放入 ramdisk (tmpfs) 可能会获得足够的优势,而无需进行大的修改。除非您真的很重视以微秒为单位的响应时间。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2011-06-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-24
          • 1970-01-01
          • 2017-11-23
          • 2015-08-07
          • 1970-01-01
          • 2012-08-16
          相关资源
          最近更新 更多