【发布时间】:2011-12-20 20:58:12
【问题描述】:
我有一个两节点系统,我试图在节点之间复制内存中的状态...为了简化,只需考虑主从(主动-被动)。节点 A 有一个相对恒定的变化流进入,然后尝试将状态推送到节点 B。目前,这是通过批处理状态并使用 TcpClient 实例推送它来定期发生的。
当前的 TcpClient 进程似乎有些低效。这是一种我可以在两个系统之间建立链接并在建立通道时从一个系统流式传输到下一个系统的方法吗?
出于性能原因,我不能使用 WCF 或 Remoting 之类的东西...我对较低级别的网络结构相对缺乏经验,但我非常愿意尝试任何新的东西。理想情况下,我可以使用本机 C# 4 完成解决方案,并且不需要任何新产品。
【问题讨论】:
-
从您的描述中不清楚是什么问题。如果 TCP 效率不高,您是如何衡量的?您的要求是什么?
-
如果您的编码正确,TCP 应该能够以您的线路可以处理的最快速度推送数据。 TCP 可能遇到的一个问题是对丢包的积极回退,但这不应该是 Intranet 的问题。
-
@Zepplock 对不起......这是我缺乏经验的表现。我并不是说“TCP”效率低下。我的意思是说 TcpClient 进程似乎效率低下。例如,在发送方,我不断为每次传输新建一个新的客户端实例。我认为有一种方法可以建立链接,然后继续使用它更长的时间。是不是更清楚了?
-
@JoeGeeky:我会在同步期间检查您的链接饱和度。我认为数据量对于您的链接来说可能太大了。根据您的应用程序,您可能有很多状态,并且对于您使用的任何 NIC 来说都太多了。我很好奇的事情清单:#1) 状态传输期间的 NIC 利用率 #2) 传输的总数据 #3) 链接速度。我们需要找到瓶颈在哪里。 TCP应该不是问题。这是您将获得的最佳性能,并在服务器/工作站硬件上进行了高度硬件加速。
-
@JoeGeeky:我错误地使用了“异步”这个词。我的意思是缓冲/排队状态更改并立即推送它们,这似乎是您在上一条评论中所说的。通常,“批处理”涉及等待一定数量的数据或经过一段时间。虽然您仍然希望您的更改是原子的并且需要对某些状态进行批处理/分组,但您不希望对状态组进行批处理。我会使用带有队列的生产者消费者模式,该队列会立即推送原子状态组。如果可以,请保持连接打开。最后一个问题。推送之间的时间间隔是多少?
标签: c# performance tcp replication tcpclient