3

我正在使用 siege 为我的 node.js 服务器(一个小型​​ web 应用程序)做一些负载测试。我可以看到,即使是像 300 这样的少量并发连接,它也会显示一些错误

siege -c 300 -n myserver.com:3000

然后我可以看到一些结果,例如

[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer

我可以看到服务器正在关闭连接。为什么会这样。我该如何调试它。我有一台运行在 4GB 内存的 Macbook pro 上的服务器。我想让你知道我使用过 websockets。即客户端访问运行在 node.js 上的 Web 服务器返回的页面。然后,此页面使用 websockets 连接到同一服务器以进行双向通信。什么可能导致这样的问题?

4

1 回答 1

4

当遇到您认为您可能会用完套接字的情况时,有两件事需要确认。

  1. 检查您是否明确关闭了套接字。在某些语言中,垃圾收集器的终结逻辑会在你之后清理,但这涉及滞后且马虎;在其他不这样做的语言中,您的应用程序将“泄漏”套接字(以及文件句柄),直到它终止。
  2. 使您的操作系统允许您的应用程序的用户帐户为您的测试提供足够的峰值套接字。

要解决第 1 点:您要关闭套接字吗?我不是一个重度 node.js 用户,但我认为:

var conn = new net.Socket();
conn.destroy(); //Are you doing this?

要解决第 2 点:将硬打开和软打开文件限制设置为足够高的值,以免妨碍您:

launchctl limit maxfiles 8192 8192

不带参数运行sudo launchctl limit应该打印出您当前的限制。有关更多详细信息,请查看有关 launchctl 的 Apple 文档。

于 2013-01-30T06:52:12.903 回答