businessworker突然全掉了,重启半小时后又全部掉了

dou号

1.平时晚上10点左右业务量都比较低了,但是昨天晚上BusinessWorker进程突然全没了,查看log日志,发现只有昨天凌晨时候有一次错误4,可能是有链接连接到register上了,但晚上10点左右日志并没有记录下来任何东西,应该不是这个错误吧。但保险起见,还是把注册地址改成127.0.0.1了($register = new Register('text://127.0.0.1:xxxx');)。在重启gatewayworker的过程日志记录了错误,stop的时候显示stopping。。。见左下图。然后出现worker exit unexpected;can not connect to tcp://127.0.0.1:xxxx Connection refused in workerman/gateway-worker/src/Lib/Gateway.php:725;exit with status 64000三个错误,重启成功后,businessworker恢复正常,但是半个小时后,BusinessWorker进程又全部没了,不知道为什么。查看阿里云监控发现在两次businessworker全掉的时候cpu,进程数和负载都大幅上涨,是因为businessworker掉线造成的吗?

2.第二次重启时怀疑是进程数不够,于是增加了businessworker数量,由40增加到50,我的cpu内核是2核。与此同时我发现我的nonestablished连接数达到了22000左右,发现原来因为遇到一些问题把net.ipv4.tcp_max_tw_buckets参数改成22000了,于是又把这个参数改成了20000。这次重启后系统没有出现businessworker掉的情况。
 
3.出现businessworker掉线的时候,发现所有设备连接都是通信超时而不是断开连接。
 
4.GatewayWorker重启后,TCP活跃连接数每35分钟会稍微波动一下,我们设备是35分钟会自动发送一条登录信息过来,短时大量的消息过来,会造成TCP活跃数波动吗?见右下图

2880 3 0
3个回答

walkor

1、你应该是用了较老的GatewayWorker,老版本status看不到BusinessWorker进程并不是BusinessWorker没了,一般是由于业务代码长时间阻塞导致php start.php status没响应了。通过ps auxf命令能看到BusinessWorker进程还在。 新版本GatewayWorker如果BusinessWorker进程没响应status时仍然可以看到进程,但是状态会是busy。
 
停止的时候有报错可以忽略,因为有些进程正在处理业务,gateway和BusinessWorker之间通讯终端导致一些报错,属于正常情况。
 
2、业务代码执行了一些Gateway::xxx接口时,businessWorker会向Gateway进程发起一些短连接请求,所以会有nonestablished连接,一般都是TIME_WAIT连接,数量不高于net.ipv4.tcp_max_tw_buckets设定的值都属于正常现象,net.ipv4.tcp_max_tw_buckets最好不要超过30000。
 
3、通讯超时应该是由于BusinessWorker进程不响应导致的
 
4、这个具体看业务,比如这时大量请求发来后业务代码处理过程中可能会发起mysql redis http等查询调用,可能会建立mysql redis等新的tcp连接。比如登录信息发来后业务判断登录失败或超时断开连接都有可能造成波动都是正常的。
 
BusinessWorker进程不响应可以通过这里定位 http://doc.workerman.net/debug/busy-process.html
status里消失但是ps auxf能看到的BusinessWorker进程就是busy进程。

  • dou号 2019-09-03

    谢谢worker解答,但还是有几个问题没弄明白。
    1.请问需要将gatewayworker尽快换成新版的吗?我刚刚去workerman官网下了一份,日期显示是2019/08/30
    2.我的cpu内核是2核,gateway进程数设置为6,businessworker为50,会不会有点高影响性能?
    3.我阿里云上面non_established连接数是20000左右,established连接数一万二,我需要根据established连接数调整net.ipv4.tcp_max_tw_buckets的大小吗?

  • walkor 2019-09-03

    1、不更新也行
    2、有机会把gateway进程数设置为2,gateway进程不要高于cpu数。businessworker进程数50也没什么问题
    3、不需要

    一万多在线连接注意一定要安装event扩展,并按照手册http://doc.workerman.net/appendices/kernel-optimization.html 优化好linux内核

    2个cpu支撑1万多连接数,如果服务重启造成客户端断开重连,可能会导致businessWorker瞬间处理大量请求。2个cpu有可能处理不过来,会出现cpu和负载爆高的情况,从而导致businessWorker短时间内无法响应status,看起来就像businessWorker消失了一样。可以考虑给服务器加些cpu,或者再加一台服务器做分布式部署。

  • dou号 2019-09-03

    @1:
    1.如果把gateway进程数设置为2,我的businessworker进程数是否需要相应增加?
    2.刚刚系统又出现了cpu,负载和tcp连接数爆高的情况,是系统正常运行时突然爆高,期间并没有重启服务器,我用您发我的指令查看了一下businessworker进程,如图所示,然后查找了其中一个pid,因为急着恢复系统,所有也就没有做后续操作,直接重启了gatewayworker。按照您发我的那份文档,应该是系统在不断循环系统调用,手册上说‘例如上面经过定位应该是业务在调用curl,而对应的url长时间没有返回数据,导致进程一直等待。这时候可以找url提供者定位url返回慢的原因,同时应该在curl调用的时候加上超时参数,比如2秒没返回就超时,避免长时间阻塞卡死(这样进程可能会出现2秒左右的busy状态’,这个里面的超时参数在哪里修改,跟Socket连接的超时设置相关吗?还是我程序中所有设置curl_init()的地方都加上超时判断就可以了?
    3.目前正常情况下我们2核CPU的使用率在33%左右,还有很多剩余,需要给服务器加CPU吗?

  • walkor 2019-09-03

    1、已经够多了,应该不用设置了
    2、这个不好定位,有可能是业务阻塞然后导致请求无法响应,大量设备断线重连导致大量请求发了过来
    3、2个cpu处理1万多连接的数据感觉太少了,要加配置

  • dou号 2019-09-04

    @1:
    1.昨晚我将gateway进程改到2后,重启之后非活跃连接数呈锯齿状,一直到今天上午活跃连接数上升之后,才趋于稳定。这样正常吗?因为回复里不能发图,所以图我发评论里了
    2.您说2个cpu处理1万多连接的数据感觉太少了,要加配置。那么增加CPU后,比如到4核,会降低内存的使用率吗?因为现在我们的系统内存消耗很厉害,已经80%了,本来是想加内存的。

  • walkor 2019-09-04

    1、正常
    2、cpu不影响内存占用,内存不够也要加

  • dou号 2019-09-04

    @1:好的,谢谢Walkor解答,感谢

dou号

 

  • 暂无评论
dou号

非活跃数图

  • 暂无评论
年代过于久远,无法发表回答
🔝