我正在C++ 14中利用多线程实现性能很重的两方协议(protocol),并且当前正在将ZeroMQ用作网络层。
该应用程序具有以下简单架构:
n
n
并行并发线程对都执行一些性能和通信,但相互之间是互斥的,但互斥的协议(protocol)交换,即它们以n
固定对运行,并且不应与成对的固定对手混合/交换任何数据。 我当前的设计在
Context()
和server
上都使用单个ZeroMQ client
-实例,该实例在所有n
-local线程之间共享,并且每个client
/server
线程对都创建一个 ZMQ_PAIR
套接字(我只是增加端口号)在本地共享的上下文中进行交流。我的问题
有没有更聪明或更有效的方法?
即:是否有使用
ROUTERS
和DEALERS
的自然方法来提高性能?我对套接字编程没有太多的经验,而我的方法是直接通过
n
(许多客户端-服务器线程对)扩展套接字的数量。这可能会达到成千上万,但我不确定这是否是一个问题。我可以控制服务器和客户端计算机以及源代码,并且没有我需要担心的外部限制。我只关心性能。
我已经浏览了所有的here模式,但是找不到与固定客户端-服务器对的情况相匹配的任何人,即我无法使用负载平衡等。
最佳答案
快乐的人!
ZeroMQ是一个可爱且功能强大的工具,用于高度可扩展,开销低的形式化通信(行为,是的,模仿一些同伴的相互行为“一个问,另一个答复”等)模式。
您的模式非常简单,行为不受限制,并且ZMQ_PAIR
可以很好地实现此目的。
表现
关于此属性的定量性质,应该有更多细节。
[us]
[MB]
[MB/s]
绩效提示(如果观察到的绩效数据定量支持)
Context( nIOthreads )
来来提高I/O性能thread#
-> Context.IO-thread#
来微调I/O性能,这对分布式工作负载都有帮助,并允许人将“单独的” localhost IOthread
保持自由/可用于更高优先级的信令和其他人有这样的需求。 ToS
-标记优先级的流量,以便允许在网络层上进行高级处理,并在client
和server
之间添加路由段ROUTER
或DEALER
是否可以提高整体性能?不,不能。考虑到您声明的体系结构(声明为大量通信),其他满足某些其他需求的甚至更复杂的可伸缩形式通信模式行为并没有增加任何性能优势,但是相反,这会花费您额外的处理开销而无法交付任何合理的改进。
在您的正式沟通保持定义的同时,不需要其他的风吹草动。
在
ZMQ_PAIR
原型(prototype)上可能要注意一点,一些资料来源称这是一种实验原型(prototype)。如果您的直觉感觉不能使您满意,除了SuT测试的观察结果之外,您还乐于接受这一点,则不介意进行重新设计的步骤,这将使您拥有不受 pre 约束的正式交流的所有自由模式行为,但在引擎盖下具有“非”实验管道-只需将一对ZMQ_PAIR
替换为一对 ZMQ_PUSH + ZMQ_PULL
,并仅使用单程票即可使用消息。声明了对 SuT
-设计和实现的完全控制,这一切都在您的能力范围内。我能走多快?
针对零流量路径段上的未加载网络传输的ZeroMQ或nanomsg性能/延迟包络,已经发布了一些基准测试记录(肯定)。
如果您的
SuT
设计努力达到更快的速度-例如在 800 ns端对端下,还有其他方法可以实现这一目标,但是您的设计将必须遵循其他分布式计算策略,而不是基于消息的数据。交换,并且您的项目预算将不得不针对必要的超低延迟硬件基础结构调整额外支出。这可能会令人惊讶,但对于系统来说绝对可行,并且非常吸引人,其中数百纳秒是托管数据中心内的必备目标。
关于c++ - 如何对多个Server-Client对使用ZeroMQ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37519662/