物联网・盛世宏博・动环压力测试、TCP长连接、采集网关、性能瓶颈定位
关键词:Modbus TCP采集网关、RJ45温湿度变送器、大批量TCP并发、文件句柄、连接池、调度器、网络栈、动环压测、机房微环境监控、统一接入层 标签:IoT采集引擎开发、网关性能调优、TCP长连接瓶颈、Modbus轮询压测、资源监控、故障复现、动环稳定性测试

前面系列文章覆盖了传感器选型、协议、TCP/UDP采集模式、VLAN组网规划。当项目测点规模从小几十台扩展到几百、上千台以太网温湿度变送器时,哪怕单台传感器响应正常、交换机VLAN配置规范,采集网关/统一接入引擎依然会出现采集超时、数据断层、告警延迟、部分设备随机离线。很多开发和集成人员遇到这类问题,直接归因为“传感器质量差”或者“交换机不稳定”,反复排查网络,却忽略采集网关本身的软件瓶颈。
本文面向动环开发、测试工程师,围绕Modbus TCP长连接批量采集以太网温湿度变送器场景,给出一套可落地的压力测试方案、瓶颈识别维度、定位手段、典型根因和调优方向,适配自研采集网关、统一接入层服务,同时和前面TCP轮询架构、组网规范配套。
业务前提说明: 被测对象:采集网关(采集引擎)作为TCP客户端,向外建立大量TCP长连接,对远端RJ45温湿度变送器(Modbus TCP Slave)周期性下发读寄存器请求; 业务模型:短请求短应答小包,单次Modbus请求报文几十字节,轮询周期一般3~10秒; 压测目标:复现大批量并发场景下的偶发超时、连接泄漏、调度堆积,定位CPU、IO、网络、锁、调度器瓶颈。 排除范围:UDP推送、SNMP Trap不在本次TCP连接压力测试模型内,但压测结论可以作为混合采集架构的基线参考。
很多人第一反应:瓶颈就是TCP句柄数量上限。文件句柄只是最表层的门槛,真实瓶颈分层分布,并且经常是组合出现:
一个高频误区:认为只要调高ulimit,就能无限拉起TCP长连接。ulimit只是通行证,调度、锁、内核网络参数、业务阻塞都会在句柄没打满之前提前触发瓶颈。
在测试服务器上启动仿真程序,模拟成百上千个Modbus TCP从站,每个从站独立IP(多虚拟网卡、IP别名),模拟温湿度寄存器、故障状态寄存器,模拟固定RTT、随机超时、随机丢包。 优点:低成本快速扩测点、可以注入网络抖动、丢包、延迟,稳定复现偶发问题; 注意:仿真程序本身不能成为瓶颈,仿真服务和采集网关分开部署在不同服务器。
指标 | 说明 | 合格参考基线(温湿度采集场景) |
|---|---|---|
并发TCP连接数 | 网关建立的有效长连接数量,等于在线传感器数量 | 按项目规模,如500、1000、2000测点 |
采集成功率 | 成功收到应答的请求 / 总下发请求 | ≥99.5%,核心机房≥99.9% |
采集RTT | 从下发Modbus请求到收到应答耗时 | P95 < 200ms |
任务堆积数量 | 调度队列中等待下发的任务数 | 稳定运行时堆积接近0,尖峰不持续上涨 |
连接泄漏数 | 已经判定离线、但没有正常关闭的TCP套接字 | 0,长时间运行不持续上涨 |
CPU使用率 | 网关进程CPU占比 | 稳态≤70%,尖峰≤85% |
内存占用 | 进程内存 | 缓慢持续上涨代表内存泄漏,属于严重缺陷 |
句柄数量 | 进程打开fd数量 | 低于ulimit限制80%,预留冗余 |
现象:增加连接到某个数量后,新设备无法建立TCP连接,日志报 too many open files;已经建立的连接采集正常。 排查:
# 查看进程当前fd数量
ls /proc/<pid>/fd | wc -l
# 查看进程ulimit软限制
cat /proc/<pid>/limits根因:进程软文件句柄上限不足。 调优:修改 /etc/security/limits.conf,nofile软硬限制调高;同时注意系统全局内核参数 fs.file-max。
风险提醒:只调ulimit不做连接回收逻辑,只是把故障后移,不能解决代码层面的连接泄漏。
现象:句柄数还远没有到上限,新建连接失败,报错 cannot assign requested address。 原理:采集网关是TCP客户端,每一条向外发起的连接占用本机一个源端口;大量短连接或者频繁重连场景,大量套接字进入TIME_WAIT,端口被占用。 排查:
ss -s重点看TIME_WAIT统计持续堆积。 调优方向:
net.ipv4.tcp_tw_reuse = 1;现象:fd充足、CPU不打满,但是P95 RTT持续走高,任务堆积不断上涨;加压后成功率缓慢下降,没有直接报错。 典型根因:
现象:加压瞬间大量采集请求同一时刻发出,交换机端口瞬时报文冲击,大量Modbus请求超时;成功率周期性抖动。 根因:所有设备轮询任务定时器对齐,同一时间点批量下发请求,瞬间流量尖峰。 这是动环采集网关非常经典的坑,和前面UDP上报风暴属于同类逻辑,只是载体变成TCP Modbus请求。 定位:打印每个请求下发时间戳,看请求时间是否高度集中;抓包看502端口报文流量周期性脉冲。 解决方案:设备上线时给轮询相位增加随机偏移,错峰调度;调度器增加令牌桶限流,控制单位时间最大下发请求量。
现象:采集下发逻辑很快,但是采集回调之后,写入时序数据库、推送MQ、告警判断逻辑阻塞协程/线程,挤占采集调度资源。 很多网关把【Modbus收发】和【入库、告警计算】放在同一个协程/线程内,数据库慢查询、消息队列阻塞会反向阻塞整个采集链路,造成后续请求延迟堆积。 定位:埋点打点,拆分耗时:报文下发耗时、应答解析耗时、后处理入库耗时。 调优:采集收发链路和存储/告警链路解耦,使用环形队列异步投递数据,采集协程只负责收发Modbus和状态维护,不做阻塞IO。
现象:稳态跑几个小时后,fd数量缓慢持续上涨,采集成功率逐步下降,重启网关恢复;短时间压测看不出来,必须长时间老化压测。 根因:设备断开之后,TCP套接字没有正常Close;异常分支、超时分支、重连分支缺少连接关闭释放逻辑,fd慢慢泄漏。 定位:定时统计fd数量,对比在线设备数量;fd增长速度大于在线设备增长速度,就是泄漏。 压测扰动手段:反复拔插网线、批量断连,加速复现泄漏分支。
现象:CPU内核态(sy)占比很高,用户态很低;抓包看到报文已经到达网卡,但是网关程序接收延迟。 根因:网卡中断队列过少、中断绑定不合理,小包密集场景中断风暴;或者epoll的max_events设置过小,一次epoll_wait拿到的事件太少,轮询空转。 排查:top 看sy占比;cat /proc/interrupts 查看网卡中断分布; 调优:网卡中断亲和性、增大epoll事件数组,合理调整 net.core.somaxconn。
压测时需要持续采集这一组数据,形成时序对照,方便定位因果关系:
重要排查技巧:当指标同步突变,找先上涨的那一项,就是根因。例如:先出现调度队列堆积,然后RTT上涨,最后超时变多 → 瓶颈在调度/锁;先出现TIME_WAIT暴涨,再出现新建连接失败 → 端口资源瓶颈。
这套压测定位体系,服务于前面的统一接入层架构: 统一接入层作为采集网关,同时兼容Modbus TCP、SNMP驱动,TCP长连接是主力采集链路。压力测试的结论,用来确定接入层单实例承载上限:例如压测得出单实例稳定承载800台温湿度变送器,那么超过规模就要做接入层集群分片部署,而不是单实例无限堆测点。 压测同时可以验证和组网方案的配合:在VLAN隔离、端口隔离的标准组网下,网关的极限承载能力;如果在压测中交换机先出现转发瓶颈,则需要调整接入交换机的测点上限,单台POE交换机不要挂载过多变送器。
大批量TCP采集网关的性能瓶颈,很少是单一“句柄不够”这么简单。大部分现场疑难问题,来自调度对齐风暴、全局锁、IO阻塞、连接泄漏这类软件逻辑缺陷,这类缺陷在少量测点时完全隐藏,只有在阶梯加压+长时间老化+网络扰动的压力测试下才会暴露。 标准化压测思路:先基线、阶梯加压、稳态老化、注入扰动;分层观测系统内核、进程运行时、业务调度、下游IO、网络指标,找到最先发生异常的指标,定位瓶颈。 在网关开发和项目验收阶段,提前完成这套压测,能够避免上线后在机房大批量测点场景下出现随机超时、数据断层,保障机柜微环境、档案库房温湿度采集链路稳定。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。