RabbitMQ 高负载CPU排查
Contents
问题
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16285 user 20 0 6188812 1.465g 5992 S 197.7 9.3 4418:21 beam.smp
线上的 DSP 系统要用到 RabbitMQ 作为进程间消息通信的中间件,但是发现它的CPU使用率时很高,时而又比较低(60%~230%之间波动)
排查方法
最直接的是使用 top 命令,这样子可以看到 beam.smp 进程总体的 CPU 使用率
然后,要细分到 RabbitMQ 里的哪些进程要花费高CPU,则可以直接使用 RabbitMQ 自带的插件: rabbitmq_top
$./sbin/rabbitmq-plugins list
Configured: E = explicitly enabled; e = implicitly enabled
| Status: * = running on rabbit@iZ2ze5o5txbjcf4ecbmhunZ
|/
[e*] amqp_client 3.6.9
[e*] cowboy 1.0.4
[e*] cowlib 1.0.2
[ ] rabbitmq_amqp1_0 3.6.9
[ ] rabbitmq_auth_backend_ldap 3.6.9
[ ] rabbitmq_auth_mechanism_ssl 3.6.9
[ ] rabbitmq_consistent_hash_exchange 3.6.9
[ ] rabbitmq_event_exchange 3.6.9
[ ] rabbitmq_federation 3.6.9
[ ] rabbitmq_federation_management 3.6.9
[ ] rabbitmq_jms_topic_exchange 3.6.9
[E*] rabbitmq_management 3.6.9
[e*] rabbitmq_management_agent 3.6.9
[ ] rabbitmq_management_visualiser 3.6.9
[ ] rabbitmq_mqtt 3.6.9
[ ] rabbitmq_recent_history_exchange 3.6.9
[ ] rabbitmq_sharding 3.6.9
[ ] rabbitmq_shovel 3.6.9
[ ] rabbitmq_shovel_management 3.6.9
[ ] rabbitmq_stomp 3.6.9
[E*] rabbitmq_top 3.6.9
[ ] rabbitmq_tracing 3.6.9
[ ] rabbitmq_trust_store 3.6.9
[e*] rabbitmq_web_dispatch 3.6.9
[ ] rabbitmq_web_mqtt 3.6.9
[ ] rabbitmq_web_mqtt_examples 3.6.9
[ ] rabbitmq_web_stomp 3.6.9
[ ] rabbitmq_web_stomp_examples 3.6.9
[ ] sockjs 0.3.4
启用 rabbitmq_top 插件:
$./sbin/rabbitmq-plugins enable rabbitmq_top
The following plugins have been enabled:
rabbitmq_top
Applying plugin configuration to rabbit@iZ2ze5o5txbjcf4ecbmhunZ... started 1 plugin.
查看:
在上面的统计图表中,则可以直接看到 RabbitMQ 内部哪些进程消耗的CPU比较多,然后则可以进一步优化了。
原因
在线上的系统中,导致这CPU大波动的原因,是我们 DSP 系统中,使用了定时从队列中获取数据,然后进行批量处理导致的。
我们线上的业务逻辑是这样子的:
DSP 系统产生的竞价日志 -> RabbitMQ -> 消费者每分钟批量处理一轮队列消息(处理业务逻辑,然后再批量插入到DB。 主动 pull 消息,而不是监听)
不过,关于这一块,暂时还没有想好有更好的处理方式。因为我们是想批量处理日志到DB的,这样子可以大幅度提高DB的处理性能,不然一条一条地处理日志的话,还是很费时间的。
关于RabbitMQ批量处理的问题,有更好的处理方式,也欢迎告诉一下我 ^_^