ZeroMQ - 性能考虑

一般来说,性能考虑与应用程序和基于云的解决方案的成功一样重要。

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

以下是影响 ZeroMQ 性能的若干因素 −

  • 内存使用情况
  • 延迟
  • 吞吐量
  • 堆栈

让我们详细讨论上述因素 −

内存使用情况

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

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

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

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

延迟

延迟表示原因与结果之间的时间延迟,通常在通信系统或过程中。在计算和网络环境中,延迟测量数据从一个点传输到另一个点或系统响应操作所需的时间。

我们测量了 1 字节消息的延迟为 40 微秒,其中网络堆栈需要 25 微秒,而 ZeroMQ 需要 15 微秒。使用 10GbE,TCP 延迟为 15 微秒,我们预计延迟约为 30 微秒。我们还有一个解决方案,即绕过 OS 内核直接与硬件通信,旨在将延迟降低到 20 微秒以下。

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

吞吐量

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

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

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

堆栈

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

应用层

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

消息层

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

传输层

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

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

网络堆栈

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

硬件

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