我遇到使用Windows命名管道的低性能问题。随着网络延迟的增加,吞吐量迅速下降。每秒发送的消息与往返时间之间存在大致线性关系。似乎客户端必须在服务器发送下一个消息之前确认每条消息。这导致性能非常差,我只能通过RTT为200 ms的链路每秒发送5(~100字节)消息。
管道是异步的,使用多个重叠的写操作(以及客户端的多个重叠读取),但这并没有提高吞吐量。是否可以通过命名管道并行发送消息?使用PIPE_TYPE_MESSAGE创建管道,PIPE_READMODE_BYTE会更好吗?还有其他方法可以改善表现吗?
这是一个部署的解决方案,所以我不能简单地用套接字连接替换管道(我已经读过不建议在Windows上使用Windows命名管道,我想知道这是否为什么)。我对此事的任何帮助表示感谢。
答案 0 :(得分:2)
我们发现Named Pipes已经poor performance from Windows XP开始了。
我没有适合你的解决方案。但我同意命名管道从XP开始无用的概念。因为它,我们完全改变了我们的软件(在IPC方面)。
你的comms是否被分解成一个单独的DLL?也许您可以使用看起来相同但行为不同的接口替换DLL?
答案 1 :(得分:0)
我已经实现了一种解决方法,在写入管道之前引入了一个小的(~1ms)固定延迟来缓冲尽可能多的数据。通过RTT为200ms的网络链路,我可以在大约三分之一的时间内发送十倍的数据。
我在第一次连接时向下发送消息,因此客户端可以确定服务器支持的通信模式并相应地发送数据。
答案 2 :(得分:0)
我认为一些广域网优化设备能够提升性能,因为他们所做的一件事就是理解协议并减少他们的烦恼。鉴于许多WAN链路的延迟,仅此一项就可以提高吞吐量并减少超时。