use*_*789 5 performance upstart monit node.js ubuntu-14.04
我的节点应用程序正在向两台服务器 A 和 B 发出请求。对于服务器 A,它会等待一个请求完成,然后再发出下一个请求。对于服务器 B,它每秒发出 20 个请求,无需等待。当我向服务器 B 发出请求时,向服务器 A 发出请求需要很长时间。当我不向服务器 B 发出请求时,它们会很快处理。对服务器 B 的请求堆积起来,但同时处理的请求不超过几百个。
我在 Joyent smartos 实例上运行了完全相同的应用程序,具有相同的节点版本,并且没有这个问题,因此我认为这是操作系统设置的限制的问题,而不是节点设置的限制的问题。在节点中,我确实将 maxSockets 设置为 10000,如此处所述,http://markdawson.tumblr.com/post/17525116003/node
我正在与 upstart 一起运行我的应用程序,尽管我不知道如果没有它我是否会遇到问题(这将是我的下一个测试)。在我的新贵配置文件中,我有限制 nofile 90000 90000。我可以提出一些其他限制,如此处所述,http://upstart.ubuntu.com/wiki/Stanzas#limit,但我不知道它们的作用。其中之一可能导致问题吗?我的 Ubuntu 机器的限制还可以在哪里设置?
我应该补充一点,我正在通过 Monit 启动新贵程序,以防相关。
您没有提及如何与 ServerA 或 ServerB 通信,但 Node 的HTTP 库默认限制每个主机(协议/服务器/端口)组合有 6 个连接。您可以增加此值http.globalAgent.maxSockets = 20;或任何您想要的最大值。
其他问题可能与操作系统中的打开文件/套接字限制有关...您想/proc/sys/fs/file-max看看
来自最近的 linux/Documentation/sysctl/fs.txt:
文件最大和文件编号:
内核动态分配文件句柄,但到目前为止它不会再次释放它们。
file-max 中的值表示 Linux 内核将分配的文件句柄的最大数量。当您收到大量有关文件句柄耗尽的错误消息时,您可能需要增加此限制。
从历史上看,file-nr 中的三个值分别表示已分配的文件句柄数、已分配但未使用的文件句柄数以及最大文件句柄数。Linux 2.6 总是报告 0 作为空闲文件句柄的数量——这不是一个错误,它只是意味着分配的文件句柄的数量与已使用的文件句柄的数量完全匹配。
printk 报告尝试分配比文件最大数量更多的文件描述符,查找“VFS:已达到文件最大限制”。
特别是对于 Ubuntu,如果您有很多 ufw(防火墙)和/或 iptables 规则,这也会产生影响。