前言
简介
本文经验都是我看书学习的总结的一些经验,面试常问的知识点,所以请关注后再继续观看学习!下面已经给出了书的目录!今后将按目录的顺序继续更新学习心得!接上文继续分享
目标
希望通过这些MySQL的内部原理的知识可以帮助大家培养发现新问题的洞察力,能学习和实践的结合设计出维护基于MySQL的系统。
本篇文章讲述的是基准测试,MySQL的应用的基准测试的重要性,策略和工具。sysbeanch! 学MySQL性能的大多数是要进互联网行业的,进互联网行业不知道基准测试,性能测试,压力测试的能说的过去嘛!
更新目录
第一章:数据库基础知识(已更新完)第二章:基准测试(已更新完)第三章:服务器性能刨析 第四章:Schema与数据库类型优化 第五章:创建高性能的索引 第六章:查询性能优化 第七章:MySQL高级特性 第八章:优化服务器设置 第九章:操作系统和硬件优化 第十章:复制底层实现 第十一章:可扩展的MySQL 第十二章:高可用性 第十三章:云端的MySQL 第十四章:应用层优化 第十五章:备份与恢复 第十六章:MySQL用户工具
正文
为什么需要基准测试?
基准测试是什么,为什么?
基准测试是MySQL新手和专家都需要掌握的一项基本技能!是针对系统涉及的一种压力测试,目标是为了掌握系统的行为或者做新硬件的可靠性测试。基准测试可以观察系统在不同压力下的行为,评估系统的容量,掌握哪些重要的变化,或者观察系统如何处理不同的数据。这里只关注与性能相关的测试!
- 验证基于系统的一些假设,确认这些假设是否符合实际情况
- 重现系统中的某些异常行为,以解决这些异常
- 测试系统当前的运行情况
- 模拟比当前系统更高的负载,找出系统随着压力增加而可能遇到扩展性瓶颈
- 规划业务未来的增长
- 测试应用适应可变环境的能力
- 测试不同的硬件,软件和操作系统配置
- 证明新采购的设备是否配置正确
区别在哪?
- 基准测试相当于给施加一个压力,但是不是真实压力 。对真实压力来说,通常比较简单,真实压力是不可预期的,真实压力在测试的时候更难得出结论
- 影响基准测试的有数据量,数据,查询的分布。最重要的一点是基准测试往往是要尽可能快的执行完成,所以往往会给系统施加过多的压力。
TIP:举个例子,使用新数据库系统上线后往往要测试当前系统可以支持多大的业务增长?首先对原系统做一个基准测试,然后再对新系统做一个基准测试,结果发现新系统比原系统多40倍的TPS(每秒事务数)。这时不能简单的推断支持40倍的业务增长!因为随着系统的发展我们的用户,流量,数据以及数据之间的交互都在增长。最后得出结论我们只能进行大概的测试来确定系统大致的余量是多少!
基准测试的策略
基准测试主要分两种策略
- 针对整个系统的整体测试也称为集成式基准测试
- 单独测试MySQL也被称为单组件式基准测试
集成式基准测试原因
- 测试整个应用系统,包括web服务器,应用代码,网络和数据库是非常有用的,因为用户关注的是整体的性能而不是单独的性能
- 只有对整体进行测试,才能发现通过整体测试发现各部分之间的缓存带来的影响
- MySQL并非应用的瓶颈,通过整体测试可以证明这一点
- 整体测试更能揭示应用的真实表示,而单组件基准测试很难达到这样的效果
单组件式基准测试原因
- 需要比较不同的schema或查询的性能
- 针对应用中某个具体问题的测试
- 为了避免漫长的基准测试们可以通过短期的测试来检测出某些调整后的效果
测试何种指标
- 吞吐量:吞吐量是指单位时间内的事务处理数,非常适用于多用户的交互式应用。测试单位是每秒事务数(TPS),有些也采用每分钟事务数(TPM)
- 响应实际或延迟:用于测试任务所需的整体时间。测试单位是秒,毫秒,微秒,分钟。通过我们可以使用百分之响应时间来替代最大响应时间。例如:95%的响应时间都是5毫秒,表示任务在95%的时间段内5毫秒之内完成。
- 并发性:并发性是非常容易误解,误用,误解的一个性能指标。正确的答案是在任意时间有多少同时发生的并发请求。Web的高并发一般也会导致数据库的高并发。(例如:一个良好的应用,同时可以打开成百上千个MySQL数据库服务器连接但只有少数在执行查询。所以说web站点50000个用户,并发有可能只有10-15个)。我们需要关注的是正在工作的并发操作。当并发增加观察吞吐量是否下降以及响应时间是否拉长。
- 可扩展性:在系统业务压力发生变化的情况下,扩展性就非常重要了。可扩展性指给系统增加一倍的工作,在理想情况下就获得两倍的结果(吞吐量增加一倍)。或者说给系统增加一倍的资源(两倍的CPU),就可以获得两倍的吞吐量。
TIP:着重测试根据当前业务对用户来说最重要的指标。
基准测试的方法
在了解基本概念之后我们来看一下具体怎么设计和执行吧。先看一下如何避免一些常见的错误,这些错误可能导致测试结果无用或者不精确。只有避免了下列错误才能走上改进测试质量的漫漫长路。
- 使用真实数据的子集而不是全集。例如当前应用需要100G数据。测试只有1G
- 使用错误的数据分布。例如使用均匀分布的数据测试,而系统的真实数有很多热点区域。
- 使用不真实的分布参数,假如所有的用户个人信息都会被平均地读取。
- 在多用户场景,只做单用户测试
- 在单服务器上测试分布式应用
- 与真实用户行为不匹配
- 反复执行同一个查询
- 没有检查错误。
- 忽略了系统预热的过程
- 使用默认的服务器配置
- 测试时间太短
设计与规划
提出问题并明确目标,决定采用标准的基准测试还是设计专用的测试。
如果采用标准的基准测试应该确认选择合适的测试方案。例如不要使用TPC-H测试电子商务系统,因为TPC-H是即席查询和决策支持型应用的基准测试,不适合OLTP系统。
如果采用设计专用的测试,它是很复杂的,往往需要一个迭代的一个过程。首先要获得生产数据集的快照,并且容易还原快照,以便后续测试。
针对数据查询可以建立一个单元测试集作为初步测试,并运行多遍。但是这和真实的数据库环境还是存在偏差的,为了更好的模拟现场的数据库环境建议选择一个具有代表性的时间段,比如高峰期的一个小时,或者一整天。
应该运行多长时间
基准测试应该运行足够长的时间,这一点非常重要。如果系统有大量的数据和内存,要达到稳定状态可能需要非常长的时间。大部分系统都会有一些突发情况的余量,能够吸收性能的剑锋,延迟到高峰后运行。
获取系统性能和状态
需要记录的数据包括系统状态和性能指标,诸如CPU使用率,磁盘IO,网络流量统计,show geobal status计数器等。
获取准确的测试结果
获取准确的测试结果要注意很多因素,比如外部的压力,性能分析和监控系统,详细的日志记录,周期性作业以及其他因素都会影响测试的结果。
如果测试的数据出现了异常,不要轻易当做坏数据而丢弃,应该认真研究并找到产生这种结构的原因。
基准测试工具
集成式测试工具
ab:ab是一个Apache HTTP服务器基准测试工具。它可以测试HTTP服务器每秒最多可以处理多少请求。如果测试的是Web应用服务,这个结果可以转换成整个应用每秒可以满足多少请求。只能针对单个URL进行尽可能快的压力测试。
http_load:这个工具和ab差不多,也被设计为对Web服务器进行测试,但比ab要更加灵活。可以通过一个输入文件提供多个URL,http_load在这些url中随机选择进行测试。也可以定制http_load使其按照时间比率进行测试,而不仅仅是测试最大请求处理能力。
JMeter:一个Java应用程序,可以加载其他应用并测试其性能。它虽然是设计用来测试Web应用的。但也可以利用测试其他例如FTP服务器,或者通过JDBC进行数据库查询测试。JMeter比ab和http_load复杂的多,它可以通过控制预热时间等参数,更加灵活的模拟真实的用户的访问。JMeter拥有绘图接口,还可以对测试进行记录,然后离线重演测试结果。
单组件式测试工具
mysqlslap:可以模拟服务器的负载并输出计时信息。如果没有指定SQL语句,mysqlslap会自动生成查询schema的select语句。
MySQL Benchmark Suite:MySQL发行包中也提供了一款自己的基准测试套件,可以用于在不同数据库服务器上进行比较测试。它是单线程的,主要用于测试服务器执行查询的速度。结果会显示哪种类型的操作在服务器上执行得更快。这个套件的好处是包含了大量预定义的测试,容易使用,所以可以很轻松地用于比较不同的存储引擎或不同配置的性能测试。也可以用于高层次测试比较两个服务器的整体性能。缺点是:单用户模式,测试的数据集很小且用户无法指定数据测试,并同一个测试多次运行的结果可能会相差很大。因为是单线程串行执行的,所以无法测试多CPU能力,只能用于比较单CPU服务器的性能差别。使用这套还要有BDB和Perl的支持。
super smack:是一款基于MySQL和PostgreSQL的基准测试工具。可以提供压力测试和负载生成。这是一个复杂而强大的工具,可以模拟多用户访问,可以加载测试数据到数据库,并支持使用随机数据填充测试表。
Database Test Suite:这是一款类似某些工业标准测试的测试工具集。
Perconas TPCC-MySQL Tool:这是一个类似TPC-C的基准测试工具集,在评估大压力下MySQL的一些行为时,我们经常会使用这个工具进行测试。
sysbench:是一款多线程系统压测工具。它可以根据影响数据库服务器性能的各种因素来评估系统的性能。可以测试文件IO,操作系统调度器,内存分配和传输速度,posix线程以及数据库服务器等。支持lua脚本语言,lua对于各种测试场景的设置可以非常灵活。sysbench是非常好的一种全能测试工具,支持MySQL,操作系统和硬件测试。
总结
以上知识基本都是关于基准测试的,每一个MySQL的使用者都应该或多或少的懂一些这方面的知识。不仅是用来解决业务问题的一种实践行动,也是一种很好的学习方法。学习如何将问题分解成可以通过基准测试来获得答案的方法。
如果没做过基准测试,建议从sysbench开始熟悉。可以先学习oltp和fileio测试。oltp可以很方便得比较不同系统的性能。另一方面文件系统和磁盘基准测试,则可以在系统出现问题时有效地诊断和隔离异常的组件