Windows上命名管道的低吞吐量

时间:2010-04-26 13:48:01

标签: c++ windows performance network-programming

我遇到使用Windows命名管道的低性能问题。随着网络延迟的增加,吞吐量迅速下降。每秒发送的消息与往返时间之间存在大致线性关系。似乎客户端必须在服务器发送下一个消息之前确认每条消息。这导致性能非常差,我只能通过RTT为200 ms的链路每秒发送5(~100字节)消息。

管道是异步的,使用多个重叠的写操作(以及客户端的多个重叠读取),但这并没有提高吞吐量。是否可以通过命名管道并行发送消息?使用PIPE_TYPE_MESSAGE创建管道,PIPE_READMODE_BYTE会更好吗?还有其他方法可以改善表现吗?

这是一个部署的解决方案,所以我不能简单地用套接字连接替换管道(我已经读过不建议在Windows上使用Windows命名管道,我想知道这是否为什么)。我对此事的任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

我们发现Named Pipes已经poor performance from Windows XP开始了。

我没有适合你的解决方案。但我同意命名管道从XP开始无用的概念。因为它,我们完全改变了我们的软件(在IPC方面)。

你的comms是否被分解成一个单独的DLL?也许您可以使用看起来相同但行为不同的接口替换DLL?

答案 1 :(得分:0)

我已经实现了一种解决方法,在写入管道之前引入了一个小的(~1ms)固定延迟来缓冲尽可能多的数据。通过RTT为200ms的网络链路,我可以在大约三分之一的时间内发送十倍的数据。

我在第一次连接时向下发送消息,因此客户端可以确定服务器支持的通信模式并相应地发送数据。

答案 2 :(得分:0)

我认为一些广域网优化设备能够提升性能,因为他们所做的一件事就是理解协议并减少他们的烦恼。鉴于许多WAN链路的延迟,仅此一项就可以提高吞吐量并减少超时。