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 情况下的重传和拥塞控制。
硬件
包括网络接口在内的物理硬件驱动消息的实际传输和接收。