【MySQL】数据库性能测试

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 压测方法论   压测目的 压测场景/模型 结果分析 压测报告 其实可以把每次压测当作是一个项目,包括压测目的是什么?新版本数据库上线?新功能? 新的机型 ? 确定压测目标之后我们要选择何种压测场景进行压测,只读,只写,读写混合? 观察压测过程中的性能曲线是否满足我们的期望,并且真对性能出现可重复性抖动的问题进行分析原因并改进。

压测方法论

 


  • 压测目的

  • 压测场景/模型

  • 结果分析

  • 压测报告


其实可以把每次压测当作是一个项目,包括压测目的是什么?新版本数据库上线?新功能? 新的机型 ?


确定压测目标之后我们要选择何种压测场景进行压测,只读,只写,读写混合? 观察压测过程中的性能曲线是否满足我们的期望,并且真对性能出现可重复性抖动的问题进行分析原因并改进。


压测结束之后,发布压测报告。


2为什么要压测

 


  • 测试数据库新版本的性能  

  • 测试新机型的性能  

  • 验证某些DB/OS层面的参数  

  • 压测新型存储的性能 某个厂商的SSD/nVME  

  • 压测某些场景  

  • 比如cgroup 隔离 ,网卡绑定等等


其实这个也就是我们压测的目的/目标 ,新的db/机器/存储等上线和新技术预研,业务大促活动类似于11.11 或者秒杀活动等等都是需要提前进行压测的,评估数据库系统的性能容量和业务瓶颈,要不访问量过大导致业务瘫痪 就比较麻烦了,失去客户对我们产品的信任了。


当然这个需求是对业务量相当大的时候必须做的,如果业务量极小可以忽略该环节。


3影响压测的因素

 


讲完压测的目的,我们要讨论压测过程中可能会遇到的问题。可能影响整体系统性能的因素大致分为:DB 层面、OS 层面 、存储层面。


  • DB 层面


0?wx_fmt=png


对于MySQL层面,Buffer pool大小事务写磁盘,binlog落盘的策略,innodb 层的并发读设置  事务隔离级别 默认使用rc 都是会影响到最终的压测写入性能表现。


  • OS 层面


0?wx_fmt=png


关闭numa 在bios 里面设置 cpu 为最大性能模式,记得有一两次是由于设置为省电模式导致性能出现问题。初始化系统的时候选择ext4 或者xfs 系统文件。内核参数主要是 tcp 参数,影响业务app 和db之间建立网络连接。


  • 存储层面


0?wx_fmt=png


其实数据库模型可以分为 io bond 类型 和cpu bond 类型,估计大家目前的oltp业务系统,绝大多数的业务系统属于 io bond 类型,大家的业务系统大多数也是都是用了基于 ssd的存储结构 ,可能采用的raid 模式不一样有些是raid10 ,有些是raid 5 的差异。


在做性能压测的时候需要注意 raid 卡的配置,尤其是读写策略 WB 模式和WT模式性能差异极大。生产业务上注意对raid卡的充放电,避免导致模式变为WT 模式致使性能下降。


4需要关注的指标

 


  • DB层

  • QPS ,TPS ,RT(响应时间)


对于db层,我想特别强调对rt的监控,脱离业务场景的压测都是耍流氓,很多压测报告都说qps,tps 极高,但是没有公布对应的rt。大于生产需求的rt 阀值的压测结果都是没有用的。


比如说用户发起的一个业务请求,包含20次select,10次dml操作,单条sql,rt 为10ms,应用服务器 和db服务器网络交互 一次同城1ms -2ms,跨城5-15ms,单独db的响应时间就30*10=300ms 了,加上app与db的交互和业务处理,前端的处理时间,对于高并发的系统,吞度量不能接受。


  • 系统

  • CPU: load,usr cpu,

  • IO   :  await, svctm, %util  

  • 网络:  recv , send


await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒)


%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比


svctm:平均每次设备I/O操作的服务时间 (毫秒)%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的


  • 工具  

  •  orzdba  vmstat  iostat  dstat


5注意事项

 


  • 每轮压测彼此避免相互干扰  

  • 使用orzdba 观察 uckpt% 等待日志刷新完毕之后再开始测试新一轮。  

  • 注意压测系统的瓶颈


我最开始的某些压测场景没有做每次压测的隔离,导致上次的压测结果影响了下一次的压测性能,致使系统rt不稳定。可以通过orzdba –innodbs 命令查看uckpt% 该参数表明还有多少日志没有被刷新到磁盘。


6常用压测工具(开源)

 


这里我例举几种常见的开源数据库压测工具,仅仅讲述网上公开的how to 资料有很多,大家可以利用谷歌去搜索。


  • Sysbench

  • cpu,threads,mutex,memory,fileio,oltp


sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL。是一款非常受dba 欢迎的压测工具。


  • Tpcc-mysql

  • MySQL OLTP benchmarking


TPC(Tracsaction Processing Performance Council) 事务处理性能协会是一个评价大型数据库系统软硬件性能的非盈利的组织,TPC-C是TPC协会制定的,用来测试典型的复杂OLTP系统的性能;Tpcc-mysql是percona基于tpcc衍生出来的产品,专用于mysql基准测试,其源码放在bazaar上,因此需要先安装bazaar客户端。值得说明的是 Tpcc-mysql 包括五个处理逻辑,是比较贴近电商平台业务的一个压测工具New-Order :新订单 Payment :支付 Order-Status :订单查询 Delivery:发货 Stock-Level  :库存。


  • mysqlslap

  • MySQL  自带的压测工具 单条SQL


