gatewayWorker重启后bussinessworker起不来

dou号

我重启了gatewayworker,刚开始进程都起来了,但很快,也就几秒钟,使用status指令查看进程,发现bussinessworker进程只剩几个,再执行status指令,bussinessworker进程已经没有了,此时workerman日志文件里面没有报错信息,使用debug模式运行时并没有错误信息提示,但是当执行指令停止gatewayworker时,workerman日志就开始疯狂抛出错误,如下图。之前也出现过这种情况,当时不断调整geteway数和bussiness进程数,不断重启,都没啥效果,直到半夜设备量掉了下来,应该是部分设备掉电了,这个时候进程才开始恢复正常,然后白天设备都上电了也没有什么问题。关于events部署一开始就已经做了,然后查看端口,发现有大量的timewait

截图报错信息里报错文件相关代码

截图

200 2 1
2个回答

walkor

我们有个几万设备在线的物联网业务会出现你这种情况。

原因
物联网项目轻易不要重启gateway进程,这样会导致所有设备断开重连并重新登录,相当于所有设备同时对你的服务器发起CC攻击。
如果设备较多并且BusinessWorker处理速度不够快,就会导致请求积压,在此过程中设备因为服务端没及时响应可能会重新发起连接登录请求导致请求进一步积压,因为请求是排队处理的,此时bussinessworker一直处理过期的请求,导致恶性循环。

解决办法
1、检查断线重连过程中服务端耗时业务并优化,让其足够快
2、增加BusinessWorker进程数量,例如cpu的4-8倍甚至更多
3、设备超时登录最好设置时间间隔长一些,例如60秒
4、分布式部署,BusinessWorker单独部署出去。发生突发情况可以临时增加BusinessWorker进程或者服务器增加服务处理能力,等高峰过后回收。

如果不幸重启了gateway进程
如果不幸重启了gateway进程,可以每隔10秒左右执行一次php start.php reload,目的是上BusinessWorker平滑重启,这样可以将积压的过时请求清理掉,让BusinessWorker只处理最新的有处理价值的请求。

status businessWorker进程消失
关于 php start.php status businessWorker进程消失是因为workerman版本太低了,没有将busy进程展示出来,进程实际还是存在的,只是没展示出来,要展示需要升级workerman。从侧面来说也是因为有慢业务(耗时业务超过1秒,也可能是高并发导致数据库等性能下降)需要优化。服务端最好判断下每个请求的处理时间,并将超过0.5秒的耗时请求记录下来并优化。

stop 报错
stop的时候有报错可以忽略,因为有些进程退出了通讯失败导致。

timewait
timewait 是正常的socket状态,一般timewait的socket总数不超过2万不用处理。

  • dou号 2024-09-06

    1、我有一个系统,六万多设备,重启gateway进程没有出现这种情况,很快就稳定了,这个出现问题的系统设备不到两万,重启后,tcp一直波动,尖峰才能达到正常水准,两个系统的差别是六万多的是一台设备一个网卡,不到两万的一个网关托八台设备,设备总数不到两万;
    2、增加GatewayWorker进程数量是指分别增加gateway和bussinessworker进程是吗
    3、设备超时登录是指心跳吗?

  • walkor 2024-09-06

    是增加bussinessworker进程数量,写错了,已经改正。
    设备超时登录不是指心跳,是指设备发起连接后发送设备信息进行登录的操作,有些开发者可能会在设备端增加一个超时逻辑,例如设备登录请求发出后多久没有响应则断开重连重新发出登录请求,我不熟悉你们业务,不确定你们设备有没有。

  • dou号 2024-09-06

    昨晚我们是通过增加gateway数量稳定了设备

  • walkor 2024-09-06

    如果是 gateway数量稳定了设备,可能是没安装event扩展或者linux内核没优化好

  • dou号 2024-09-06

    好的,谢谢,我这边再排查一下

释永战

请参考优化Linux内核部分

  • 暂无评论
×
🔝