我在上面写了python rpc服务器 http://spyne.io(和扭曲)。我已经对它做了一些 Multi-Mechanize 基准测试,正如您在下面的图像中看到的那样 - 经过一分钟的测试,它开始在建立连接时出现问题。
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 年代之后),因此我遇到了一些来自扭曲的隐含/默认速率限制(但我对它们的搜索没有成功)。
这可能吗 - 如果是这样,有人可以指出我这些限制吗?
或者这只是服务器的过载?
谢谢
多机械化基准形象
编辑:
感谢Jean-Paul Calderone的回答,我查看了netstat -at | wc -l
TCP连接的数量。
每次它超过 28K 时,我都会得到Cannot assign requested address
.
我很高兴这不是服务器问题。 :)
错误
Cannot assign requested address
可能会告诉您 IP/端口组合已用完。 一个特定的IP地址可以与大约65535个不同的端口号组合成一个地址。 TCP 连接涉及两个地址,连接的每一端一个。
因此,一个特定的IP地址不能建立超过65535个TCP连接。 如果TCP连接的两端都位于同一IP地址上,则将限制降至一半。
此外,TCP 连接清理涉及TIME_WAIT
状态 - 一个有时间限制的时间间隔,在此期间连接仍然存在,尽管它已经关闭。 在此时间间隔内,其终结点的地址不可用于重用。 因此,除了给定时间在给定 IP 地址上可以打开的 TCP 连接数的硬最大值之外,在给定时间窗口内可以打开的 TCP 连接数也有硬最大值。
如果您在本地系统上进行基准测试,则似乎已经达到了这些限制。 您可以通过使用更多 IP 地址将基准扩展到它们之外。
当然,如果你的服务器可以处理足够的连接,以至于你的基准测试实际上遇到了这些限制,也许你已经回答了服务器是否足够快的问题。 从(例如)1000 个连接/秒提高到 10000 个连接/秒不会获得太多好处,除非您的应用程序逻辑可以更快地处理请求的数量级左右。
考虑一个需要 1ms 处理时间的应用程序。 与每秒可以处理 1000 个连接的 RPC 服务器配对,您将能够每秒处理 500 个请求(1 毫秒应用程序 + 1 毫秒服务器 -> 2 毫秒 -> 1/500 秒 -> 500 秒)。 现在将服务器替换为开销为十分之一的服务器:1ms 应用程序 + .1ms 服务器 -> 1.1ms -> 909/秒。 因此,您的服务器速度提高了 10 倍,但您还没有达到 2 倍的吞吐量。 现在,几乎 2 倍还不错。 但它正在迅速减少从这里获得的回报 - 服务器再次快十倍只能让你达到 990 个请求/秒。 而且您永远不会超过每秒 1000 个请求,因为这是应用程序逻辑的限制。