ZeroMQ - 性能注意事项



总的来说,性能注意事项与应用程序和云解决方案的成功一样重要。

为了优化 ZeroMQ (ZMQ) 的性能,我们应该牢记几个要点。ZeroMQ 被认为是一个高性能的异步消息传递库,但我们必须同时考虑硬件和软件因素才能最大限度地利用它。

以下是一些影响ZeroMQ 性能的因素:

  • 内存使用
  • 延迟
  • 吞吐量

让我们详细讨论以上因素:

内存使用

ZeroMQ 被设计成尽可能轻量级,以便它甚至可以在内存有限的平台上运行。较低的内存占用量对于优化 L1i 缓存的使用也很重要。当代码大小足够小时,处理器可以将整个消息传递代码保存在 L1i 缓存中,并避免缓慢地访问物理内存以获取新的代码部分。

包含实际代码的库部分长度为 80kB,在 Linux 平台上共享库约为 350kB。尽管如此,许多代码都是内联的,因此它们作为内联函数放置在头文件中,而不是库中。

下表显示了 top 实用程序报告的内存使用情况:

应用程序 虚拟内存 驻留内存 驻留代码
发送方 24312kB 1360kB 12kB
接收方 24308kB 1360kB 8kB

延迟

延迟是指原因与其结果之间的时间延迟,通常在通信系统或过程中。在计算和网络的上下文中,延迟衡量数据从一点到另一点传输所需的时间,或系统对操作做出响应所需的时间。

对于 1 字节的消息,我们测量的延迟为 40 微秒,其中网络栈占用 25 微秒,ZeroMQ 占用 15 微秒。使用 TCP 延迟为 15 微秒的 10GbE,我们预计延迟约为 30 微秒。我们还有一种解决方案,可以绕过操作系统内核直接与硬件通信,旨在将延迟降低到 20 微秒以下。

低延迟:如果低延迟非常重要,则应使用 ZMQ_IMMEDIATE 套接字选项来防止任何缓冲。建议使用 in-proc(线程之间的内存内消息传递)或进程间通信套接字而不是 TCP,因为它们成本更低。

吞吐量

吞吐量是指 ZeroMQ 通过网络发送和接收消息的速率。这以每秒消息数 (mps) 或甚至每秒数据量 (mb/s) 来衡量。

吞吐量受以下因素影响,包括消息大小、套接字类型、网络带宽和系统性能。

  • 消息大小:较大的消息会降低每秒发送的消息速率,而较小的消息会提高它。
  • 套接字类型:套接字类型 push-pull 或 pub-sub 会影响消息的分配方式以及处理速度。
  • 批处理:批量发送消息可以减少开销并提高吞吐量。
  • 网络带宽:较高的带宽允许更多数据流过,从而提高吞吐量。
  • 系统资源:CPU、内存和线程利用率会影响消息的处理效率。

在 ZeroMQ 中,栈是指发送和接收消息所需的软件和组件层。整个栈,包括网络设备、网卡、处理器和操作系统,都会影响结果。它通常由以下部分组成:

应用层

这是应用程序代码使用其 API 与 ZeroMQ 交互的层。我们定义了如何在不同套接字(PUB-SUB、PUSH-PULL 等)之间发送和接收消息。

消息层

此层根据我们选择的套接字模式(例如 REQ-REP、PUB-SUB)管理消息排队、调度和路由。它处理消息缓冲、批处理和流量控制。

传输层

此层根据所选传输协议决定如何传递消息。以下是一些传输协议:

  • inproc:它是进程内通信(同一进程内的线程)。
  • ipc:它是进程间通信(同一台机器上的进程)。
  • tcp:用于通过 TCP 网络进行通信。
  • pgm/epgm:它是一种用于广播的多播传输协议。

网络栈

ZeroMQ 使用系统的网络层(如 TCP/IP),它处理诸如数据包传输、TCP 情况下的重传和拥塞控制等低级任务。

硬件

物理硬件(包括网络接口)驱动消息的实际传输和接收。

广告