mosquitto连接broker失败cpu占用100%问题调查

在上一个问题解决得同时,测试中发现存在cpu 100%得情况。mosquitto版本1.6.10。

具体复现方式,配置证书以ssl的方式连接broker。启动后程序连接broker失败,同时看到cpu占用100%。

打印堆栈信息发现,问题出现在mosquitto的mosquitto_loop中(mosquitto_loop_start会启动mosquitto_loop线程)。

mosquitto_loop的主要内容就是状态的切换与socket的读写操作,是客户端保持连接的核心逻辑。

在客户端tls连接时,

fdcount = pselect(maxfd+1, &readfds, &writefds, NULL, &local_timeout, NULL);
会直接读到0,不会阻塞,然后进入mosquitto_loop_read函数处理。

接下来会走到net__socket_connect_tls:

在net__socket_connect_tls中,SSL_connect失败返回的err信息是SSL_ERROR_SYSCALL,系统会返回MOSQ_ERR_SUCCESS。进入下一次循环:

 而这个过程中是没有停顿或者阻塞的,所以导致cpu直接100%了。

由于这块逻辑牵涉比较多,不熟悉的情况下修改可能会产生问题。在尝试2.0.15版本的mosquitto后,发现不存在此问题,查看它的源码,发现这里简单粗暴进入net__socket_connect_tls的逻辑已经被修改了。

最终通过更新版本到2.0.15解决此问题。

posted @ 2024-06-25 14:19  _zxq  阅读(22)  评论(0编辑  收藏  举报