背景
最近在测试一个MQTT的server,使用MQTT的client去连接server的时候,发现每次到1020个连接数左右的时候MQTTserver就挂了,而且MQTTserver只打印了一个退出的日志,没有打印其他信息。
问题定位
1)最开始我以为是该MQTT服务的日志没有打印全,于是尝试开启debug模式。打开debug开关后,仍旧没有更多的日志打印出来。
2)我怀疑是系统的文件描述符的限制:ulimit -a 查看打开的文件描述符的限制:远超过1000,看来也不是系统的文件描述符的限制问题。
3)由于该MQTT服务是systemd管理的,我尝试手动运行该MQTTserver,然后重新使用客户端连接,发现MQTTServer连接超过1000后也没有挂掉,于是我怀疑是systemd对进程有相关限制。
经过网上搜索,发现了一些蛛丝马迹,原来systemd管理的进程的日志并不会输出到该MQTTserver中,而是会刷新到另外的日志中,使用journalctl可以查看对应的日志。
输入:journalctl -u xxx.service --since today
看到了该MQTTserver打印的额外日志:
该服务由于打开文件描述符过多,而被systemd给kill了
输入:systemctl show xxx | grep -i limit
可以看到LimitNOFILE和LimitNPROC这两项配置太小,需要重新设置。
修改systemd的管理文件,加上红框中的配置:
LimitNOFILE=88888
LimitNPROC=88888
重新加载配置: systemctl daemon-reload ,然后再次查看限制
此时服务的文件描述符限制打开了,而且使用Mqttclient去连接该Mqttserver也不会到1000多报错退出了。
博主:测试生财
座右铭:专注测试与自动化,致力提高研发效能;通过测试精进完成原始积累,通过读书理财奔向财务自由。
csdn:https://blog.csdn.net/ccgshigao