问题

  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.

查看:

img

在上面的统计图表中,则可以直接看到 RabbitMQ 内部哪些进程消耗的CPU比较多,然后则可以进一步优化了。

原因

在线上的系统中,导致这CPU大波动的原因,是我们 DSP 系统中,使用了定时从队列中获取数据,然后进行批量处理导致的。

我们线上的业务逻辑是这样子的:

DSP 系统产生的竞价日志 -> RabbitMQ -> 消费者每分钟批量处理一轮队列消息(处理业务逻辑,然后再批量插入到DB。 主动 pull 消息,而不是监听)

不过,关于这一块,暂时还没有想好有更好的处理方式。因为我们是想批量处理日志到DB的,这样子可以大幅度提高DB的处理性能,不然一条一条地处理日志的话,还是很费时间的。

关于RabbitMQ批量处理的问题,有更好的处理方式,也欢迎告诉一下我 ^_^