java
标准化、规范化
java代码风格
【目录】java
编程-java8
编程-java9
编程-java-见过的异常
gradle
编程-java21
编程-java23
编程-java17
编程-java11
【目录】java-web-其它框架
java-vertx
quarkus
javalin
solon
Helidon
【目录】spring家族
spring
springcloud + nacos
consul
springboot启动流程
springboot使用及原理
springcloud
优化springboot
【java高级】
java-多线程-问题记录
java高级-ArrayList
java高级-HashMap
jdk源码解析-TreeMap红黑树
java对象占用多少字节
juc(并发)
ThreadPoolExecutor中ctl变量的理解
ThreadPoolExecutor分析
JVM(java虚拟机)
jvm学习路线
jvm
Java启动参数
debug
java-debug-arthas
java-debug-jdb
高并发/高性能/高可用
设计代码或编写代码时应该考虑的
如何发现系统中的瓶颈?
场景分析
mysql
mysql explain
mysql主从
mysql常见异常
方法论
工作中遇到的问题记录
代码优化
学习的思路
产品
本文档使用 MrDoc 发布
-
+
首页
如何发现系统中的瓶颈?
发现系统中的瓶颈,需要从 **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 状况** ```sh java -jar arthas-boot.jar ``` - `dashboard` 查看整体资源情况 - `top 10` 找出 CPU 消耗最高的方法 - `thread -n 5` 找出占用 CPU 最高的线程 - **JFR(Java Flight Recorder)分析方法耗时** ```sh java -XX:+FlightRecorder -jar app.jar ``` - 找到慢方法 - **SkyWalking / Zipkin / Jaeger** - 追踪请求流,查看耗时最长的调用 > **示例**: > - `top 10` 显示 `Thread.sleep()` 相关代码 → 可能有不必要的 sleep > - 线程 `BLOCKED` 状态多 → 可能是锁竞争 --- ### **(4) 数据库瓶颈分析(MySQL / Redis)** #### **数据库慢查询** - **查看慢查询日志** ```sql SHOW VARIABLES LIKE 'slow_query_log'; SHOW VARIABLES LIKE 'long_query_time'; -- 一般设为1秒 ``` - **慢 SQL**(执行时间过长) - **索引未命中**(使用 `EXPLAIN` 检查) - **数据库连接池耗尽** #### **Redis 瓶颈** - **检查 Redis 连接数** ```sh redis-cli INFO clients ``` - **监控 key 的访问频率** ```sh redis-cli monitor ``` > **示例**: > - `SELECT COUNT(*)` 太慢 → 改用 **索引或缓存** > - `Redis 慢查询` → 可能是大 key 或 `LRU 淘汰策略` 影响性能 --- ## **3. 常见瓶颈及优化方案** | 瓶颈 | 现象 | 优化方案 | |------|------|--------| | **CPU 过高** | CPU 100%,系统响应慢 | 代码优化(减少锁、减少 JSON 解析、优化算法) | | **内存溢出(OOM)** | GC 频繁,服务崩溃 | 增加内存、优化对象创建、使用 GC 优化 | | **数据库查询慢** | QPS 低,SQL 响应时间高 | 建立索引、优化 SQL、使用缓存(Redis) | | **磁盘 IO 瓶颈** | 日志写入慢 | 使用 SSD、优化日志级别 | | **网络带宽满** | 大量超时 | 优化请求数据量、使用 gzip 压缩 | --- ## **4. 总结** 发现系统瓶颈的步骤: 1. **使用 JMeter 进行压力测试,查看 QPS / RT**。 2. **使用 Prometheus + Grafana 监控 CPU、内存、磁盘 IO、网络**。 3. **用 Arthas / SkyWalking / JFR 分析代码层面性能**。 4. **检查数据库和 Redis 查询是否是瓶颈**。 如果你有具体的问题,比如某个接口响应慢,可以提供更多细节,我帮你分析!
我是张三
2025年3月11日 16:49
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
eblog
Markdown文件
分享
链接
类型
密码
更新密码