我正在编写一个简单的测试脚本(python)来测试Web服务器的性能(该服务器所做的只是HTTP重定向)。 Socket 设置为非阻塞,并注册到 epoll 实例。
我如何知道 connect() 失败是因为服务器无法接受更多连接?我目前使用 EPOLLERR 作为指标。它是否正确?
编辑: 假设: 1)不考虑IP层网络不可达。
捕获
Connection Refused
和其他套接字错误的情况。由于我假设您也在挂起的套接字上注册读/写可用性(成功),因此您还应该手动超时那些未能通知您相关文件描述符上的读、写或错误可用性的连接可接受的时间限制。
通常仅当服务器的 ECONNREFUSED
队列超出其限制或服务器甚至未绑定到远程端口处的套接字时才返回
accept()
。 ENETDOWN
、EHOSTDOWN
、ENETUNREACH
和EHOSTUNREACH
仅当比 TCP 更低的层(例如 IP)知道由于某种原因无法到达主机时才返回,因此它们对于压力测试不是特别有帮助Web 服务器的性能。
因此,您还需要限制建立超时连接所需的时间,以涵盖压力测试失败场景的全部范围。超时值的选择取决于您。
您无法知道它“失败了,因为服务器无法接受更多连接”,因为没有针对该情况的特定协议。你只能知道它因常见原因失败:ECONNREFUSED、连接超时、EUNREACH 等。