性能testing和TCP调优

我们正在进行性能testing,接收tcp请求的应用程序将其转换为其他服务工作的soap请求(WCF-httpBinding)。

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

我们已经构build了一个性能testing客户端,其目的是模拟多个并发请求(每个请求必须是不同的,应用程序可识别的)。

我们build立了一个运行150个请求的testing(通过150个不同的线程),我们立即注意到一些请求缓慢地获得了TCP连接,但是一旦它们获得了,它们的行为就会很快。

一个请求在相同的连接请求和应用程序确认中写入两次。

虽然单个请求+确认可能需要大约150ms,但是150个testing需要大约7秒。

问题

当我们尝试从两台不同的电脑上运行这个testing时,我们会失去请求 。 有些客户请求正在获取

no connection was made because the target machine actively refused it 

所以我来到这里,并确信是因为积压。 我改变了TcpListener参数,并做了registryAFD积压更改写在这里,但它仍然没有工作,所以我插入了所有的TCP调优build议加上一些netsh命令,这是build议,但仍然没有改变,我们仍然得到这个错误。

还有什么我需要知道的吗? 还有其他解决scheme吗?

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

即使主动拒绝,也应该重试连接。 很明显,如果你每秒尝试更多的连接比服务器可以处理,他们不能都成功。 你想如何处理这个案件取决于你。

所以简短的答案是 – 如果你获得了比服务器可以处理更多的连接尝试,你希望发生什么? 你想让他们真的很慢吗? 或者你想让他们失败? 如果前者永远重试,在重试之间等待的时间会越来越长。 如果后者,则放弃。

增加积压将有助于保持短的突发负载触发这个错误。 但是,如果连接速率超过服务器可以处理的速度,则无法使其工作。 没有有限数量的备份连接,因为连接速率超过了工作完成率。 所以在某些情况下,除非客户被特别编码以便永久重试,否则您必须开始失败。