Node + Express:loadtest导致应用程序退出并显示错误:接受ENFILE

时间:2017-04-14 15:19:01

标签: node.js express load-testing

当我对其运行负载测试时,我的应用程序在相对较低的压力点退出。为了测试,我使用这个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,RAM:8GB。

1 个答案:

答案 0 :(得分:4)

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

但是,运行sysctl命令

可以很容易地增加这些值
sudo sysctl kern.maxfiles=122880 kern.maxfilesperproc=102400

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

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

kern.maxfiles=122880
kern.maxfilesperproc=102400