几个小时后节点服务器崩溃
Posted
技术标签:
【中文标题】几个小时后节点服务器崩溃【英文标题】:Node Server crashes after few hours 【发布时间】:2015-06-14 17:01:58 【问题描述】:我在 Ubuntu 服务器上使用 Nodemon 和 Forever 模块。
我使用这个命令来启动我的节点服务器:
forever start -c nodemon app.js --exitcrash
它可以正常工作几个小时(大约 48 小时),但在那之后我的服务器停止工作并出现这些错误:
Error: getaddrinfo EMFILE
TypeError: Cannot call method 'indexOf' of undefined
Error: Handshake inactivity timeout
这些错误是由于超出打开文件/套接字的限制。
现在我的问题是:
我可以使用 -m(在我的操作系统中设置为无限制):
max memnory size (kbytes, -m) unlimited
我应该将上述命令与 -m 一起使用吗?有什么缺点吗?
或者有没有其他有效的解决方案来修复服务器崩溃?
【问题讨论】:
关闭打开的文件/套接字怎么样? 检查那些答案 ***.com/questions/410616/… serverfault.com/questions/48717/… @AleksandrM 我的站点中有大量用户,我已检查节点服务器是否自行关闭了套接字。 socket.on('disconnect', function () var socketIndex = connectionsArray.indexOf( socket ); console.log('socket = ' + socketIndex + 'disconnected'); if (socketIndex >= 0) connectionsArray.splice( socketIndex, 1 ); console.log(socketIndex + '连接数:' + connectionsArray.length); );控制台日志显示当前使用的打开套接字的数量。 @EdgarZakaryan 如果我使用 # ulimit -n 99999 命令增加服务器上的文件数限制有什么缺点吗? @Irtizashahid 它可能会耗尽系统资源 【参考方案1】:如果您有大量用户,很可能您正在达到系统排队监听套接字的最大请求数。如果您确定您的服务器可以处理负载,您可以从默认的 128 增加到 1024。
是的,增加 ulimit,以便系统可以处理更多负载,但不要设置为无限制,只需检查什么足以处理当前负载。
也可以通过这个Increasing the maximum number of tcp/ip connections in linux 也会得到一些有用的信息
【讨论】:
我当前打开的文件限制是 2048 个打开文件 (-n) 2048 @Irtizashahid 你可以加倍 我增加了 (-n) open values 的值。我必须等待至少两天来测试服务器。你知道如果我在我的 linux 命令上将 -c 更改为 -m 会发生什么吗? @Irtizashahid 你想永远传递 -m 吗? -m MAX 只运行指定的脚本MAX次 还是同样的问题:(节点服务器停止工作。我增加了打开文件的值(-n)。【参考方案2】:这可能不是理想的答案,但将forever-service 与 nodemon 一起使用将确保您的服务器在崩溃后重新启动。
这是对我有用的命令。我将它包括在内是因为要让永久服务和 nodemon 运行良好可能会很棘手。
它执行以下操作:每次修改应用程序 dist/assets 文件夹中的 json 或 raml 文件时,等待 10 秒然后重新启动节点应用程序(server.js 脚本):
$ forever-service install raml --script server.js -f " -c nodemon" -o " --delay 10 --watch dist/assets -e json,raml --exitcrash" -e "PATH=/usr/local/bin:$PATH"
然后我可以运行:
$ service raml start|stop|restart|status
我还可以使用 chkconfig 实用程序在服务器重新启动时启动服务:
$ chkconfig --add raml
$ chkconfig raml on
【讨论】:
如果我的服务器上的套接字数量增加,我的服务器上的问题超出了限制。如果我使用服务 raml 或 chkconfig 可以解决吗?我不知道 rmal 和 chkconfig 服务 我很抱歉造成混乱。这只是一种在服务器崩溃时自动重启服务器的方法。它没有解决您最初的错误。包含其余信息是为了向您展示如何创建服务,因为这可能很困难。以上是关于几个小时后节点服务器崩溃的主要内容,如果未能解决你的问题,请参考以下文章