Node + Express: loadtest causing the application to quit with Error: accept ENFILE

Node + Express: loadtest causing the application to quit with Error: accept ENFILE

当我 运行 对它进行负载测试时,我的应用程序在相对较低的压力点退出。为了测试,我使用了这个 npm 包 loadtest

我运行测试每秒1000个请求,10个并发,持续10秒。

loadtest http://localhost:3000/my/api -t 10 -c 10 --rps 1000

应用程序在大约两秒后退出并给出以下不是很有用的错误。

events.js:163
      throw er; // Unhandled 'error' event
      ^

Error: accept ENFILE
    at exports._errnoException (util.js:1050:11)
    at TCP.onconnection (net.js:1462:24)

显然,这与打开文件的数量有关。我试过这个命令 ulimit -n <number> 但它没有帮助。限制在 9999(我不能设置超过那个)。

该应用程序可以在 10 个并发时处理大约 400rps。

我的本地机器是 Mac OS Sierra,CPU:1.6GHz,内存:8GB。

macOS 对允许的打开文件描述符数量(总数和每个进程)设置了相当低的 kernel 限制。我不得不检查我妻子的 Mac,默认的每个进程限制是 10240,这基本上是你被限制使用 ulimit 的地方( ulimit 不能超出内核施加的限制)。

增加这些值很容易,但是,运行 sysctl 命令:

sudo sysctl kern.maxfiles=122880 kern.maxfilesperproc=102400

(这些是我在 Mac 上使用的值,它们相当随意但对我来说没问题)

如果您希望它们在重启后保持不变,请将以下两行添加到文件 /etc/sysctl.conf(如果尚不存在,请创建它):

kern.maxfiles=122880
kern.maxfilesperproc=102400