【MySQL】数据库性能测试

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

压测方法论

 


  • 压测目的

  • 压测场景/模型

  • 结果分析

  • 压测报告


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


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


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


2为什么要压测

 


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

  • 测试新机型的性能  

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

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

  • 压测某些场景  

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


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


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


3影响压测的因素

 


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


  • DB 层面



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


  • OS 层面



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


  • 存储层面



其实数据库模型可以分为 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



10总结

 



这个是之前和叶金荣讨论关于性能压测的话题之后整理的思维导图。具体的地址在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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
12天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
12天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
42 3
|
12天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
54 2
|
25天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
177 15
|
19天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
26天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
30天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
2月前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
47 1
|
2月前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
75 4