查看太多文件对性能和可靠性有何影响?

What are the performance and reliability implications of watching too many files?

在 Facebook 的 Watchman application, somewhere in the docs it says this:

Most systems have a finite limit on the number of directories that can be watched effectively; when that limit is exceeded the performance and reliability of filesystem watching is degraded, sometimes to the point that it ceases to function.

这对我来说似乎很模糊。在 "ceases to function" 之前,如果我开始观看太多文件,我究竟会发生什么?我们是在谈论 100 个文件、1,000 个文件、100,000 个文件..? (我知道这个数字在不同的系统上会有所不同,但对现代 Unix 笔记本电脑的合理限制的一些粗略想法会很有用)。

我有一个用例涉及监视整个 node_modules 文件夹(其中包含深层嵌套子目录中的数千个文件),我想在开始处理之前知道它是否是一个完整的非-首发。

抱歉,如果这些文档没有您希望的那么清楚。

首先,我们专门构建了 watchman 来加速必须在非常大的树上运行的工具,尤其是这棵树,自从写这篇文章以来,它一直在变得越来越大:

https://code.facebook.com/posts/218678814984400/scaling-mercurial-at-facebook/

Facebook's main source repository is enormous--many times larger than even the Linux kernel, which checked in at 17 million lines of code and 44,000 files in 2013

目前我手头没有任何关于回购大小的最新 public 数字,但这里的要点是这对绝大多数人来说应该工作得很好应用程序。

现在介绍超出限制时系统的行为。答案取决于您使用的操作系统。

有 2 个主要的系统限制会影响此行为;其中之一是直接限制观看项目的数量;当它超过时,您将无法观看任何其他内容。当 运行 on Linux 时,Watchman 会将这种情况视为不可恢复,并将自己标记为中毒;在这种状态下,它不可能准确地报告正在监视的目录数量范围内的文件更改,直到您提高系统限制,或者放弃尝试监视文件系统的那部分。

当 运行 在 OS X 上时,由于 fsevents API 中的错误诊断,Watchman 无法判断是否超过了此限制;如果我们无法启动手表,我们只能判断。因为 fsevents 没有告诉我们发生了什么,并且因为这个限制不是用户可配置的,所以我们不能将进程置于中毒状态。

另一个系统限制是内核为 watchman 进程使用缓冲的项目数。如果该缓冲区溢出,内核将开始丢弃更改通知。它会通知 watchman 它这样做了,这将导致 watchman 执行(很可能,因为树可能很大)昂贵的树重新爬行,以确保它可以(重新)发现它可能因以下原因而错过的任何更改溢出。

OS X 有类似的限制和类似的恢复行为,但不允许用户提高限制。我还没有在野外的 OS X 上观察到这种情况,所以我假设这个系统限制的默认值是一个非常合理的默认值。

至于各种文件大小的实际限制,这实际上取决于您的系统;文件系统、存储设备、CPU 电源和您可能在该系统上 运行 的其他应用程序会影响更改应用于文件系统和由内核报告的速率,以及速率您的系统将能够使用来自内核的事件。

您更改这些文件的速度是一个重要因素;如果您有一个非常大且繁忙的树并且经常更改(超过 100 名工程师每天进行多次提交并经常重新设置基准),那么您遇到重新抓取案例的风险就会增加。

调整系统限制没有放之四海而皆准的答案;您需要尝试一下并提高您达到的极限 if/when。