gateway到businessworker丢包,原因已知,求解决思路

dangpengsong

业务逻辑:
多个探头通过柜子和服务器连接并通讯,一个柜子对应一个tcp链接,上线时初始化数据把索要数据的命令存在session里面,然后第一次调用函数后,会进入调用闭环一直同步数据
测试情况:
gateway和businessworker都开一个进程,python模拟20个柜子,每个柜子下10个探头(传感器),每轮同步间隔为15秒,每个探头同步间隔为1.5秒,模拟测试5分钟,会出现失败情况,用tcpdump抓包对比,发现柜子发送给gateway接收没问题,但是gateway到businessworker出现丢包,查看状态为busy
问题及分析:
负载和预期相差甚远,之前的预期是一个进程起码保证1000台柜子100%成功率的数据同步,开10个进程负担差不多10000台柜子[实际可能不是这样简单的数学计算,大概思路这样],但目前相差甚远,才20台柜子,5分钟成功率就开始掉了
已采取的优化措施:
1,因为业务负担比较重,之前剥离过业务逻辑部分,效果很差,等于把压力集中到一个地方,直接就压垮了,完全没法儿用,现在放回主进程了,后期多开进程,大家平均负担[业务剥离,试过,否定]
2,目前注释掉了触发报警和报警恢复相关的数据库全部操作
3,redis限制了0.5秒上线一个柜子,避免扎堆上线
4,给每轮定时器及每个探头的定时器增加一个随机因素,避免全部一样的参数产生类似军队齐踏步一样的压力峰值
5,重试,单个探头如失败有3次重试机会,失败则跳过

目前已经做了上述工作,在定时器调用方面,写了三个版本,分别是
1,一次生成全部定时器[不是一次性的],没有周期定时器,控制好时间差,等于一个探头一个定时器
2,只生成周期定时器[不是一次性的],触发后循环生成探头定时器[一次性]
3,生成周期定时器[一次性的],触发后循环生成探头定时器[一次性],一个执行完调用下一个,形成调用闭环,类似递归
经测试第三个思路目前表现最好,可只是这样,求各路大神指点下思路,还有哪些地方,我可以尝试解决负载问题

截图


截图

阅读 437
3个回答

walkor

“会进入死循环一直同步数据”

业务代码里不要有死循环

  • dangpengsong 2021-10-25

    抱歉,描述不太准确,应该是调用闭环,即一个定时器执行完调起下一个

  • dangpengsong 2021-10-25

    定时器之间都有间隔不是连续的

  • walkor 2021-10-25

    http://doc.workerman.net/debug/busy-process.html 按照这个教程,看下业务卡在哪里

  • dangpengsong 2021-10-25

    问题已解决,在老大walkor的指导下,定位到问题出在写文件那里,因为用了阿里云时序数据库influxDB,为了效率是以文本形式批量定时提交的,因为很多柜子探头的情况下频繁的写操作会出现IO阻塞导致busy状态,进而导致gateway到businessworker的丢包问题,注释该部分代码达到预期效果,感谢

dangpengsong

问题已解决

  • 暂无评论
adminv

方便加个好友吗?我也在研究这块。MODBUS

  • 暂无评论