性能测试和 TCP 调优

性能测试和 TCP 调优

我们正在对一个应用程序进行性能测试,该应用程序接收 tcp 请求并将其转换为 soap 请求(WCF-httpBinding),然后其他服务就可以处理该请求。

服务器是 Windows Server 2008 R2。TCP 请求由 TcpListener 实例 (.NET C#) 接收。同一台服务器上运行有 3 个 http 绑定的 WCF 服务。

我们构建了一个性能测试客户端,其目标是模拟多个并发请求(每个请求必须不同且可被应用程序识别)。

我们建立了一个测试,运行 150 个同时运行的请求(由 150 个不同的线程运行),我们立即注意到一些请求获取 TCP 连接的速度很慢,但一旦获得连接,它们的行动就会很快。

单个请求在同一个连接上写入两次 - 请求和应用程序确认。

虽然单个request+ack大概需要150ms,但是150个测试大概需要7秒。

问题

当我们尝试从两台不同的计算机运行此测试时,我们丢失请求. 一些客户请求正在

no connection was made because the target machine actively refused it

所以我得到了这里并确信这是由于积压造成的。我更改了 TcpListener 参数,并写入了注册表 AFD 积压更改这里 但它仍然不起作用,所以我插入了所有建议的 TCP 调整以及一些推荐的 netsh 命令,但仍然没有变化,我们仍然收到该错误。

我还想知道什么吗?还有其他解决方案吗?

答案1

这是 Windows 的一个不幸烦恼。当 Windows 服务器不堪重负时,它会主动拒绝连接(以 RST 响应),而不是不响应连接(不发送 SYN)。为了防止这种情况被解释为失败,Windows 客户端通常会重试连接(发送另一个 SYN),即使它们被主动拒绝(以 RST 响应)。

您应该重试连接,即使它被主动拒绝。显然,如果您每秒尝试的连接数超过服务器可以处理的数量,它们就不可能全部成功。如何处理这种情况取决于您自己。

所以简短的回答是——如果连接尝试次数超过服务器的处理能力,你希望发生什么?你希望它们运行得非常非常慢吗?还是希望它们失败?如果是前者,请永远重试,在重试之间等待的时间越来越长。如果是后者,那么就放弃。

增加积压将有助于防止短时间的负载爆发触发此错误。但是,如果连接速率超过服务器可以处理的速率,则无法使其正常工作。由于连接速率超过了工作完成率,因此有限数量的备份连接都行不通。因此,在某个时候,除非客户端经过专门编码以永久重试,否则您必须开始失败。

相关内容