我在http://spyne.io上面编写了python rpc服务器(并且已经扭曲了)。我已经在它上面做了一些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秒后),我怀疑,我已经遇到了一些隐含/默认的速率限制(但是我对它们的搜索没有成功)。
这是否可能 - 如果是这样,有人能指出我这些限制吗?
或者这只是服务器的重载?
由于
multi mechanize benchmark image
修改
感谢Jean-Paul Calderone回答我已经查看了TCP连接的数量netstat -at | wc -l
。
每次超过28K我都会获得Cannot assign requested address
。
我很高兴这不是服务器问题。 :)
答案 0 :(得分:0)
错误
Cannot assign requested address
可能会告诉您,您已经用完了IP /端口组合。特定的IP地址可以与大约65535个不同的端口号组合以形成地址。 TCP连接涉及两个地址,每个地址用于连接的每一端。
因此,特定的IP地址不能建立超过65535个TCP连接。如果TCP连接的两端都落在同一个IP地址上,那么将限制降低到一半。
此外,TCP连接清理涉及TIME_WAIT
状态 - 一个有时间限制的时间间隔,在该时间间隔内连接仍然存在但已经关闭。在此间隔期间,其端点的地址不可重复使用。因此,除了在给定IP地址上给定时间内可以打开的TCP连接数的硬性最大值之外,还可以在给定窗口内打开的TCP连接数最大硬盘。时间。
如果您在本地系统上进行基准测试,那么您可能会遇到这些限制。您可以使用更多IP地址扩展您的基准。
当然,如果您的服务器可以处理足够的连接以使您的基准测试实际遇到这些限制,那么您可能已经回答了服务器是否足够快的问题。除非您的应用程序逻辑能够以更快的数量级处理请求,否则从(例如)1000个连接/秒到10000个连接/秒不会获得太多收益。
考虑一个需要1毫秒处理时间的应用程序。与可以服务1000个连接/秒的RPC服务器配对,您将能够服务500个请求/秒(1ms应用程序+ 1ms服务器 - > 2ms - > 1/500秒 - > 500 /秒) 。现在用一个十分之一的服务器替换服务器:1ms app + .1ms server - &gt; 1.1ms - &gt; 909 /秒。因此,您的服务器速度提高了10倍,但您的吞吐量却达不到2倍。现在,差不多2倍并不算太糟糕。但它从这里迅速减少了回报 - 服务器再快十倍,只能让你达到990个请求/秒。并且您永远不会超过1000个请求/秒,因为这是您的应用程序逻辑的限制。