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解决此问题。