- ZeroMQ 教程
- ZeroMQ - 首页
- ZeroMQ - 概述
- ZeroMQ - 安装
- ZeroMQ - 特性
- ZeroMQ 消息传递
- ZeroMQ - 套接字类型
- ZeroMQ - 通信模式
- ZeroMQ - 传输协议
- ZeroMQ - 消息帧
- 扩展性和性能
- ZeroMQ - 负载均衡
- ZeroMQ - SMP
- ZeroMQ - 多线程
- ZeroMQ - 性能注意事项
- ZeroMQ 有用资源
- ZeroMQ - 有用资源
- ZeroMQ - 讨论
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 情况下的重传和拥塞控制等低级任务。
硬件
物理硬件(包括网络接口)驱动消息的实际传输和接收。