c++ - 如何对多个Server-Client对使用ZeroMQ?

标签 c++ performance c++14 zeromq low-latency

我正在C++ 14中利用多线程实现性能很重的两方协议(protocol),并且当前正在将ZeroMQ用作网络层。

该应用程序具有以下简单架构:

  • 一个主服务器角色
  • 一个主要客户角色
  • 服务器和客户端均生成固定数目的线程n
  • 所有n并行并发线程对都执行一些性能和通信,但相互之间是互斥的,但互斥的协议(protocol)交换,即它们以n固定对运行,并且不应与成对的固定对手混合/交换任何数据。

  • 我当前的设计在Context()server上都使用单个ZeroMQ client -实例,该实例在所有n -local线程之间共享,并且每个client/server线程对都创建一个 ZMQ_PAIR 套接字(我只是增加端口号)在本地共享的上下文中进行交流。

    我的问题

    有没有更聪明或更有效的方法?

    即:是否有使用ROUTERSDEALERS的自然方法来提高性能?

    我对套接字编程没有太多的经验,而我的方法是直接通过n(许多客户端-服务器线程对)扩展套接字的数量。这可能会达到成千上万,但我不确定这是否是一个问题。

    我可以控制服务器和客户端计算机以及源代码,并且没有我需要担心的外部限制。我只关心性能。

    我已经浏览了所有的here模式,但是找不到与固定客户端-服务器对的情况相匹配的任何人,即我无法使用负载平衡等。

    最佳答案

    快乐的人!

    ZeroMQ是一个可爱且功能强大的工具,用于高度可扩展,开销低的形式化通信(行为,是的,模仿一些同伴的相互行为“一个问,另一个答复”等)模式

    您的模式非常简单,行为不受限制,并且ZMQ_PAIR可以很好地实现此目的。

    表现

    关于此属性的定量性质,应该有更多细节。

  • 进程间延迟 [us]
  • 被测系统(SuT)架构的内存占用量 [MB]
  • SuT可以处理的峰值数据流量 [MB/s]


  • 绩效提示(如果观察到的绩效数据定量支持)
  • 可以通过在实例化
  • 上增加Context( nIOthreads )来提高I/O性能
  • 可以通过硬映射各个thread#-> Context.IO-thread#来微调I/O性能,这对分布式工作负载都有帮助,并允许人将“单独的” localhost IOthread保持自由/可用于更高优先级的信令和其他人有这样的需求。
  • 应当设置特定于应用程序的 ToS -标记优先级的流量,以便允许在网络层上进行高级处理,并在clientserver之间添加路由段
  • 如果内存占用量受到影响(在操作系统内核级别,ZeroMQ不是TCP协议(protocol)处理上的零复制),则可以尝试迁移到ZeroMQ的妹妹上,该妹妹由Martin SUSTRIK共同创立ZeroMQ-兼容POSIX的 nanomsg ,具有相似的动机和有吸引力的性能指标。至少值得知道。

  • ROUTERDEALER是否可以提高整体性能?

    不,不能。考虑到您声明的体系结构(声明为大量通信),其他满足某些其他需求的甚至更复杂的可伸缩形式通信模式行为并没有增加任何性能优势,但是相反,这会花费您额外的处理开销而无法交付任何合理的改进。

    在您的正式沟通保持定义的同时,不需要其他的风吹草动。

    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/

    相关文章:

    c++ - 原始双类型比较的 GCC 问题

    python - 具有精确的移动距离和方向变化如何填充OpenCV透视变换矩阵(disparity-to-depth)?

    python - 有效地从列表中删除重复项

    c++ - 检查成员函数、自由函数和运算符是否存在的统一方式

    c++ - 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?

    c# - System.AccessViolationException 从 C# 调用 c++ 函数

    c++ - 为什么我的 libharu pdf 与 .png 图像过大?

    java - 在 for 循环中放置一个函数调用

    sql-server - 有关具有庞大数据集的数据库结构的建议

    c++ - 可变参数模板和多重继承的结合