【MySQL】数据库性能测试

压测方法论

 

  • 压测目的
  • 压测场景/模型
  • 结果分析
  • 压测报告

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

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

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

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,涵盖数据库压测的所有内容。当然也有不足之处,欢迎大家给予建议和补充,能够使数据库压测结果更精准 ,为数据库性能/可用性评估提供有力帮助。

时间: 2024-09-13 19:18:18

【MySQL】数据库性能测试的相关文章

MySQL数据库引擎介绍、区别、创建和性能测试的深入分析_Mysql

数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另外两种类型INNODB和BERKLEY(BDB),也常常可以使用.如果技术高超,还可以使用MySQL+API自己做一个引擎.下面介绍几种数据库引擎:     ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到 数据库被查询的次数要远大于更新的次数.因此,ISAM执

mysql服务器性能测试怎么做

问题描述 mysql服务器性能测试怎么做 本人新搭建好一个mysql服务器,它的性能和处理能力该怎样来测试呢?包括用哪个工具,关注哪些性能参数? 解决方案 有很多这样的工具,比如说 mysqlslap Super-smack MySQL Benchmark loadrunner 但是不是说用工具就能准确度量出你的服务器性能了,因为工具仅仅是工具,压力测试仅仅是模拟测试. 真实场景下业务是多种多样的,用户的真实访问,真实的数据和查询请求不是简单靠工具能模拟出来的,dba的经验在这里非常关键. 解决

详解:如何在.NET中访问MySQL数据库?

如果你不是只在大集团公司工作过的话,你一定会有机会接触到MySQL,虽然它并不支持事务处理,存储过程,但是它提供的功能一定能满足你的大部分需求,另外,简洁的MySQL也有一些它独到的优势,在有些时候,它的速度甚至超过大型数据库. 那么如何在.NET中访问MySQL数据库呢?也许很多人马上会说:用OLEDB嘛,但是事实上采用.NET OleDb Data Provider并不能访问MySQL,如果你使用的话,系统会提示你:"Net Data OLE DB 提供程序 (System.Data.Odb

如何在.NET中访问MySQL数据库

mysql|访问|数据|数据库 摘要 MySQL作为一种小型关系数据库,它以低廉的价格.强大的功能.不俗的速度和开放源码的特性赢得了大量中小型企业及个人用户的青睐.但是在.NET中访问MySQL数据库却并没有想象中那么方便,因为.NET OleDb Data Provider和MySQL的兼容性并不理想.本文介绍了两种在.NET中访问MySQL数据库的方法,并对这两种方法做了一个简单的性能对比. 引言 如果你不是只在大集团公司工作过的话,你一定会有机会接触到MySQL,虽然它并不支持事务处理,存

京东MySQL数据库Docker化最佳实践(附PPT)

讲师介绍  刘风才 京东资深数据库专家     2012年加入京东,担任MySQL DBA一职,负责数据库架构设计.数据库性能优化等日常运维工作,参与过分布式数据库项目.多中心交易项目等. 2013~2016连续4年作为MySQL数据库618.11.11项目DBA负责人,负责相应备战工作,为大促平稳护航.   演讲大纲: 京东Docker技术发展历程 MySQL数据库为何要Docker化 MySQL数据库Docker化前准备工作 遇到的问题与解决方案 总结与展望   京东MySQL数据库Dock

【赠书】从商用到开源:15个维度,全面剖析DB2与MySQL数据库的差异

云和恩墨为某证券公司进行了从DB2到MySQL数据库系统的迁移论证.验证,对两类数据库展开全方位多角度的对比分析,并根据用户的业务现状进行了相关架构.性能.备份恢复及高可用验证.本系列将带领大家全面学习DB2迁移至MySQL的实践. 前文回顾: 从商用到开源:DB2迁移至MySQL的最佳实践 今天一起来学习DB2与MySQL数据库的特征对比.快上车! 一.隔离级别 标准的隔离级别共四个,分别是: 未授权读取 也称为读未提交(ReadUncommitted):允许脏读取,但不允许更新丢失.如果一个

MySQL索引性能测试

MySQL索引性能测试   blog文档结构图:   很长一段时间没学习MySQL了,一直致力于oracle的研究,最近得空了就再拾起MySQL看看吧,记得去年发布过的2篇MySQL文章:     MySQL 5.6.21下载安装之下载篇(一)  : http://blog.itpub.net/26736162/viewspace-1349705/     MySQL 5.6.21下载安装之安装篇(二): http://blog.itpub.net/26736162/viewspace-1349

解决远程登录mysql数据库报1130错误

现象:安装好mysql后,发现phpmyadmin不能登录mysql,返回1130错误,但是在mysql命令行登录mysql -u root -p可以 分析过程及解决方案: 百度查询mysql的1130错误是远程连接的用户无远程权限问题导致.解决方案:在本机登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称'%'. mysql -u root -p mysq

就是刚出来工作 经理今天安排了个任务 大致就是用NHibernate技术把从页面获得的数据保存到MYSQL数据库

问题描述 就是刚出来工作经理今天安排了个任务大致就是用NHibernate技术把从页面获得的数据保存到MYSQL数据库,给了时限半个月,有没有好心的大神帮帮我啊,这个技术一无所知,谢谢了 解决方案 解决方案二:我们从来瞧不上NHibernate,累赘得会死人的.要访问MySQL,读写一堆.net对象,直接写sql语句与之交互就行了.不用学习半个月,最多2天半就行了.解决方案三:建议你先把数据写到MySQL数据库中(创建1.2个数据表来保存你的数据),然后再开始考虑NHibernate.解决方案四

Log4j输出到mysql数据库

问题描述 Log4j输出到mysql数据库 用MDC.put()将值放进去,再使用log.info()触发.但是触发前总会有一行空白的字段自动添加进去.这是什么原因?怎么设置自定义级别呢?就是当我想输出到数据库就输出,不想就不输出,应该怎么写呢? 解决方案 http://blog.csdn.net/yaerfeng/article/details/18151339 解决方案二: http://xialiang19851204.blog.163.com/blog/static/3720773520