发现系统中的瓶颈,需要从 CPU、内存、IO、网络、数据库 等多个方面进行分析,并结合 压测工具(如 JMeter、wrk)和 监控工具(如 Prometheus、Grafana、SkyWalking)来定位问题。
1. 瓶颈分析的核心思路
- 确认瓶颈点在哪?
- CPU 限制?(高 CPU 使用率,导致请求处理变慢)
- 内存不足?(频繁 GC,导致系统卡顿)
- IO 瓶颈?(数据库查询慢、磁盘读写受限)
- 网络延迟?(请求超时、带宽受限)
- 瓶颈是应用代码还是外部依赖?
- 代码层面优化?(优化线程池、减少锁竞争)
- 依赖数据库、Redis、消息队列?(慢查询、连接池耗尽)
- 是否有资源竞争?
- 多线程同步问题?(锁竞争、线程阻塞)
- 资源池耗尽?(数据库连接池、Redis 连接数)
2. 如何定位瓶颈?
(1) 压测工具分析(JMeter / wrk)
- JMeter / wrk 进行压力测试
- 观察 QPS、RT(响应时间)、错误率
- 高 QPS,低 RT,低错误率 → 系统无瓶颈
- 低 QPS,高 RT,高错误率 → 存在瓶颈
- RT 随负载增加急剧上升 → 可能是线程、数据库、GC 瓶颈
示例:如果 JMeter 发现 QPS 不能上升,可能是数据库、CPU 受限。
(2) 监控系统指标(Prometheus + Grafana)
- 查看系统资源使用情况
- CPU 使用率(超过 80% 可能是瓶颈)
- 内存占用(是否频繁 GC?)
- 磁盘 IO(是否有高负载?)
- 网络流量(是否带宽受限?)
示例:
- CPU 100% → 线程过多,导致调度切换增加
- 内存不足 → 频繁 Full GC,影响性能
- 磁盘 IO 高 → 数据库查询慢,索引问题
(3) 代码级别性能分析(Arthas / JFR / SkyWalking)
- 使用 Arthas 分析 CPU、线程、GC 状况
java -jar arthas-boot.jardashboard查看整体资源情况top 10找出 CPU 消耗最高的方法thread -n 5找出占用 CPU 最高的线程
- JFR(Java Flight Recorder)分析方法耗时
java -XX:+FlightRecorder -jar app.jar- 找到慢方法
- SkyWalking / Zipkin / Jaeger
- 追踪请求流,查看耗时最长的调用
示例:
top 10显示Thread.sleep()相关代码 → 可能有不必要的 sleep- 线程
BLOCKED状态多 → 可能是锁竞争
(4) 数据库瓶颈分析(MySQL / Redis)
数据库慢查询
- 查看慢查询日志
SHOW VARIABLES LIKE 'slow_query_log'; SHOW VARIABLES LIKE 'long_query_time'; -- 一般设为1秒- 慢 SQL(执行时间过长)
- 索引未命中(使用
EXPLAIN检查) - 数据库连接池耗尽
Redis 瓶颈
- 检查 Redis 连接数
redis-cli INFO clients - 监控 key 的访问频率
redis-cli monitor
示例:
SELECT COUNT(*)太慢 → 改用 索引或缓存Redis 慢查询→ 可能是大 key 或LRU 淘汰策略影响性能
3. 常见瓶颈及优化方案
| 瓶颈 | 现象 | 优化方案 |
|---|---|---|
| CPU 过高 | CPU 100%,系统响应慢 | 代码优化(减少锁、减少 JSON 解析、优化算法) |
| 内存溢出(OOM) | GC 频繁,服务崩溃 | 增加内存、优化对象创建、使用 GC 优化 |
| 数据库查询慢 | QPS 低,SQL 响应时间高 | 建立索引、优化 SQL、使用缓存(Redis) |
| 磁盘 IO 瓶颈 | 日志写入慢 | 使用 SSD、优化日志级别 |
| 网络带宽满 | 大量超时 | 优化请求数据量、使用 gzip 压缩 |
4. 总结
发现系统瓶颈的步骤:
- 使用 JMeter 进行压力测试,查看 QPS / RT。
- 使用 Prometheus + Grafana 监控 CPU、内存、磁盘 IO、网络。
- 用 Arthas / SkyWalking / JFR 分析代码层面性能。
- 检查数据库和 Redis 查询是否是瓶颈。
如果你有具体的问题,比如某个接口响应慢,可以提供更多细节,我帮你分析!
作者:张三 创建时间:2025-03-11 16:49
最后编辑:张三 更新时间:2025-03-11 16:49
最后编辑:张三 更新时间:2025-03-11 16:49