全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
目录
一、性能测试的指标
1、并发量
2、响应时间
3、错误率
4、吞吐量
5、资源使用率
二、压测全流程
三、其他注意点
1、并发和吞吐量的关系
2、并发和线程的关系
四、调优及分布式集群压测(待仔细学习)
1.线程数量超过单机承载能力时的解决方案
2. 如何搭建分布式集群
3. 实施集群压测及监控
4. 处理集群中单台施压机报错的情况
5. 长时间压测(10小时)的注意事项
6. 处理混合场景:用户思考时间及多个服务同时压测
7. 开发压测监控大屏
8. 汇总多个测试报告
9. 监控服务器的 CPU、内存、磁盘
10. 监控 Java 程序、Nginx、MySQL 数据库及 JVM 指标
11. 性能分析及测试结论
12. 区分压测问题与程序问题
13. 内存溢出与性能问题标注
14. 与 BI 项目的关联
四、调优(待仔细学习)
1. 缓存调优
2. 集群调优
3. MQ(消息队列)中间件调优
4. 分布式微服务全链路压测
五、连接数据库进行数据库压测(待仔细学习)
1、步骤
2、性能测试指标
3.性能瓶颈发现方法
一、性能测试的指标
1、并发量
-
定义:描述一个系统所面临的压力,服务器收到多少请求(多少/秒)
-
用的人多,服务器收到请求多,并发量就高。
-
用来描述场景
2、响应时间
-
定义:请求开始到获取结果的时长(毫秒 1000ms=1s)
-
直观反映了用户体验
-
统计方式:平均响应时间 (按响应时间分布 90% 95% 99%)
-
平均响应时间:是对所有请求的响应时间取平均值,代表整体性能的一个平均水平。
百分位数(90%、95%、99%):
-
90%百分位数:表示90%的请求响应时间都小于这个值,也就是说有10%的请求响应时间是比这个值更长的。
-
95%百分位数:表示95%的请求响应时间都小于这个值,也就是说有5%的请求响应时间比这个值更长。
-
99%百分位数:表示99%的请求响应时间都小于这个值,也就是说有1%的请求响应时间比这个值更长。
-
3、错误率
-
定义:高并发海量请求场景,系统出错误的比例。
错误率=出错请求数量/整体请求数量
4、吞吐量
-
定义:服务器1秒内处理了多少请求
-
吞吐量和并发量的区别:并发量是服务器收到请求,吞吐量是服务器处理请求
-
细分概念
-
QPS (Queries Per Second):QPS 指的是每秒能够处理的查询数量,通常用于描述Web服务**或数据库在一定时间内处理请求的能力。
-
TPS (Transactions Per Second):TPS 指的是每秒能够处理的事务数量,这里的事务通常指的是一系列逻辑上的操作,这些操作可能包含多个查询、插入、更新等。一个事务需要满足ACID属性(原子性、一致性、隔离性、持久性)。
-
5、资源使用率
-
定义:程序在测压中,服务器资源的占用情况
-
程序运行代码需要占用服务器资源,CPU/内存、磁盘、网络…
这个是网络的指标 不是性能测试的指标:
1、带宽
-
定义:网络吞吐量,系统或网络在单位时间内能够传输的数据量
-
单位:比特每秒(bps)_为单位,常见的单位有_10mb/s(兆比特每秒)
2、时延
二、压测全流程
(压力测试 及 压力测试前的接口测试 详细请看另一个文章)
-
压测场景分析
-
在做性能测试之前,先做接口测试
-
收集性能指标
-
分析性能数据
-
梳理性能报告
三、其他注意点
1、并发和吞吐量的关系
-
并发请求:发送给服务器的请求数量
-
吞吐量:服务器每秒能处理的请求数量
(1) 先有并发,再有吞吐量(现有请求再有处理)。
(2) 并发量**>**吞吐量
2、并发和线程的关系
(1)并发量 不等于 线程数
-
有时候 一个线程 一秒钟 能产生多次请求
-
有时候 一个线程 一秒钟 不能完成一次请求
(2)线程数量=并发量*最大响应时间(秒)
四、调优及分布式集群压测(待仔细学习)
(性能测试需要剥夺业务层的干扰,有时候也需要对中间件直接压测,查看其性能)
1.线程数量超过单机承载能力时的解决方案
当单台运行 JMeter 的机器无法再增加线程数量时,可以采用 分布式集群 的方式,通过多台施压机(JMeter Server)共同承担压测任务。
2. 如何搭建分布式集群
(1)分布式集群搭建步骤如下:
-
准备多台施压机: 确保所有施压机和控制机(JMeter Controller)在同一网络中,能够相互通信。
-
配置 JMeter:
-
在所有施压机上安装与控制机相同版本的 JMeter。
-
修改
jmeter.properties
文件,确保
remote_hosts
配置项包含所有施压机的 IP 地址。例如:
remote_hosts=192.168.1.2,192.168.1.3,192.168.1.4
-
-
启动 JMeter Server:
-
在每台施压机上,通过命令行启动 JMeter Server:
jmeter-server
-
-
启动测试:
- 在控制机上打开测试计划,选择 Run > Remote Start All 或选择特定的施压机启动测试。
3. 实施集群压测及监控
集群实施步骤:
-
测试计划设计: 确保测试计划是分布式友好的,例如避免使用非线程安全的元素。
-
同步资源: 所有施压机应使用相同的测试脚本和资源文件。
-
启动测试: 通过控制机统一启动所有施压机的测试。
监控压测情况:
-
实时监控工具: 使用 JMeter 自带的监听器或更高级的工具(如 Grafana 与 InfluxDB)进行实时监控。
-
集中监控平台: 可以开发一个监控大屏,将各施压机的性能指标汇总展示。
4. 处理集群中单台施压机报错的情况
应对策略:
-
自动化监控与报警: 实时监控每台施压机的状态,若发现某台施压机报错或宕机,立即触发报警。
-
自动恢复机制: 配置自动重启脚本,确保施压机故障后能自动重启 JMeter Server。
-
测试任务再分配: 如果施压机长时间故障,可以手动或自动将其负载转移到其他施压机。
5. 长时间压测(10小时)的注意事项
关键点:
-
资源稳定性: 确保施压机和被测系统在长时间压测下资源不泄漏(如内存、文件句柄)。
-
断点续测: 设计测试计划时考虑断点续测机制,以防测试中断后能够恢复。
-
日志管理: 合理配置日志级别,避免长时间压测产生过多日志,影响系统性能。
-
定期检查: 在压测过程中定期检查施压机和被测系统的性能指标,及时发现潜在问题。
6. 处理混合场景:用户思考时间及多个服务同时压测
实现方法:
-
用户思考时间: 在 JMeter 中使用 Timers(定时器) 元素,如 Gaussian Random Timer 或 Constant Timer,模拟用户思考时间。
-
多个服务压测: 在测试计划中设计多线程组,每个线程组针对不同的服务进行压测,或在同一线程组中配置不同的请求,确保多个服务同时承受压力。
-
逻辑控制: 使用 Controllers(控制器) 元素,如 Transaction Controller 或 Module Controller,管理复杂的测试逻辑。
7. 开发压测监控大屏
监控大屏开发步骤:
-
数据收集:
-
使用 JMeter Backend Listener 将性能数据发送到时序数据库,如 InfluxDB。
-
配置监控工具(如 Grafana)连接 InfluxDB 以实时获取数据。
-
-
展示内容:
-
施压机性能指标: CPU、内存、磁盘使用率。
-
被测服务指标: 响应时间、吞吐量、错误率。
-
应用层指标: JVM 内存使用、垃圾回收情况、数据库性能指标(如 MySQL 的连接数、查询性能)。
-
-
可视化设计:
-
使用 Grafana 创建仪表板,将各类指标以图表、仪表盘等形式展示。
-
设置阈值和警报规则,实时标注异常情况。
-
8. 汇总多个测试报告
实现方法:
-
集中化报告生成:
-
使用 JMeter Plugins 中的 Aggregate Report 或 Summary Report 进行数据汇总。
-
将各施压机的测试结果通过脚本或工具(如 JMeter Dashboard)汇总到统一的报告中。
-
-
自动化脚本:
- 编写脚本在测试结束后自动收集各施压机的结果文件(如 JTL 文件),并进行汇总处理。
9. 监控服务器的 CPU、内存、磁盘
监控工具选择:
-
Prometheus + Grafana: 通过 Node Exporter 采集服务器的 CPU、内存、磁盘等指标,并在 Grafana 中展示。
-
其他监控工具: 如 Zabbix、Nagios 等,也可以实现类似的监控功能。
实施步骤:
-
在每台服务器上安装监控代理(如 Node Exporter)。
-
配置 Prometheus 抓取各服务器的指标。
-
在 Grafana 中创建仪表板,实时展示各项资源使用情况。
10. 监控 Java 程序、Nginx、MySQL 数据库及 JVM 指标
Java 程序(JVM)监控:
-
JMX(Java Management Extensions):
- 启用 JVM 的 JMX 功能,允许远程监控。
-
监控工具:
- 使用 Prometheus JMX Exporter 将 JVM 指标导出到 Prometheus。
-
关键指标:
-
垃圾回收(GC): GC 次数、GC 时间。
-
内存使用: 新生代(Young Generation)、老年代(Old Generation)、堆外内存。
-
线程数: 活动线程数。
-
Nginx 监控:
-
状态模块:
- 启用 Nginx 的 Stub Status Module,获取当前连接数、请求数等信息。
-
监控工具:
- 使用 Prometheus Nginx Exporter 获取并导出 Nginx 指标。
-
关键指标:
- 活动连接数、总请求数、每秒请求数、响应时间。
MySQL 数据库监控:
-
性能指标:
-
连接数: 当前活动连接数、最大连接数。
-
查询性能: 每秒查询数、慢查询数。
-
资源使用: CPU、内存、磁盘 I/O。
-
-
监控工具:
- 使用 Prometheus MySQL Exporter 或 Percona Monitoring and Management (PMM) 进行监控。
实施步骤:
-
在 Java 应用、Nginx、MySQL 服务器上安装相应的监控 Exporter。
-
配置 Prometheus 抓取这些 Exporter 的指标。
-
在 Grafana 中创建综合仪表板,展示所有关键指标。
11. 性能分析及测试结论
性能分析步骤:
-
数据汇总: 收集所有施压机和被测系统的性能数据。
-
指标对比: 将实际指标与预设的性能指标(如响应时间、吞吐量)进行对比。
-
瓶颈识别: 通过分析 CPU、内存、磁盘、网络等资源的使用情况,识别性能瓶颈所在。
-
异常检测: 标注在压测过程中出现的任何异常情况,如响应时间飙升、错误率增加、资源耗尽等。
-
结论判定:
-
测试通过: 所有关键指标在预期范围内,系统稳定。
-
测试不通过: 某些关键指标超出预期范围,存在性能问题。
-
-
问题定位: 进一步分析是测试本身的问题(如施压机资源不足)还是被测系统的问题(如内存泄漏、数据库瓶颈)。
12. 区分压测问题与程序问题
诊断步骤:
-
施压机健康检查:
-
确认所有施压机的 CPU、内存、磁盘等资源未达到极限。
-
确保网络带宽充足,无网络瓶颈。
-
-
被测系统监控:
-
检查被测系统的资源使用情况,如 CPU 是否达到 100%、内存是否溢出。
-
通过 JVM 指标分析是否存在内存泄漏或频繁的垃圾回收。
-
-
日志分析:
-
查看被测系统的日志,检查是否有异常错误(如 OutOfMemoryError)。
-
查看 JMeter 的测试日志,确认是否有请求超时或连接失败等错误。
-
-
错误分类:
-
压测问题: 施压机资源不足、网络不稳定、JMeter 配置错误等。
-
程序问题: 被测系统存在性能瓶颈、内存泄漏、数据库慢查询等。
-
-
验证与复现:
-
如果怀疑施压机问题,可以在另一台施压机上复现相同的测试,看问题是否依旧存在。
-
如果问题在多台施压机上均存在,倾向于被测系统的问题。
-
13. 内存溢出与性能问题标注
实施方法:
-
自动标注: 在监控大屏上设置阈值,当某项指标(如 CPU 使用率、内存使用量)超过设定值时,自动高亮或标注异常。
-
日志关联: 将性能指标异常与应用日志中的错误关联起来,帮助快速定位问题原因。
-
报告生成: 在测试报告中详细记录所有异常情况,并说明其可能的原因及影响。
14. 与 BI 项目的关联
整合 BI 项目的建议:
-
数据汇总与分析: 将压测数据汇总到 BI 平台(如 Tableau、Power BI),进行更深入的数据分析与可视化。
-
自动化报告: 利用 BI 工具自动生成定期的性能测试报告,方便团队查看和决策。
-
交互式大屏: 在 BI 平台上创建交互式仪表板,实时展示压测与系统性能指标,支持多维度数据分析。
四、调优(待仔细学习)
在性能测试和系统优化过程中,调优是确保系统在高负载下依然稳定、高效运行的关键步骤。以下是关于 缓存、集群、MQ 中间件调优 以及 分布式微服务全链路压测 的详细解释和优化建议。
1. 缓存调优
1.1 什么是缓存
缓存是一种存储机制,用于临时存储经常访问的数据,以减少数据获取的延迟和降低数据库或后端服务的负载。缓存可以存在于客户端(如浏览器缓存)、服务器端(如内存缓存)或分布式缓存系统中。
1.2 缓存的类型
-
本地缓存: 存储在应用程序所在的同一台机器上,如使用 Java 的
ConcurrentHashMap
、Caffeine、Guava 等。 -
分布式缓存: 存储在独立的缓存服务器上,支持多节点访问和高可用性,如 Redis、Memcached。
-
浏览器缓存: 存储在客户端浏览器中,通过设置 HTTP 头(如
Cache-Control
)进行管理。
1.3 缓存调优策略
-
缓存淘汰策略:
-
LRU(Least Recently Used): 移除最近最少使用的项。
-
LFU(Least Frequently Used): 移除使用频率最低的项。
-
FIFO(First In First Out): 按照进入缓存的顺序移除项。
-
-
缓存一致性:
-
数据失效: 设置合理的 TTL(Time-To-Live),确保缓存数据不过期。
-
缓存更新: 使用发布/订阅机制或消息队列通知缓存更新。
-
-
缓存预热: 在系统启动或部署后,提前将常用数据加载到缓存中,减少首次访问的延迟。
-
分片与分区: 对于大规模缓存,进行分片或分区管理,提高缓存的扩展性和访问效率。
1.4 缓存监控与优化
-
命中率监控: 通过监控缓存命中率,评估缓存的有效性,命中率低可能需要调整缓存策略或增加缓存容量。
-
内存使用监控: 确保缓存服务器有足够的内存,避免频繁的垃圾回收或内存溢出。
-
延迟监控: 监控缓存访问的响应时间,确保缓存系统本身不会成为性能瓶颈。
2. 集群调优
2.1 什么是集群
集群是由多台计算机(节点)通过网络连接组成的一个统一系统,旨在通过分布式计算和资源共享,提高系统的可靠性、可扩展性和性能。常见的集群类型包括负载均衡集群、高可用集群和计算集群。
2.2 集群的组成
-
控制节点(Master): 负责管理和协调集群中的其他节点,分发任务和监控集群状态。
-
工作节点(Worker): 执行具体的计算任务或服务请求。
-
负载均衡器: 分发客户端请求到不同的工作节点,确保负载均衡和高可用性。
2.3 集群调优策略
-
负载均衡优化:
-
均衡算法选择: 使用合适的负载均衡算法,如轮询(Round Robin)、最少连接(Least Connections)、哈希(Hash-based)。
-
会话保持: 对于需要会话保持的应用,配置负载均衡器支持粘性会话或使用分布式会话管理。
-
-
资源分配与管理:
-
自动扩展: 根据负载情况自动增加或减少工作节点,使用 Kubernetes、Docker Swarm 等容器编排工具实现弹性伸缩。
-
资源限制: 设置每个节点的 CPU、内存、存储等资源限制,防止单个节点资源被过度占用。
-
-
高可用性配置:
-
冗余设计: 部署多个控制节点和负载均衡器,避免单点故障。
-
故障转移: 配置自动故障转移机制,确保节点故障时请求能自动转移到其他正常节点。
-
-
网络优化:
-
网络带宽: 确保集群内部网络带宽充足,避免网络瓶颈。
-
延迟优化: 使用低延迟的网络设备和协议,减少节点间通信的延迟。
-
2.4 集群监控与优化
-
性能监控: 监控各节点的 CPU、内存、磁盘和网络使用情况,确保资源均衡。
-
健康检查: 定期检查节点的健康状态,及时发现并处理故障节点。
-
日志管理: 集中收集和分析集群日志,排查性能问题和故障原因。
3. MQ(消息队列)中间件调优
3.1 什么是消息队列(MQ)中间件
消息队列是一种异步通信机制,允许不同系统或服务之间通过发送和接收消息进行通信。常见的 MQ 中间件有 RabbitMQ、Apache Kafka、ActiveMQ、RocketMQ 等。
3.2 消息队列的作用
-
解耦系统: 使生产者和消费者独立运行,降低系统耦合度。
-
提高可靠性: 消息队列可以持久化消息,确保消息不丢失。
-
缓冲流量: 在高峰期,消息队列可以缓冲大量请求,平滑系统负载。
-
异步处理: 提高系统响应速度,适合处理耗时任务。
3.3 MQ 中间件调优策略
-
队列设计优化:
-
合理划分队列: 根据业务功能划分不同的队列,避免单个队列过于繁忙。
-
消息分区: 对于分布式 MQ(如 Kafka),合理设计分区数,平衡负载和并行度。
-
-
生产者与消费者优化:
-
批量发送与接收: 使用批量操作减少网络开销,提高吞吐量。
-
并发处理: 增加消费者的并发数,提升消息处理能力。
-
-
持久化与可靠性:
-
消息持久化: 配置合理的持久化策略,确保消息不丢失,但也要注意持久化带来的性能影响。
-
确认机制: 配置合理的消息确认机制,确保消息被成功消费。
-
-
性能参数调优:
-
内存与缓存: 调整 MQ 中间件的内存缓存大小,提高消息处理速度。
-
网络配置: 优化网络参数,减少消息传输延迟。
-
-
监控与限流:
-
监控指标: 监控队列长度、消息吞吐量、延迟等指标,及时发现和处理性能瓶颈。
-
限流机制: 在高负载情况下,使用限流策略防止 MQ 过载,保护下游系统。
-
3.4 MQ 中间件监控与优化
-
实时监控: 使用监控工具(如 Prometheus + Grafana)监控 MQ 的运行状态和性能指标。
-
日志分析: 分析 MQ 日志,排查消息积压、消费失败等问题。
-
故障恢复: 配置高可用架构,如 MQ 集群和镜像队列,确保消息服务的连续性。
4. 分布式微服务全链路压测
4.1 什么是分布式微服务
分布式微服务架构将应用程序拆分为多个独立的服务,每个服务负责特定的业务功能,通过网络进行通信和协作。这样的架构具有高可扩展性、灵活性和容错性。
4.2 全链路压测的概念
全链路压测(End-to-End Performance Testing)是指对整个分布式微服务系统进行全面的性能测试,模拟真实用户行为,评估系统在高负载下的响应能力、稳定性和整体性能。全链路压测涵盖了从前端到后端所有服务的性能测试。
4.3 全链路压测的关键要素
-
用户行为模拟: 模拟真实用户的操作流程和使用习惯,包括访问频率、并发数和思考时间。
-
服务依赖分析: 识别和分析各微服务之间的依赖关系,确保压测覆盖所有关键路径。
-
性能指标监控: 监控各微服务的响应时间、吞吐量、错误率及系统资源使用情况。
-
数据一致性: 确保在压测过程中,数据的一致性和完整性不受影响。
4.4 全链路压测的实施步骤
-
测试计划设计:
-
业务流程定义: 确定需要压测的业务流程,编写详细的测试用例。
-
并发用户数设定: 根据业务需求和预期负载,确定并发用户数和测试持续时间。
-
数据准备: 准备测试所需的输入数据和测试环境。
-
-
测试环境搭建:
-
环境一致性: 确保测试环境与生产环境尽可能一致,包括硬件配置、网络拓扑和服务版本。
-
隔离测试环境: 使用独立的测试环境,避免对生产环境造成影响。
-
-
测试工具配置:
-
选择合适的测试工具: 使用 JMeter、Gatling、Locust 等性能测试工具进行压测。
-
分布式测试配置: 配置分布式测试架构,确保能够模拟大规模的并发用户。
-
-
执行压测:
-
逐步加载: 采用逐步增加负载的方法,观察系统在不同负载下的表现。
-
全链路覆盖: 确保测试覆盖所有关键微服务和依赖组件,避免遗漏关键路径。
-
-
监控与分析:
-
实时监控: 使用监控工具(如 Prometheus + Grafana)实时监控系统性能指标。
-
日志分析: 收集并分析各微服务的日志,识别性能瓶颈和错误。
-
链路追踪: 使用分布式追踪工具(如 Jaeger、Zipkin)追踪请求在各微服务间的传播,分析响应时间和瓶颈点。
-
-
结果评估与优化:
-
性能报告生成: 汇总测试结果,生成详细的性能报告。
-
瓶颈定位与优化: 根据测试结果,定位性能瓶颈,进行针对性的优化。
-
复测验证: 在优化后进行再次压测,验证优化效果。
-
4.5 分布式微服务全链路压测的优化建议
-
服务解耦与独立部署: 确保每个微服务独立部署,减少服务间的耦合,提高系统的可维护性和扩展性。
-
容错与降级机制: 实现服务的容错和降级机制,确保部分服务故障时,系统整体仍能保持稳定运行。
-
自动化测试与持续集成: 将全链路压测集成到 CI/CD 流程中,确保每次代码变更后都进行性能验证。
-
资源弹性管理: 使用容器化和编排工具(如 Kubernetes)实现资源的弹性管理,动态调整服务实例数应对负载变化。
-
安全性考虑: 在压测过程中,确保数据的安全性和隐私保护,避免敏感数据泄露。
五、连接数据库进行数据库压测(待仔细学习)
1、步骤
-
下载JDBC驱动
- 获取所需的JDBC驱动(JAR包),并将其放入JMeter的指定目录下。
-
配置JDBC原件
- 在JMeter中添加配置元件(Config Element)中的JDBC配置。
-
连接数据库
- 配置并测试与目标数据库的连接,确保连接正常。
-
编写SQL操作
- 编写需要执行的SQL语句,用于压测过程中模拟实际的数据库操作。
-
设置线程属性
- 配置压测的线程属性,包括线程数、持续时间和循环次数,以模拟并发用户行为。
-
执行数据库压测
- 启动压测,监控测试过程中的各项性能指标。
2、性能测试指标
-
执行效率
-
定义:评估数据库操作的整体性能和响应时间。
-
关注点:查询执行时间、事务处理时间等。
-
-
慢查询
-
定义:执行时间超过预设阈值的SQL语句。
-
分析内容:
-
哪些语句存在慢查询。
-
慢查询的原因(如缺乏索引、复杂查询等)。
-
-
-
组件问题
-
定义:数据库系统中各组件(如缓冲池、查询优化器等)可能存在的性能瓶颈。
-
分析内容
:
-
缓冲池使用情况。
-
查询优化器的效率。
-
-
-
锁问题
-
定义:多个事务同时访问同一数据时,因锁机制导致的等待、阻塞或死锁。
-
分析内容:
-
哪行代码出现锁的问题。
-
哪条语句导致锁。
-
哪张表存在锁的问题。
-
-
-
缓冲区(Buffer)
-
定义:用于缓存数据和索引的内存区域(如InnoDB缓冲池)。
-
关注点:缓冲池大小、命中率、读写次数等。
-
-
表结构问题
-
定义:数据库表设计不合理,导致查询性能低下或存储空间浪费。
-
分析内容:
-
表的大小和增长速度。
-
索引设计是否合理。
-
数据分布和访问模式。
-
-
-
分库分表
-
水平分表(Sharding):
-
定义:将一张大表按照某个规则(如ID范围、哈希值)拆分为多个表,每个表存储部分数据。
-
优点:减少单表数据量,提高查询性能,便于水平扩展。
-
缺点:增加查询复杂性,需修改应用逻辑。
-
-
垂直分表:
-
定义:将表的不同列拆分为多个表,每个表存储部分字段。
-
优点:减少单表宽度,提高查询效率,分离热数据和冷数据。
-
缺点:增加表之间的关联查询,需维护多个表的完整性。
-
-
3.性能瓶颈发现方法
在进行数据库压测后,发现性能瓶颈并确定哪些SQL语句存在慢查询或锁问题是优化数据库性能的关键步骤
一、启用并配置慢查询日志
1. 启用慢查询日志
慢查询日志记录了执行时间超过指定阈值的SQL语句。通过分析这些日志,可以识别出性能较差的查询。
– 启用慢查询日志
SET GLOBAL slow_query_log = ‘ON’;
– 设置慢查询时间阈值(例如,记录执行时间超过2秒的查询)
SET GLOBAL long_query_time = 2;
– 可选:记录未使用索引的查询
SET GLOBAL log_queries_not_using_indexes = ‘ON’;
2. 配置慢查询日志文件路径
在MySQL配置文件(my.cnf
或my.ini
)中设置慢查询日志文件路径和其他相关参数:
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2
log_queries_not_using_indexes = ON
3. 分析慢查询日志
使用工具如 mysqldumpslow 或 pt-query-digest 来分析慢查询日志,找出最频繁和耗时最长的查询。
使用 mysqldumpslow
mysqldumpslow -s t /var/log/mysql/slow-query.log
使用 pt-query-digest
pt-query-digest /var/log/mysql/slow-query.log
二、使用 Performance Schema 进行深入分析
1. 启用 Performance Schema
确保 performance_schema
已启用。在MySQL配置文件中:
[mysqld]
performance_schema = ON
2. 查询慢查询和锁信息
利用 performance_schema
提供的表格,可以查询到详细的执行情况,包括等待锁的信息。
– 查看慢查询
SELECT
EVENT_ID,
SQL_TEXT,
TIMER_WAIT,
LOCK_TIME,
ROWS_SENT,
ROWS_EXAMINED
FROM
performance_schema.events_statements_history
WHERE
TIMER_WAIT > 2000000000; – 时间单位为皮秒(这里表示超过2秒)
– 查看锁等待
SELECT
thd.PROCESSLIST_ID,
thd.PROCESSLIST_USER,
thd.PROCESSLIST_HOST,
thd.PROCESSLIST_DB,
thd.EVENT_NAME,
thd.STATE,
thd.SQL_TEXT
FROM
performance_schema.threads thd
JOIN
performance_schema.events_waits_current ewc
ON thd.THREAD_ID = ewc.THREAD_ID
WHERE
ewc.EVENT_NAME LIKE ‘wait/lock/%’;
三、使用 EXPLAIN 分析查询计划
对发现的慢查询,使用 EXPLAIN
分析其执行计划,找出查询的瓶颈,如全表扫描、缺失索引等。
EXPLAIN ANALYZE
SELECT * FROM your_table WHERE some_column = ‘value’;
关键指标:
-
type:访问类型,尽量使用
const
、eq_ref
或ref
,避免ALL
(全表扫描)。 -
key:使用的索引,确保查询使用了合适的索引。
-
rows:扫描的行数,行数越少越好。
-
Extra:查看是否有
Using temporary
或Using filesort
,这可能影响性能。
四、监控和分析锁问题
1. 查看当前锁情况
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM
information_schema.innodb_lock_waits w
JOIN
information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
JOIN
information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;
2. 使用 SHOW ENGINE INNODB STATUS
该命令提供了当前InnoDB引擎的详细状态,包括锁等待信息。
SHOW ENGINE INNODB STATUSG
在输出中,查找 LATEST DETECTED DEADLOCK 和 TRANSACTIONS 部分,分析死锁和锁等待的详细信息,包括涉及的SQL语句和表。
五、结合压测工具的监控功能
如果你使用的是JMeter等压测工具,可以结合其监控插件或第三方监控工具(如Prometheus、Grafana)来实时监控数据库的性能指标。
1. 设置JMeter监控
-
使用JMeter的监听器(Listener)如 JDBC Request、View Results Tree,实时查看查询的响应时间和错误。
-
使用 JMeter Plugins 中的监控插件,如 PerfMon,监控服务器的CPU、内存、磁盘I/O等指标,关联到数据库性能问题。
2. 使用第三方监控工具
-
Percona Monitoring and Management (PMM):一个开源的监控解决方案,专为MySQL设计,提供实时查询分析和性能指标。
-
Grafana + Prometheus:通过配置MySQL Exporter,收集数据库的性能指标,并在Grafana中可视化展示,帮助识别性能瓶颈。
六、优化发现的问题
1. 优化慢查询
-
添加或优化索引:确保查询中使用的列有合适的索引。
-
重写查询:简化复杂的查询,避免不必要的子查询和JOIN操作。
-
分区表:对于大表,使用分区技术减少查询的扫描范围。
2. 解决锁问题
-
优化事务:缩短事务的执行时间,避免长时间持有锁。
-
隔离级别调整:在保证数据一致性的前提下,适当降低事务隔离级别(如从
REPEATABLE READ
调整为READ COMMITTED
)。 -
索引优化:确保查询使用索引,减少锁的范围和数量。
3. 缓冲池和表结构优化
-
调整
innodb_buffer_pool_size
:确保缓冲池足够大,以容纳大部分活跃数据,减少磁盘I/O。 -
分库分表
-
水平分表:将表的数据按某个键值分散到多个表中,减小单表的数据量,提升查询性能。
-
垂直分表:将表的不同列分散到多个表中,减少每个表的宽度,提升查询效率。
-
七、持续监控和迭代优化
性能优化是一个持续的过程,应定期进行压测和监控,及时发现和解决新的性能瓶颈。同时,结合业务发展和数据增长,动态调整数据库配置和架构,确保系统始终保持高效稳定。
相关文章:
全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
目录 一、性能测试的指标 1、并发量 2、响应时间 3、错误率 4、吞吐量 5、资源使用率 二、压测全流程 三、其他注意点 1、并发和吞吐量的关系 2、并发和线程的关系 四、调优及分布式集群压测(待仔细学习) 1.线程数量超过单机承载能力时的解决…...
鸿蒙初学者学习手册(HarmonyOSNext_API14)_自定义动画API(@ohos.animator (动画) )
前言 在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式,但是今天介绍的是ApI中的自定义动画。 注意: 动画本身具有生命周期,但是不支持在UIAbility的文件使用,简单而言就是不允许在UIAbility生命周期中…...
Grok 3.0 Beta 版大语言模型评测
2025年2月17日至18日,全球首富埃隆马斯克(Elon Musk)携手其人工智能公司xAI,在美国重磅发布了Grok 3.0 Beta版。这款被誉为“迄今为止世界上最智能的语言模型”的AI,不仅集成了先进的“DeepSearch”搜索功能࿰…...
IDEA中查询Maven项目的依赖树
在Maven项目中,查看项目的依赖树是一个常见的需求,特别是当你需要了解项目中直接或间接依赖了哪些库及其版本时。你可以通过命令行使用Maven的dependency:tree插件来做到这一点。这个命令会列出项目中所有依赖的树状结构。 打开idea项目的终端ÿ…...
学习aigc
DALLE2 论文 Hierarchical Text-Conditional Image Generation with CLIP Latents [2204.06125] Hierarchical Text-Conditional Image Generation with CLIP LatentsAbstract page for arXiv paper 2204.06125: Hierarchical Text-Conditional Image Generation with CLIP L…...
springboot整合mybatis-plus【详细版】
目录 一,简介 1. 什么是mybatis-plus2.mybatis-plus特点 二,搭建基本环境 1. 导入基本依赖:2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三,基本知识介绍 1. 基本注解 T…...
【2024 CSDN博客之星】大学四年,我如何在CSDN实现学业与事业的“双逆袭”?
前言: Hello大家好,我是Dream。不知不觉2024年已经过去,自己也马上迈入23岁,感慨时间飞快,从19岁刚入大学加入CSDN,到现在大学毕业已经整整四年了。CSDN陪伴我走过了最青涩的四年大学时光,在这里…...
在VS中通过vcpkg包管理器来安装使用qt5
常用指令 .\vcpkg install 库名 .\vcpkg install 库名版本号.\vcpkg install 库名 --trip x86-windows.\vcpkg list.\vcpkg search 库名 .\vcpkg x-all-installed --7zip PS G:\vcpkg> .\vcpkg help usage: vcpkg <command> [--switches] [--optionsvalues] [argume…...
【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道
文章目录 从结构到操作:手撕AVL树的实现一、AVL树介绍1.1 什么是AVL树1.2 平衡因子的定义1.3 平衡的意义1.4 AVL树的操作 二、AVL树的节点结构2.1 节点结构的定义: 三、插入操作3.1 插入操作概述3.2 步骤1:按二叉查找树规则插入节点3.3 步骤2…...
CPU、SOC、MPU、MCU--详细分析四者的区别
一、CPU 与SOC的区别 1.CPU 对于电脑,我们经常提到,处理器,内存,显卡,硬盘四大部分可以组成一个基本的电脑。其中的处理器——Central Processing Unit(中央处理器)。CPU是一台计算机的运算核…...
nacos编写瀚高数据库插件
1、下载nacos源码 git clone gitgithub.com:alibaba/nacos.git 2、引入瀚高驱动 <dependency><groupId>com.highgo</groupId><artifactId>jdbc</artifactId><version>${highgo.version}</version></dependency> 3、DataSource…...
使用excel中的VBA合并多个excel文件
需求是这样的: 在Windows下,用excel文件让多个小组填写了统计信息,现在我需要把收集的多个文件汇总到一个文件中,前三行为标题可以忽略,第四行为收集信息的列名,处理每一行数据的时候,发现某一行…...
linux 安装启动zookeeper全过程及遇到的坑
1、下载安装zookeeper 参考文章:https://blog.csdn.net/weixin_48887095/article/details/132397448 2、启动失败 1、启动失败JAVA_HOME is not set and java could not be found in PATH 已安装 JAVA 配置了JAVA_HOME,还是报错解决方法:参考…...
JAVA JUC 并发编程学习笔记(一)
文章目录 JUC进程概述对比 线程创建线程ThreadRunnableCallable 线程方法APIrun startsleep yieldjoininterrupt打断线程打断 park终止模式 daemon不推荐 线程原理运行机制线程调度未来优化 线程状态查看线程 同步临界区syn-ed使用锁同步块同步方法线程八锁 锁原理Monitor字节码…...
内容中台架构下智能推荐系统的算法优化与分发策略
内容概要 在数字化内容生态中,智能推荐系统作为内容中台的核心引擎,承担着用户需求与内容资源精准匹配的关键任务。其算法架构的优化路径围绕动态特征建模与多模态数据融合展开,通过深度强化学习技术实现用户行为特征的实时捕捉与动态更新&a…...
Java 内存区域详解
1 常见面试题 1.1 基本问题 介绍下Java内存区域(运行时数据区)Java对象的创建过程(五步,建议能够默写出来并且要知道每一步虚拟机做了什么)对象的访问定位的两种方式(句柄和直接指针两种方式)…...
jEasyUI 创建学校课程表
jEasyUI 创建学校课程表 引言 随着信息技术的飞速发展,教育行业也迎来了数字化转型的浪潮。学校课程表的创建和管理作为教育信息化的重要组成部分,其效率和准确性直接影响到学校的教学秩序。jEasyUI,作为一款优秀的开源UI框架,凭借其易用性、灵活性和丰富的组件,成为了许…...
利用 OpenCV 进行棋盘检测与透视变换
利用 OpenCV 进行棋盘检测与透视变换 1. 引言 在计算机视觉领域,棋盘检测与透视变换是一个常见的任务,广泛应用于 摄像机标定、文档扫描、增强现实(AR) 等场景。本篇文章将详细介绍如何使用 OpenCV 进行 棋盘检测,并…...
git-提交时间和作者时间的区别
1.介绍 定义介绍 提交时间(Committer Date):决定了提交在 Git 历史中的位置,通常影响 GitHub 上提交显示的顺序。 作者时间(Author Date):虽然不影响提交的排序,但在每个提交详情页…...
解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported
找了好多教程都没有用,终于解决了!!我是因为ubuntu分区的时候出问题了 问题描述: 双系统装好,隔天开机找不到引导项,黑屏显示下列 因为我用的D盘划分出来的部分空闲空间,而不是全部,…...
基于Flask的京东商品信息可视化分析系统的设计与实现
【Flask】基于Flask的京东商品信息可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 系统能够灵活地执行SQL查询,提取出用于分析的关键数据指标。为了将这…...
期权帮|股指期货中的套期保值如何操作?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 股指期货中的套期保值如何操作? 一、股指期货中的套期保值准备阶段 确定套保需求,投资者依据市场预判与投资组合分析,决定是否套保。 &…...
用Chrome Recorder轻松完成自动化测试脚本录制
前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…...
C/C++面试知识点总结
目录 1. 指针1.1 智能指针1.2 指针和引用的区别1.3 数组和指针的区别1.4 数组指针和指针数组的区别1.5 迭代器和指针的区别1.6 strcpy 和 memcpy 的区别 2. 内存管理与分配2.1 内存分配与存储区2.2 malloc / free2.3 volatile和extern的区别2.4 拷贝构造函数2.5 预处理、编译、…...
springboot三层架构详细讲解
目录 springBoot三层架构 0.简介1.各层架构 1.1 Controller层1.2 Service层1.3 ServiceImpl1.4 Mapper1.5 Entity1.6 Mapper.xml 2.各层之间的联系 2.1 Controller 与 Service2.2 Service 与 ServiceImpl2.3 Service 与 Mapper2.4 Mapper 与 Mapper.xml2.5 Service 与 Entity2…...
助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全
在数字化转型的浪潮中,越来越多的企业选择私有化部署AI技术,以保障数据安全、提升业务效率并实现自主可控。DeepSeek作为行业领先的AI开源技术,其技术可以支持企业私有化部署,企业需要一站式服务私有化部署,涵盖硬件采…...
Mac book Air M2 用VMware安装 Ubuntu22.04
安装 VMware Fusion 下载 Ubuntu 安装VMware 完成之后运行新建 将对应Ubuntu 版本拖拽 如图 选择第一个回车 选绿色 回车 为空 相关命令行 sudo apt install net-tools sudo apt install ubuntu-desktop sudo reboot 常用命令行 uname uname -a clear ll ifconfig (查…...
Spring Boot接收参数的19种方式
Spring Boot是一个强大的框架,允许开发人员通过多种方式接收和处理参数。无论是HTTP请求参数、路径变量,还是请求体中的数据,Spring Boot都能提供灵活的处理方式。本文将介绍19种不同的方式来接收参数。 1. 查询参数(Query Param…...
Linux firewalld 常用命令
本文参考RedHat官网文章How to configure a firewall on Linux with firewalld。 Firewalld 是守护进程名,对应命令为firewall-cmd。帮助详见以下命令: $ firewall-cmd --helpUsage: firewall-cmd [OPTIONS...]General Options-h, --help Pr…...
火语言RPA--Excel插入空行
【组件功能】:在Excel内指定的位置插入空行 配置预览 配置说明 在第n行之前 支持T或# 填写添加插入第n行之前行号。 插入n行 支持T或# 插入多少行。 Sheet页名称 支持T或# Excel表格工作簿名称。 示例 Excel插入空行 描述 在第3行之后插入3行。 配置 输…...
纷析云开源版- Vue2-增加字典存储到localStorage
main.js //保存字典数据到LocalStorage Vue.prototype.$api.setting.SystemDictType.all().then(({data}) > {loadDictsToLocalStorage(data) })新增 dictionary.js 放在 Utils文件夹里面 // 获取字典数据 export function getDictByType(dictType) {const dicts JSON.par…...
LangChain-基础(prompts、序列化、流式输出、自定义输出)
LangChain-基础 我们现在使用的大模型训练数据都是基于历史数据训练出来的,它们都无法处理一些实时性的问题或者一些在训练时为训练到的一些问题,解决这个问题有2种解决方案 基于现有的大模型上进行微调,使得它能适应这些问题(本…...
机器学习在脑卒中预测中的应用:不平衡数据集处理方法详解
机器学习在脑卒中预测中的应用:不平衡数据集处理方法详解 目录 引言 脑卒中的全球影响机器学习在医疗预测中的挑战类别不平衡问题的核心痛点数据预处理与特征选择 数据来源与清洗缺失值处理方法类别特征编码特征选择技术处理类别不平衡的四大方法 SMOTE(合成少数类过采样技术…...
Spring Boot项目@Cacheable注解的使用
Cacheable 是 Spring 框架中用于缓存的注解之一,它可以帮助你轻松地将方法的结果缓存起来,从而提高应用的性能。下面详细介绍如何使用 Cacheable 注解以及相关的配置和注意事项。 1. 基本用法 1.1 添加依赖 首先,确保你的项目中包含了 Spr…...
飞书API
extend目录下,API <?php // ---------------------------------------------------------------------- // | 飞书API // ---------------------------------------------------------------------- // | COPYRIGHT (C) 2021 http://www.jeoshi.com All rights reserved. …...
杨校老师课堂之信息学奥赛结构体操作使用经典题集锦汇总
C基础:结构体数组综合训练 员工信息处理系统题目描述输入描述输出描述解题思路参考代码 员工信息处理系统 题目描述 在一家企业中,员工信息的准确性和时效性是日常人事管理工作的关键。由于企业员工数量众多,手动统计与更新员工信息不仅耗费大量时间&a…...
交互编程工具之——Jupyter
Jupyter 是什么? Jupyter 是一个开源的交互式编程和数据分析工具,广泛应用于数据科学、机器学习、教育和研究领域。其核心是 Jupyter Notebook(现升级为 JupyterLab),允许用户在一个基于浏览器的界面中编写代码、运行…...
Redis常见问题排查
redis连接不上去,ERR max number of clients reached redis默认最大连接是10000,如果出现连接泄露或者被服务器被攻击可能会出现连接数超过限制。 Redis 的 INFO 命令可以提供服务器的统计信息,其中包括当前客户端连接数。这是获取连接数最…...
Hadoop初体验
一、HDFS初体验 1. shell命令操作 hadoop fs -mkdir /itcast hadoop fs -put zookeeper.out /itcast hadoop fs -ls / 2. Web UI页面操作 结论: HDFS本质就是一个文件系统有目录树结构 和Linux类似,分文件、文件夹为什么上传一个小文件也这…...
深入解析C++26 Execution Domain:设计原理与实战应用
一、Domain设计目标与核心价值 Domain是C26执行模型的策略载体,其核心解决两个问题: 执行策略泛化:将线程池、CUDA流等异构调度逻辑抽象为统一接口策略组合安全:通过类型隔离避免不同执行域的策略污染 // Domain类型定义示例&a…...
基于Flask的租房信息可视化系统的设计与实现
【Flask】基于Flask的租房信息可视化系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网的快速发展,租房市场日益繁荣,信息量急剧增加ÿ…...
TensorFlow v2.16 Overview
TensorFlow v2.16 Overview 一、模块 Modules二、类 Classes三、函数 Functions TensorFlow v2.16.1 Overview 一、模块 Modules 模块是TensorFlow中组织代码的一种方式,将相关的功能和类封装在一起,方便用户使用和管理。每个模块都提供了特定领域的公共…...
网页版的俄罗斯方块
1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…...
Vue3 状态管理 - Pinia
目录 1. 什么是Pinia 2. 手动添加Pinia到Vue项目 3. Pinia的基础使用 4. getters实现 5. action异步实现 6. storeToRefs工具函数 7. Pinia的调试 8. Pinia的持久化插件 1. 什么是Pinia Pinia 是 Vue 专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品 …...
Arduino 第十六章:pir红外人体传感器练习
Arduino 第十六章:PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动…...
伯克利 CS61A 课堂笔记 10 —— Trees
本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…...
Springboot 高频面试题
以下是Spring Boot的高频面试题及答案和底层原理解释: 基础概念 什么是Spring Boot,其主要特点是什么? 答案: Spring Boot本质上是一个建立在Spring框架之上的快速应用开发框架。其主要特点包括: 启动器:一…...
从零开始玩转TensorFlow:小明的机器学习故事 2
你好,TensorFlow!——从零开始的第一个机器学习程序 1. 为什么要写这个“Hello, TensorFlow!”? 无论学习什么新语言或新框架,“Hello World!”示例都能帮助我们快速确认开发环境是否就绪,并掌握最基本的使用方式。对…...
第四届图像、信号处理与模式识别国际学术会议(ISPP 2025)
重要信息 会议官网:www.icispp.com 会议时间:2025年3月28-30日 会议地点:南京 简介 由河海大学和江苏大学联合主办的第四届图像、信号处理与模式识别国际学术会议(ISPP 2025) 将于2025年3月28日-30日在中国南京举行。会议主…...
阿里云通过docker安装skywalking及elasticsearch操作流程
系统 本文使用系统为 Alibaba Cloud Linux 3.2104 LTS 64位 配置为 4核8G PS:最低配置应为2核4G,配置过低无法启动 安装docker 1.卸载旧版本docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…...