- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Apache 文档包含 EnableSendfile 的这条语句:
With a network-mounted DocumentRoot (e.g., NFS, SMB, CIFS, FUSE), the kernel may be unable to serve the network file through its own cache.[1]
Apache 2.4 和 Nginx 的默认配置禁用 sendfile()。
我试图找到一些具体的东西来描述在 Linux 上将 sendfile() 与 NFS 文件系统一起使用时的确切问题。在内核 3.10.0-327.36.3 (CentOS 7) 上运行一个最小的测试程序验证当源在 NFS 上时 sendfile() 确实工作,并且它确实从页面缓存读取(第一次运行很慢,随后很快, drop_caches 使其再次变慢,即从源代码重新读取)。我尝试使用最大 1G 的文件,一切似乎都正常。我假设一定有一些情况会揭示错误行为,但我想确切地知道那是什么。
为了比较,有一些关于 VirtualBox 卷在 sendfile()[2] 中存在的问题的文档,但我找不到类似的内容涵盖 Apache,或者如何复制有问题的配置。
最佳答案
Nginx 的默认配置打开 sendfile
- https://github.com/nginx/nginx/blob/release-1.13.8/conf/nginx.conf#L27所以我对你在那里的陈述感到困惑。
回到 2000 年代初期,您可以看到 Apache dev introducing the option to disable SendFile (这里是 mailing list post for the patch )。还有old bugs that might have been related to sendfile over in the Apache bug tracker .来自 Apache bug #12893我们了解到,其中一个失败是因为 Linux 内核中的 NTFS 实现根本不支持 sendfile
系统调用:
[...] apparently there is some characteristic of your NTFS filesystem that prevents sendfile() from working.
sendfile(8, 9, [0], 9804) = -1 EINVAL (Invalid argument)
A blog post titled "The Mysterious Case of Sendfile and Apache"引用您正在阅读的 stackoverflow 问题提出了以下理论:
sendfile() will transfer at most 0x7ffff000 (2,147,479,552) bytes, returning the number of bytes actually transferred. (This is true on both 32-bit and 64-bit systems.)
有 2GB 的限制。现在这里是假设,apache 文档说:
With a network-mounted DocumentRoot (e.g., NFS, SMB, CIFS, FUSE), the kernel may be unable to serve the network file through its own cache[2]
所以当它说“内核可能无法提供文件”时,我想我们可能指的是 sendfile 对文件大小的固有限制。
有趣的理论,但我怀疑这就是答案,因为您可以简单地选择不对太大的文件使用 sendfile 代码路径。 更新:在四处挖掘时,我发现那篇文章的作者创建了一个标题为 That Time I Was Wrong About Sendfile() and Apache 的后续文章。其中提到了您正在阅读的答案!
还有warnings about sendfile problems in the ProFTPD documentation :
There have been cases where it was the filesystems, rather than the kernels, which appeared to have been the culprits in sendfile(2) problems:
- Network filesystems (e.g NFS, SMBFS/Samba, CIFS)
- Virtualized filesystems (OpenVZ, VMware, and even Veritas)
- Other filesystems (e.g. NTFS and tmpfs on Linux)
Again, if you encounter issues with downloading files from ProFTPD when those files reside on a networked or virtualized filesystem, try using "UseSendfile off" in your proftpd.conf.
很多“这里有龙”的警告。其中一些是因为文件系统根本不支持 sendfile (例如 until 2.4.22-pre3 Linux's tmpfs didn't support sendfile )。基于 FUSE 的文件系统(例如 NTFS-3g)在过去也会因 FUSE 和 sendfile 错误(已解决)而出现问题。虚拟化文件系统列表是一个有趣的补充......
然而 OrangeFS FAQ似乎有最合理的解释:
5.16 Can we run the Apache webserver to serve files off a orangefs volume?
Sure you can! However, we recommend that you turn off the EnableSendfile option in httpd.conf before starting the web server. Alternatively, you could configure orangefs with the option -enable-kernel-sendfile. Passing this option to configure results in a orangefs kernel module that supports the sendfile callback. But we recommend that unless the files that are being served are large enough this may not be a good idea in terms of performance. Apache 2.x+ uses the sendfile system call that normally stages the file-data through the page-cache. On recent 2.6 kernels, this can be averted by providing a sendfile callback routine at the file-system. Consequently, this ensures that we don't end up with stale or inconsistent cached data on such kernels. However, on older 2.4 kernels the sendfile system call streams the data through the page-cache and thus there is a real possibility of the data being served stale. Therefore users of the sendfile system call are warned to be wary of this detail.
可以在 Linux guest readv system call returns stale (cached) shared folder file data Virtualbox bug 中阅读类似的解释。 :
I have discovered that programs that read files using the read system call return the correct data, but those using the readv system call (such as my version of gas) read stale cached data.
[...]
the use of kernel function generic_file_read_iter as the .read_iter member of the file_operations structure (.read_iter is used when doing a readv system call). This function WILL write to and read from the file cache. However, vbox function sf_reg_read, as used for the generic .read member and read system call, appears to always bypass Linux's FS cache.
[...]
Further I believe that a similar long-lived issue is reported as ticket #819, only for the sendfile system call. It seems that all of these generic_file_* functions have the expectation that the host controls all access to the drive.
以上也可以解释 ProFTPD 的问题虚拟化文件系统列表。
Apache 建议不要将 sendfile()
与 Linux NFS 一起使用,因为他们的软件很受欢迎,并且会触发许多与旧版 Linux NFS 客户端调试 sendfile
相关的错误。警告是旧的,保持原样可能比使用所有警告更新它更容易。
如果您有一个 Linux 文件系统,可以在不使 Linux 页面缓存失效的情况下更改底层数据,那么在旧的 Linux 内核上使用 sendfile
是不明智的(这解释了旧的 Linux NFS 客户端问题)。对于较新的内核,如果上述文件系统未实现其自己的 sendfile
Hook ,再次使用 sendfile
是不明智的(Virtualbox 共享文件夹问题证明了这一点)。
最近(2.6.31 及以上)的 Linux 内核为可能面临这种失效问题的文件系统提供了使用它们自己的 sendfile
实现的工具,并且假设文件系统可以使用 sendfile
禁止错误但买者自负!
关于linux - 为什么 Apache 不建议在 Linux 上将 sendfile() 与 NFS 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46367130/
我是一个相对较新的程序员; CS 学士学位,大学毕业大约 2 年,主要使用 C# 中的 .NET。我对 SQL 交互/脚本编写相当流利,并且对 ASP.NET 做了一些工作(主要是维护现有站点)。 我
我计划开发一个简单的解决方案,使我能够即时执行非常基本的视频流分析。我以前从未做过类似的事情,因此这是一个非常笼统和开放的问题。主要重点是检查流是否正常运行,例如 - 卡住帧、黑屏以及音频是否存在。同
我正在考虑重组一个大型 Maven 项目...... 我们当前结构的基本概述: build [MVN plugins, third party dependency management]:5.1
我需要有关附加查询的建议。该查询执行了一个多小时,并根据解释计划进行了全表扫描。我对查询调优还很陌生,希望得到一些建议。 首先,为什么我要进行全表扫描,即使我使用的所有列都在其上创建了索引。 其次,有
我正在做一个项目,我需要在 4 个模型之间创建三个多对多关系。这是它的过程: 常见问题类别可以有许多常见问题子类别,反之亦然。 常见问题组可以有许多常见问题的子类别,反之亦然。 常见问题可以有许多常见
对于代码大小比语音质量更重要的 PIC 和/或 ARM 嵌入式系统,是否有任何易于使用的免费或廉价的语音合成库?现在似乎 1 meg 的封装被认为是“紧凑的”,但很多微 Controller 都比它小
我们正在使用 Solr 建议器功能进行 businessName 查找。当用户输入查询以及匹配的名称时,我们希望 solr 发送来自个人资料的其他属性,如 id、地址、城市、州、国家等字段。 我尝试使
我正在构建一个用户界面。我的计划将包括 4 个主要部分: 1) 顶部菜单 - TMainMenu。一个窗口的顶部 2) 主菜单 - TTreeView。一个窗口的左边。 TreeView的每一项=对应
我的公司需要一个任务管理系统来处理从“为X购买一台计算机”到“将一个人转移到另一个国家”这样简单的场景。简单的场景是由一个人处理的单个任务,而更大的任务可以分解为在工作流程中委派给多个人的多个子任务。
MarkLogic 服务器的林大小与实际内存的建议比率是多少?例如,我目前有一个 190GB 的数据库,并且该数据库随着时间的推移而不断增长。由于数据库会不断增长,我最终需要对该数据库进行集群。因此,
去年我收到了一个礼物,它是一个索尼 CMT700Ni 音频站,支持 wifi。它还具有类似于广播的功能,称为“PartyStreaming”。我目前正在挖掘内部,探索它,所以也许我可以结束拥有自己的“
有没有我可以阅读的研究论文/书籍可以告诉我针对手头的问题哪种特征选择算法最有效。 我试图简单地将 Twitter 消息识别为 pos/neg(首先)。我从基于频率的特征选择开始(从 NLTK 书开始)
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在浏览 stackoverflow 以查找有关使用 jUnit 进行测试的常见建议,但仍然有几个问题。我知道,如果要测试的方法很复杂,最好的方法是将其分成小的单独部分并测试每个部分。但问题是 -
我有一个方法如下 public List> categorize(List customClass){ List> returnValue = new ArrayList<>();
我的问题是,当按照下面的程序合并时,在最佳实践场景中,“将分支折叠回主干”程序的最后一步是正确的方法吗? 我已经使用 svn 很多年了。在我的个人项目中,我总是毫不犹豫地在主干上愉快地进行修改,并且在
我读过 UINavigationController当您想从 n 个屏幕跳转到第一个屏幕时,这是最佳选择。这样做需要以下代码: NSMutableArray *array=[[NSMutableArr
我有一个文件输入类。它在构造函数中有一个字符串参数来加载提供的文件名。但是,如果文件不存在,它就会退出。如果文件不存在,我希望它输出一条消息 - 但不确定如何...... 这是类(class): pu
我希望创建一个“您访问过的国家/地区” map - 就像您可能在 Facebook、TravelAdvisor 和诸如此类的网站上看到的那样。 我尝试过不同的闪光灯套件,但它们并不像我希望的那样先进。
我需要一些关于如何处理我想用 Perl 编写的脚本的建议。基本上我有一个看起来像这样的文件: id: 1 Relationship: "" name: shelby pet: 1
我是一名优秀的程序员,十分优秀!