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

Sor*_* Ly 2 load-testing node.js express

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

我以每秒1000个请求和10个并发性运行测试10秒钟。

loadtest http://localhost:3000/my/api -t 10 -c 10 --rps 1000
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

显然,这与打开文件的数量有关。我尝试了此命令,ulimit -n <number>但无济于事。它的上限为9999(我无法将其设置为该上限)。

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

我的本地计算机是Mac OS Sierra,CPU:1.6GHz,RAM:8GB。

rob*_*lep 5

macOS 对允许的打开文件描述符数量(总和每个进程)设置了较低的内核限制。我必须检查我妻子的Mac,默认的每个进程限制为10240,基本上可以确定您要使用的限制ulimitulimit不能超出内核施加的限制)。

不过,运行以下sysctl命令可以很容易地增加这些值:

sudo sysctl kern.maxfiles=122880 kern.maxfilesperproc=102400
Run Code Online (Sandbox Code Playgroud)

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

如果您希望它们在重新启动后/etc/sysctl.conf仍然存在,请在文件中添加以下两行(如果尚不存在,只需创建它):

kern.maxfiles=122880
kern.maxfilesperproc=102400
Run Code Online (Sandbox Code Playgroud)