IPC利器,ZMQ性能分析

IPC利器,ZMQ性能分析

背景

最近一段时间都在做方案设计,有一模块会使用开源组件,根据有关同事经验,开源组件在某些场景下会出现coredump,考虑到这种不稳定性因素、以及后续不同组件版本符号之间的冲突,要把影响降到最低。选择采用多进程方案来实现,就需要使用到IPC技术。

进程间通信方式

努力回想操作系统教材上进程间通讯方式的概念,常见的IPC方式包括,管道、消息队列、共享内存、本地socket,而业界比较知名的可用于进程间通信的组件有ZMQ,也得到同事们的一致推崇。而我们的场景下,进程间共享的数据最大为32MB

ZeroMQ介绍

ZeroMQ是一种基于消息队列的多线程底层网络库,支持线程间,进程间、机器间的消息通讯,提供线程安全的同步接口。 在socket API之上做了一层封装,将网络通讯、进程通讯和线程通讯抽象为统一的API接口。 在各个领域得到广泛使用。

ZeroMQ 支持请求-应答模式、发布-订阅模式、分布式处理模式

从原理上看,它是基于socket 实现的,对于本机进程之间的通讯采用unix domain socket来完成进程之间通信,走loopback接口,没有网卡限制也不会耗CPU中断,不占用端口,只会在本地创建一个IPC文件。从原理上,ZMQ的共享速度也挺快的。

ZeroMQ与RPC性能对比

我们的模块是基于RPC开发的,RPC也可以实现本机不同进程之间的通讯,底层上也是基于socket 实现的,ZeroMQ与RPC相比有没有优势呢?测试参考代码

共享数据大小ZeroMQRPC
156KB18us57us
1MB110us330us
10MB1250us3470us
20MB3400us8040us
100MB64000us43810us
  • 从测试数据来看,在共享20MB以内ZeroMQ的速度要快于RPC,实际测试超过35MB以后,ZeroMQ的速度会明显下降,推测与缓存buffer配置大小有关系。
  • 对于平均大小在156kb的数据,使用ZeroMQ共享给其它进程只需要 18us左右,基本可以接受。
  • ZeroMQ功能更加齐全、使用方式简单、支持分布式处理模式,扩展性强,与共享内存相比多一次数据拷贝的时间

使用场景

我们的场景是,单个分发进程、多个处理进程,同类型的处理进程可能会有多个。对于同类型进程处理的请求,可以简化成单生产者多消费者模型,多个处理进程竞争消费处理请求。

如果使用ZeroMQ,可以利用ZeroMQ提供的并行处理模式,支持这种分布式消费模型,但这种模式只支持单项消息,需要建立2个通道,任务分发通道、处理结果上报通道。

使用结论

  • 对于共享数据在30MB以内,共享数据时效性较低的场景,可以利用ZeroMQ的几种模式实现大多数功能。
  • ZeroMQ的使用方式简单、支持多种模式,非常适合分布式消息共享,但是它内部没有队列,不支持任务缓存、削峰填谷,具体使用上需要和场景结合。

发表评论

邮箱地址不会被公开。 必填项已用*标注