Spyne rpc 服务器基准测试(无法建立新连接)
Spyne rpc server benchmark (Failed to establish a new connection)
我有 python 上面写的 rpc 服务器 http://spyne.io(和扭曲)。我已经对其进行了一些多机械化基准测试,如下图所示 - 经过一分钟的测试后,它开始出现建立连接的问题。
111274, 254.989, 1516806285, user_group-1, 0.017, HTTPConnectionPool(host='0.0.0.0' port=4321): Max retries exceeded with url: / (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x7f2c78bf2810>: Failed to establish a new connection: [Errno 99] Cannot assign requested address')), {'increment': 0.0179598331451416}
因为这是一个时钟(60 秒后),我怀疑,我已经 运行 进入一些 implicit/default 速率限制来自扭曲(但我对它们的搜索没有成功) .
这可能吗?如果可以,有人可以指出这些限制吗?
或者这只是服务器过载?
谢谢
multi mechanize benchmark image
编辑:
感谢 Jean-Paul Calderone 的回答,我查看了 TCP 连接数 netstat -at | wc -l
。
每次超过 28K 我都会得到 Cannot assign requested address
。
很高兴这不是服务器问题。 :)
错误
Cannot assign requested address
可能是在告诉您 IP/port 个组合中有 运行 个。一个特定的 IP 地址可以与大约 65535 个不同的端口号组合形成一个地址。一个 TCP 连接涉及两个地址,一个用于连接的每一端。
因此,一个特定的IP地址不能建立超过65535个TCP连接。如果 TCP 连接的两端落在同一个 IP 地址上,那么限制就会减半。
此外,TCP 连接清理涉及 TIME_WAIT
状态 - 一个有时间限制的间隔,在此期间连接仍然存在,尽管它已经关闭。在此间隔期间,其端点的地址不可重复使用。因此,除了在给定时间在给定 IP 地址上可以打开的 TCP 连接数的硬性最大值之外,在给定的时间内可以打开的 TCP 连接数也有硬性最大值 window 的时间。
如果您在本地系统上进行基准测试,您可能 运行 已达到这些限制。您可以通过使用更多 IP 地址来扩展您的基准测试。
当然,如果您的服务器可以处理足够多的连接,以至于您的基准测试实际上遇到了这些限制,也许您已经回答了服务器是否足够快的问题。从(例如)1000 connections/second 到 10000 connections/second 不会有太多收获,除非您的应用程序逻辑可以按数量级左右更快地处理请求。
考虑一个需要 1 毫秒处理时间的应用程序。与可以服务 1000 connections/sec 的 RPC 服务器配对,您将能够服务 500 requests/second(1 毫秒应用程序 + 1 毫秒服务器 -> 2 毫秒 -> 1/500 秒 -> 500/秒)。现在将服务器替换为开销十分之一的服务器:1ms app + .1ms server -> 1.1ms -> 909/sec。所以你的服务器速度提高了 10 倍,但你还没有达到 2 倍的吞吐量。现在,几乎是 2 倍还不错。但它从这里开始迅速减少 returns - 再次快十倍的服务器只会让你达到 990 requests/second。而且您永远不会超过 1000 requests/second,因为那是您的应用程序逻辑的极限。
我有 python 上面写的 rpc 服务器 http://spyne.io(和扭曲)。我已经对其进行了一些多机械化基准测试,如下图所示 - 经过一分钟的测试后,它开始出现建立连接的问题。
111274, 254.989, 1516806285, user_group-1, 0.017, HTTPConnectionPool(host='0.0.0.0' port=4321): Max retries exceeded with url: / (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x7f2c78bf2810>: Failed to establish a new connection: [Errno 99] Cannot assign requested address')), {'increment': 0.0179598331451416}
因为这是一个时钟(60 秒后),我怀疑,我已经 运行 进入一些 implicit/default 速率限制来自扭曲(但我对它们的搜索没有成功) .
这可能吗?如果可以,有人可以指出这些限制吗?
或者这只是服务器过载?
谢谢
multi mechanize benchmark image
编辑:
感谢 Jean-Paul Calderone 的回答,我查看了 TCP 连接数 netstat -at | wc -l
。
每次超过 28K 我都会得到 Cannot assign requested address
。
很高兴这不是服务器问题。 :)
错误
Cannot assign requested address
可能是在告诉您 IP/port 个组合中有 运行 个。一个特定的 IP 地址可以与大约 65535 个不同的端口号组合形成一个地址。一个 TCP 连接涉及两个地址,一个用于连接的每一端。
因此,一个特定的IP地址不能建立超过65535个TCP连接。如果 TCP 连接的两端落在同一个 IP 地址上,那么限制就会减半。
此外,TCP 连接清理涉及 TIME_WAIT
状态 - 一个有时间限制的间隔,在此期间连接仍然存在,尽管它已经关闭。在此间隔期间,其端点的地址不可重复使用。因此,除了在给定时间在给定 IP 地址上可以打开的 TCP 连接数的硬性最大值之外,在给定的时间内可以打开的 TCP 连接数也有硬性最大值 window 的时间。
如果您在本地系统上进行基准测试,您可能 运行 已达到这些限制。您可以通过使用更多 IP 地址来扩展您的基准测试。
当然,如果您的服务器可以处理足够多的连接,以至于您的基准测试实际上遇到了这些限制,也许您已经回答了服务器是否足够快的问题。从(例如)1000 connections/second 到 10000 connections/second 不会有太多收获,除非您的应用程序逻辑可以按数量级左右更快地处理请求。
考虑一个需要 1 毫秒处理时间的应用程序。与可以服务 1000 connections/sec 的 RPC 服务器配对,您将能够服务 500 requests/second(1 毫秒应用程序 + 1 毫秒服务器 -> 2 毫秒 -> 1/500 秒 -> 500/秒)。现在将服务器替换为开销十分之一的服务器:1ms app + .1ms server -> 1.1ms -> 909/sec。所以你的服务器速度提高了 10 倍,但你还没有达到 2 倍的吞吐量。现在,几乎是 2 倍还不错。但它从这里开始迅速减少 returns - 再次快十倍的服务器只会让你达到 990 requests/second。而且您永远不会超过 1000 requests/second,因为那是您的应用程序逻辑的极限。