Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux文件系统是否高效地缓存文件?_Linux_Filesystems_Memcached - Fatal编程技术网

Linux文件系统是否高效地缓存文件?

Linux文件系统是否高效地缓存文件?,linux,filesystems,memcached,Linux,Filesystems,Memcached,我正在创建一个在Linux服务器上运行的web应用程序。应用程序不断地访问一个250K的文件——它将它加载到内存中,读取它并将一些信息发送回用户。由于这个文件一直在读取,我的客户机建议使用memcache之类的东西将其缓存到内存中,大概是因为它会使读取操作更快 但是,我认为Linux文件系统可能已经在内存中缓存文件了,因为它经常被访问。是这样吗?在您看来,memcache能提供真正的改进吗?或者它会做Linux已经在做的事情吗 我对Linux和memcache都不太熟悉,因此如果有人能澄清这一点

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

但是,我认为Linux文件系统可能已经在内存中缓存文件了,因为它经常被访问。是这样吗?在您看来,memcache能提供真正的改进吗?或者它会做Linux已经在做的事情吗


我对Linux和memcache都不太熟悉,因此如果有人能澄清这一点,我将不胜感激。

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

Linux将在内存中的写页上保存文件信息的副本,并且将文件“加载”到内存中的速度应该非常快(最坏的情况是页表交换)


编辑:不过,正如cdhowie指出的,没有“linux文件系统”。但是,我相信相关代码在linux的内存管理中,因此独立于所讨论的文件系统。如果您感兴趣,您可以在linux源代码中阅读有关在linux/mm/mmap.c中处理vm_area_struct对象的主要内容。

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

您可以通过fadvise系统调用控制此行为(在某种程度上)。有关更多详细信息,请参见其“手册”页


一个读写系统调用通常仍然需要复制数据,所以如果你看到了一个真正的瓶颈,考虑使用MMAP()来避免拷贝,通过将缓存页面直接映射到进程中。

正如人们提到的,MMAP是一个很好的解决方案。


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

我想将该文件放入ramdisk(tmpfs)可能会有足够的优势,而无需进行大的修改。除非您对以微秒为单位的响应时间非常认真。

应该缓存文件,但请确保在装载上设置了noatime选项,否则将尝试将访问时间保存到文件,从而使缓存无效。

没有“Linux文件系统”Linux支持许多文件系统。这听起来像是
mmap
可能会更好,并将内存全部留给内核。像往常一样,当问这种问题时,会有“你做错了”这样的答案。你不知道这个项目的细节,所以请不要对我采取傲慢的态度。基于猜测甚至是so的知情意见进行优化几乎总是在浪费时间。配置应用程序,查看文件访问是否是瓶颈。也许不是,但这里没有人能肯定地告诉你。不过,我想说250k的内存量听起来非常小。为了补充答案,您可以使用
vmtouch
确保文件在内存中。此链接说明:实际上,您可以使用
vmtouch
强制文件始终保存在文件系统缓存中。请参阅上面的链接。