在我们进行压力测试时,TPS(每秒事务处理量)有的时候上不去,说明系统处理能力遇到了瓶颈,对于测试从业者来说遇到这样的问题也是有点小烦恼,我们聊聊出现这种现象的原因吧。
出现系统的TPS(每秒事务处理量)上不去,出现的原因可能包含系统本身原因代码效率不高,算法复杂度过高,存在同步锁竞争导致线程阻塞等;数据库慢查询,没有优化索引,进行了全表扫描导致单个事务处理时间长等;服务器硬件中的CPU使用率过高达到100%,内存不足导致性能下降等;网络中高延迟或丢包,特别是在分布式系统中,节点间通信延迟高,会影响整体处理速度以及测试方法等等。
代码效率低
算法复杂度高、同步锁竞争、线程阻塞、资源未复用(如频繁创建对象)。
内存泄漏或频繁GC(垃圾回收)导致性能波动。
配置不当
线程池/连接池过小(如数据库连接池不足,请求等待)。
未启用异步处理或缓存机制,导致请求串行化。
性能问题
慢查询(索引缺失、全表扫描)、锁竞争(行锁、表锁、死锁)。
事务隔离级别过高(如串行化)或日志写入策略(如同步刷盘)拖慢速度。
配置限制
最大连接数不足、缓冲区(Buffer Pool)过小。
硬件资源不足(CPU、内存、磁盘IOPS低)。
CPU瓶颈
单核CPU满载(未利用多核)或计算密集型任务导致CPU过载。
内存不足
频繁交换(Swap)或内存争用(如JVM堆配置不合理)。
磁盘I/O
高读写场景下磁盘吞吐量不足(RAID配置、SSD未启用)。
网络带宽
数据传输量大时带宽占满,或网卡队列配置不当。
延迟或丢包
跨机房或云服务的高延迟通信影响分布式系统性能。
中间件限制
防火墙、负载均衡器或反向代理的并发连接数限制。
负载生成不足
测试工具(如JMeter)线程数/参数化数据不足,无法模拟高并发。
未预热系统(如JVM未预热至稳定状态)。
测试设计缺陷
测试场景与真实业务差异大(如数据量过小、请求类型单一)。
断言或日志过多,额外消耗资源。
扩展性限制
单体架构无法水平扩展,或微服务链路过长(响应时间叠加)。
依赖服务瓶颈
第三方API限速或性能差,下游服务成为瓶颈(如支付网关)。
OS/中间件参数
文件描述符限制、内核参数(如net.core.somaxconn)未优化。
中间件(如Tomcat、Nginx)的并发连接数或超时设置不合理。
虚拟化环境问题
云服务器共享资源争用(如超售的CPU、网络带宽)。
缓存失效
缓存穿透(大量请求直达数据库)、雪崩(缓存集体失效)。
队列阻塞
消息队列积压(消费者处理速度不足)或配置不当(如Kafka分区数不足)。
监控工具定位瓶颈
使用APM工具(如Arthas、SkyWalking)分析代码热点。
监控数据库(慢查询日志、Explain)、服务器(CPU/内存/磁盘IO/网络)。
渐进式压测
逐步增加并发量,观察TPS变化曲线及资源消耗趋势。
对比优化
通过A/B测试验证配置调整(如连接池扩容、索引优化)的效果。