Locust持续运行2-3小时后CPU占用过高问题原因咨询
问题成因分析
1. 异步资源泄漏
- 线程/协程泄漏:如果服务为每个请求启动了异步协程/线程处理逻辑(比如日志上报、指标采集、异步写DB),但没有正确设置退出逻辑,会导致协程/线程数随压测时间持续增长,上下文切换及调度开销逐步抬升CPU占用。100TPS的请求量,2小时就会产生72万次请求,哪怕千分之一的泄漏概率,也会积累数百个无效调度单元,最终占满CPU。
- 定时器/回调泄漏:如果请求处理逻辑中注册了延时回调、超时定时器但没有主动销毁,后台定时器轮询队列会持续膨胀,每轮轮询的CPU开销随队列长度线性上升。
2. 内存相关间接CPU开销
- 无界缓存/队列膨胀:如果服务侧实现了本地内存缓存但没有设置过期淘汰策略,或者使用了无界队列存储异步任务,内存中存活对象会持续增加。如果使用带GC的语言(Java/Go/Python等),GC扫描存活对象的开销会随内存占用同步上涨,即使业务请求处理逻辑本身耗时不变,GC消耗的CPU也会逐步抬升整体使用率。
- 客户端资源堆积:Cassandra客户端连接池配置错误、连接泄漏,或者HTTP调用客户端的连接复用失效,会导致连接数持续增长,每个连接的心跳保活、IO事件轮询开销逐步累加,也会带来明显的CPU占用上升。
3. 可观测性/日志组件异常
- 指标无限制累加:如果服务侧的埋点指标是按请求维度生成唯一标签(比如带请求ID的metrics),指标集的大小会随请求量线性增长,每次采集、聚合指标的CPU开销会持续攀升。
- 日志无轮转:如果日志文件没有配置轮转策略,单文件体积随压测持续增大,每次写日志的系统调用开销会逐步上升,抬升内核态CPU占用。
4. 内核网络栈开销
- 连接跟踪表膨胀:如果服务没有开启HTTP长连接复用,每次请求都新建TCP连接,会产生大量TIME_WAIT状态连接,Linux内核的conntrack(连接跟踪)表会持续膨胀,每个网络包的匹配、转发开销线性上升,最终抬升系统态CPU占用。
补充排查建议
- 先执行
top区分CPU占用是用户态还是内核态,缩小排查范围:用户态高优先查业务逻辑、GC、客户端资源;内核态高优先查网络栈、系统调用、磁盘IO。 - 压测过程中定期采样服务的协程/线程数、内存占用、连接数、GC耗时,对比2小时前后的指标差异,就能快速定位泄漏点。
内容的提问来源于stack exchange,提问作者Pisztrang
相关产品推荐
相关产品推荐