mysqlslap是从5.1.4版开始的一个MySQL官方提供的压力测试工具。通过模拟多个并发客户端访问MySQL来执行压力测试,同时提供了比较详细的数据性能报告。并且能很好的对比多个存储引擎在相同环境下的并发压力性能差别。通过mysqlslap –help可以获得可用的选项,个人觉得 mysqlslap是所有压测软件中最简单的。


  • tcpcopy

  • 引用线上流量到测试环境,模拟真实压力


TCPCOPY 是一个 tcp 流量的实时复制工具,其1.0版本由网易工程师 @tcpcopy 开发和维护。一般用来将生产环境的线上流量实时复制到测试环境进行测试。例如新系统上线前,如果我们希望进行一些基本的压力测试,那么我们可以直接利用 tcpcopy 来复制线上的流量过来对系统进行测试,这样的好处是测试数据接近真实水平,且实施起来相对简单。下面我们将通过一个真实的使用案例,来简单介绍 tcpcopy 的基本使用方法。我们假定读者对 tcp 以及路由相关基本知识有一定了解。


  • Mydbtest

  • 楼方鑫的一款压测工具,可以去onexsoft下载


Mydbtest 估计很多人没有使用过,之前是楼方鑫在支付宝的时候的一个压测工具,可以根据业务模型 配置业务的sql,利用线上的数据备份进行压测的一款工具,推荐大家尝试使用。


7压测工具

 


  • Sysbench  

  • 支持多种目标的测试 缺少业务场景支持


  • mysqlslap  

  • 使用方法简单,容易上手 测试方法/场景单一 TPCC      优点 业务场景固定,能够模拟商品购买流程 缺点 不能代表自己公司业务场景。


  • tcpcopy  

  • 真实的线上压力,配置复杂,涉及线上环境,风险偏大。


  • mydbtest  

  • 定制sql,模拟业务访问,动态修改,需要先部署好压测目标库,基础工作准备略多。


如ppt上所言,每个工具各有千秋,大家在压测的时候需要选择最适合自己业务/目的的压测工具。不过我本人推荐使用mydbtest 工具,其足够灵活性,适配行更强。


8面临的问题

 


  • 不考虑场景,就是耍流氓

  • 难以模拟线上真实业务压力

  • 压测模式不够细化  

  • 只读,只写,RW,会话数,TPCC 能够模拟五个业务场景

  • 不能自动化获取压测结果


  • 需要人肉处理压测数据 获取QPS,TPS 等


9更合理的压测工具

 


在这里我提出的是一个设想,运维自动化足够高的公司可以向这个方向靠近。


  • 按需定制压测计划

  • 模拟线上生产环境

  • 配置灵活

  • 支持分布式压测

  • 自动收集性能数据


1.1 根据业务需求制定压测计划

  • 压测模型

  • 模拟各种业务类型 创建订单,减库存 等等


1.2 模拟线上生产环境

  • 数据库硬件环境

  • 真实的线上数据

  • 模拟线上应用行为模式


1.3 工具配置灵活

  • 适配多个脚本

  • 调整读写比

       读写比

       IUD的比例

  • 控制并发度

  • 调整活跃/非活跃线程比例

  • 支持分布式

       跨机房调用多台app server


1.4 自动收集性能数据 QPS,TPS,RT


0?wx_fmt=png


10总结

 


0?wx_fmt=png


这个是之前和叶金荣讨论关于性能压测的话题之后整理的思维导图。具体的地址在http://vdisk.weibo.com/s/dCZasgFETrgn/1445265070,涵盖数据库压测的所有内容。当然也有不足之处,欢迎大家给予建议和补充,能够使数据库压测结果更精准 ,为数据库性能/可用性评估提供有力帮助。


关于参考,这里我强烈推荐 dimitrik 大牛的blog ,里面汇集了各种压测场景和技术分析。

http://dimitrik.free.fr/    
http://blog.itpub.net/22664653/viewspace-713075/
http://blog.itpub.net/22664653/viewspace-757735/
http://blog.itpub.net/22664653/viewspace-757506/
http://imysql.com/2012/12/21/pc-server-benchmarking.html

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
45 11
|
4天前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
1天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
5天前
|
关系型数据库 MySQL 测试技术
《性能测试》读书笔记_数据库优化
《性能测试》读书笔记_数据库优化
20 7
|
2天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
11 2
|
5天前
|
存储 缓存 关系型数据库
MySQL 视图:数据库中的灵活利器
视图是数据库中的虚拟表,由一个或多个表的数据经筛选、聚合等操作生成。它不实际存储数据,而是动态从基础表中获取。视图可简化数据访问、增强安全性、提供数据独立性、实现可重用性并提高性能,是管理数据库数据的有效工具。
|
5天前
|
SQL 关系型数据库 MySQL
MySQL技术安装配置、数据库与表的设计、数据操作解析
MySQL,作为最流行的关系型数据库管理系统之一,在WEB应用领域中占据着举足轻重的地位。本文将从MySQL的基本概念、安装配置、数据库与表的设计、数据操作解析,并通过具体的代码示例展示如何在实际项目中应用MySQL。
20 0
|
17天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
32 0
|
6天前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
31 7
Jmeter实现WebSocket协议的接口测试方法
|
6天前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
24 3
快速上手|HTTP 接口功能自动化测试