定位性能瓶颈的核心思路是通过压力测试复现性能问题,结合监控数据和分层分析,逐步缩小范围,最终定位到具体模块、代码或资源。以下是关键步骤和思路:
一、准备阶段:明确目标与基准
二、压力测试执行:逐步加压,观察异常
三、瓶颈定位:分层分析,缩小范围
先判断是否为资源瓶颈
通过服务器监控数据排查基础资源是否饱和:
• CPU 瓶颈:CPU 使用率持续≥90%,且用户态(us)或内核态(sy)占比过高(如 us 高可能是应用计算密集,sy 高可能是线程切换频繁)。
• 内存瓶颈:内存使用率高,且频繁发生 Swap(内存与磁盘交换),或应用 OOM(内存溢出)。
• 磁盘 IO 瓶颈:磁盘读写吞吐量接近上限,IO 等待时间(wa)高(如日志写入频繁、磁盘性能不足)。
• 网络瓶颈:带宽使用率接近上限,或网络延迟/丢包率高(如跨地域调用、大文件传输)。
若资源指标异常,优先解决资源问题(如扩容、优化 IO/网络)。
资源无瓶颈时,排查应用层
若服务器资源充足但性能差,聚焦应用本身:
• 线程/连接池问题:
◦ 线程池队列满、活跃线程数达到上限(导致请求排队),需调整线程池参数(核心线程数、队列长度)。
◦ 数据库连接池、Redis 连接池耗尽(如连接未释放、配置过小),查看连接池监控(如 active 数、wait 数)。
• 代码效率问题:
通过链路追踪工具(如 SkyWalking、Pinpoint)定位耗时最长的接口或方法。
◦ 分析 GC 日志:频繁 Full GC 可能是内存泄漏(如大对象未释放),Young GC 频繁可能是对象创建过频繁。
◦ 查看应用日志:是否有频繁重试、超时、锁竞争(如 synchronized、分布式锁等待)等报错。
应用层无问题时,排查依赖层
• 数据库:
◦ 慢查询:通过 explain 分析 SQL 执行计划,是否缺少索引、全表扫描。
◦ 锁竞争:查看数据库锁等待日志(如 MySQL 的 show processlist),是否存在行锁/表锁长时间未释放。
◦ 连接数:数据库最大连接数是否不足(如 MySQL 的 max_connections)。
• 缓存:
◦ 命中率低:是否缓存 key 设计不合理,或缓存失效策略不当(如过期时间过短)。
◦ 大 key/热 key:大 key 导致查询慢,热 key 导致缓存节点压力集中。
• 中间件:
◦ 消息队列:是否存在消息堆积(生产者速度>消费者),或消费者处理逻辑耗时过长。