第三部分 测试篇
测试需要掌握的知识面很广泛,本篇的关注点是数据库的性能测试和压力测试,对于其他领域的测试,由于涉猎不多,笔者就不做叙述了。
DBA的工作职责之一就是评估软硬件,这往往是一项很耗时的工作,
本书将分两个章节为读者介绍数据库的性能、压力测试所需要掌握的理论知识,并提供一个简单的基准测试模型以供大家参考。
这部分内容对于大部分中小型公司来说应该够用了。
第8章 测试基础
本章将为读者介绍测试数据库要掌握的一些概念、步骤和注意事项。
很多时候,我们在做架构设计时会拿不定主意,而这是源于对软硬件的极限不是很清楚,通过测试所获得的经验将为我们进行决策提供依据。
在做测试之前,我们需要知道应该如何测试,以及为什么要这样测试。
随着经验的增长,我们将越来越擅长于数据库软硬件的测试,还可以根据自己的需求灵活地进行测试工作。
8.1 基础概念
数据库性能测试一般是指通过运行测试程序来衡量硬件或软件(编译器、数据库等)在不同架构下的性能。
测试的含义很广,包括数据流各个环节的测试,本书如果不加以特别说明,指的就是数据库的性能测试或压力测试。
在现实生产环境中,对 于性能测试或压力测试并没有进行清晰地划分,本书也不会分别加以论述,我们可以认为压力测试是性能测试的一个特例。
衡量数据库性能的主要指标包括事务吞吐率和响应时间,同样,测试的时候也主要是考虑这两个指标。
事务吞吐率是指数据库操作的速率,即每秒能完成多少事务,由于MySQL InnoDB默认的模式是自动提交,所以也可以近似地将其看作每秒查询数。
响应时间指的是响应请求的总耗时,包括等待时间、执行时间及传输数据的时间。
现实中,我们往往过于看重事务吞吐率,而忽略了响应时间,在生产环境下,应该意识到,合理的响应时间范围内的事务吞吐率才有意义。
因为,如果没有稳定、良好的用户体验,事务吞吐率再高也没有什么意义。

8.2 性能测试的目的
我们可能会出于不同的目的对数据库主机的性能进行测试,具体测试内容如下。
建立自己的基准指标,也就是基准测试。
在采购服务器时,可能需要测试不同软硬件组合配置下的数据库性能,以选取性价比较高的那个方案。
对比不同系统参数或数据库参数配置下的数据库性能。
对比不同的数据库产品。
对比数据库不同版本之间的差异。
对一些新特性进行试用和验证。
对一些操作系统补丁和数据库补丁进行验证。
对比不同的操作系统、文件系统和库的差异。
如果都是比较成熟的数据库产品,那将很难证明在所有指标上,一个产品完胜另外一个产品,产品的设计哲学往往决定了它的优势和劣势,或者说安全、效率、价格、稳定这些因素往往不可兼得。
所以我们进行测试的目的不是要证明存在一个完美的产品,而是在损失可以接受的范围内,进行合理地软硬件配置。
比如,插入数据的速度慢一些往往无关紧要,如果可以有更高的压缩率、更高的存储效率的话,那么比较低的插入速度是可以接受的。
对于数据库产品来说,除了传统的性能指标之外,还需要考虑一些非常重要的影响现实决策的因素。
比如灾难恢复、存储效率、对于复杂业务逻辑的支持、对于其他数据库产品的兼容程度等,
这些内容在测试篇中不会加以阐述,在性能调优与架构篇中会详细讲述这部分的内容,以帮助大家了解如何选择一个适合自己业务的数据库产品。

8.3 基准测试
基准测试是我们依据自身的软硬件配置所做的一个数据库性能测试,它能够尽可能地覆盖生产中的一般场景。
随着软硬件的升级换代,基准测试的相应指标可能也需要做一些改变。
很多软硬件厂商官方测试结果的数据指标都非常好,但这些往往都是不可信的,
它们可能经过了特殊的调整来适应基准测试软件,从而回避了自身的不足之处,
他们更多是希望展示自己的产品在性能测试中的亮点,因此这些测试结果不太可能适用于真实的世界。
不同的公司有不同的业务特点,所以我们有必要建立自己的测试基准,保存自己的历史测试数据,以便衡量不同的主机、软件、架构及不同时期的性能数据。
虽然很难实现完全适合自己的业务模型,但至少能提供一个相对可靠的模型, 可以用作采购机器、选择数据库产品、启用数据库新特性等的依据。
我们可以依据基准测试的数据来猜测系统大概还有多少性能余量,但由于测试工具存在一定的局限性,因此很难用它来模拟真实场景,所以需要谨慎对待基准测试的数据。
我们应该对于系统的可扩展性、不同数据量下的性能吞吐有一个大概的认识,预先判断瓶颈点可能会出现在哪里。
这些认识和判断往往依赖于经验的累计,随着经验的增长,你自然而然会具备一些意识,这个时候,就可以有针对性地进行测试了,可以更有效地利用基准测试数据了。
而且,一旦我们产生某个想法,就能知道应该改变哪些软硬件配置来验证自己的想法。
一个好的基准测试,应满足如下的一些要素。
(1)有现实意义
基准测试需要具有现实意义,工作负荷、样本数据、系统配置应该和我们测试的目的相关,这样才更有实际意义。
(2)具有可观察性、易理解、文档化
基准测试必须充分文档化,其他人在阅读文档时能够知道你的软硬件环境配置是如何进行测试的,可能还要附上你的配置文件。
并不是所有的人都是专业的,如果你不说明自己的系统、软件版本、负载等信息,其他人在其他系统上可能会得到不同的测试结果。
测试结果往往要在一定的上下文中才有意义,比如一个数据库的I/O测试可能需要包含如下信息:
负载是什么样的?使用了什么软硬件、什么测试工具进行测试?数据库是什么版本?测试环境是如何部署的?数据文件多大?
数据写入频率如何?数据文件磁盘空间占比如何?使用何种方式写入数据文件?使用何种方式写日志文件?
使用独立表空间还是共享表空间?使用的是什么文件系统?使用的是什么I/O调度算法?磁盘阵列是什么RAID级别?有带电池的RAID卡吗?
信息记录得越详细越好,不仅方便自己以后参考,也方便其他人对比不同配置下的测试结果。
(3)可运行且具有可重复性
基准测试是可以重复进行得到类似结果的。所以务必要减少干扰因素,尽可能让其他人可以按照你文档描述的步骤得到一样的结果。
当然,也不能忽视干扰的存在,比如定时守护,其他用户的操作等。
对于云上的环境来说,由于对其他用户不可见,因此相对于传统的主机环境来说,更加难以确认干扰。
基于此,我们需要熟悉数据流的各个环节,比如负载均衡设备、 Web服务器、数据库服务器、应用服务器、存储设备等,
将这些环节映射到我们的模型中,可以帮助我们发现一些之前被忽略的干扰源。
(4)收集足够的信息
基准测试应该尽可能地收集信息,比如内存占用、I/O性能、CPU性能等。
收集尽可能多的信息总是一件好事,因为这样做有利于分析问题和发现问题。
(5)有分析结果
要对基准测试结果进行分析、看和我们预期的是否一样,和经验常识是否一致。不能只提供数据而不提供分析结果。
(6)要对基准测试结果进行解释和说明
我们应该说明测试结果中的一些异常状况,比如是否有错误、异常或干扰,如果有一些不可理解的地方,也请描述出来,也许有经验的其他人员可以帮助你进行分析。
如果和我们预期的不一致,那么也有可能是我们的测试方法有问题,或者被其他的因素干扰了。
总之,如果测试结果有很多不能解读的地方,那么建议不要在公开场合发布。
此外,因为基准测试很耗时,所以有时会让初级工程师进行基准测试,然后让高级工程师查看性能记录,并分析和解释基准测试数据。
这样做并不好,最好是在进行基准测试的时候就能够实时查看。

8.4 性能/基准测试的步骤
性能测试需要合理的计划和有条理的步骤,不能随意得出结论,性能测试的大概步骤如下。
1)明确测试目的。
2)设计测试模型。
3)准备测试集群环境。
4)准备压力测试工具或编写压力测试脚本。
5)明确性能指标并加以监控。
6)根据2)设计的测试模型准备测试数据。
7)测试执行。
8)测试分析。
第9章会详述如何进行测试。

8.5 测试的注意事项
1)需要明白,干扰是必然存在的。
干扰是必然存在的,比如定时守护、其他用户的操作等。
性能测试所处的环境可能是不干净的,即使你认为很干净了,仍然可能有你所不知道的因素影响测试结果。
干扰的来源可能不那么清晰,如果你需要仔细研究系统性能,你就需要确定它。
数据流的各个环节,如负载均衡设备、Web服务器、数据库服务器、应用服务器、存储设备都可能存在干扰,而有些环节你不能忽略。
对于一些云上的环境,由于你和其他用户共享资源,其他用户的活动也可能会影响到你,而你在一个客户环境内,是很难知道物理系统的资源竞争的。
现在的应用环境,往往包含了多个组件,如负载均衡软硬件设备、Web服务器、数据库服务器、存储系统等。
有一个足够真实的模拟环境,可以及早发现干扰的源头。
各个组件对照物理环境独立部署,互不影响,可以更好地确保测试结果的可靠性。
2)性能/压力测试,往往需要时间预热,需要不那么平均分布的数据。
笔者见过很多不完善的测试报告,可能是测试者为了赶进度,测试时间比较短,这点可以理解,因为大家的时间都很紧张。
但实际上,我们的测试是需要足够多的时间的,要有足够多的时间进行预热,当一些热点数据加载到内存中时,数据才可能更符合实际生产情况。
现在流行的测试工具或方法,往往是对平均分布的数据进行测试,但真实的负载往往是不均匀的,可能某部分数据比较“热”,
某部分数据则基本没有被访问,或者基于某些索引值只有少量结果,而另一些索引值则会检索到大量的记录,
所以如果我们的真实数据确实存在比较突出的数据不均匀现象,那么测试的时候最好也让数据变得不均匀。
在真实环境中,数据往往也有“碎片”,很多性能测试,往往就是直接装载数据,然后马上开始进行测试,
但实际上,应该尽量采取一些操作,让数据变得不那么“整齐”,比如在INSERT、UPDATE或DELETE数据的时候按随机的key顺序进行操作,
有“碎片”的数据应该是正常的,应该模拟出这种效果。
3)性能/压力测试,需要真实的数据。数据量不够大,往往难以反映真实的瓶颈所在。
4)模拟真实的环境总是困难的,从真实环境引流是一个可以考虑的策略。
5)测试程序应该是多线程的。如果是单线程的话,则需要多个实例来运行,以提高吞吐率。
6)测试需要和各方都进行信息沟通,在充分了解软件的情况下再设计测试场景。

小结:
本章叙述了性能测试需要掌握的一些基础知识和方法学,它是一项繁琐又耗时的工作,甚至有时会给你带来挫败感。
掌握足够多的理论,有其他领域的知识储备,才能能够选择正确的测试策略,设计良好的测试步骤,从而达到测试的目的。
测试之后的文档整理工作也很重要,虽然不那么有趣,但是如果要发布你的测试,让别人知道你的成果,你就应该认真对待它。

8-MySQL DBA笔记-测试基础的更多相关文章

  1. 3-MySQL DBA笔记-开发基础

    第二部分 开发篇 本篇首先讲述数据库开发的一些基础知识,如关系数据模型.常用的SQL语法.范式.索引.事务等,然后介绍编程开发将会涉及的数据库的一些技巧,最后结合生产实际,提供一份开发规范供大家参考. ...

  2. 9-MySQL DBA笔记-测试实践

    第9章 测试实践 在第8章中介绍了测试所需要的理论知识,本章将为读者讲述实际的测试过程.实际测试一般包括硬件测试.MySQL基准测试及应用服务压力测试,下面将分别讲述这三方面的内容.此外,测试工具的选 ...

  3. mysql学习笔记之基础篇

    数据库学习之基础篇 ① 开放数据库互连(Open Database Connectivity,ODBC ② 结构化查询语言(Structured Query Language) ③ 进入mysql:M ...

  4. MySQL学习笔记2————基础篇记录

    这里以实验楼的数据库来记录,如有侵犯实验楼权益,请联系本人,必定删除 在此感谢实验楼提供的免费教程 MySQL 基础课程_SQL - 实验楼 一. 表project employee 任务:想要知道名 ...

  5. 10-MySQlL DBA笔记-基础知识

    第四部分 运维篇 首先来了解一下数据库的定义,数据库是高效的.可靠的.易用的.安全的多用户存储引擎,我们可以通过它访问大量的持久化数据.我们管理和维护数据库,本质上也是要确保如上的特性,尽可能地保证数 ...

  6. 1-MySQL DBA笔记-理解MySQL

    第一部分 入门篇 本篇首先介绍MySQL的应用领域.基础架构和版本,然后介绍MySQL的基础知识,如查询的执行过程.权限机制.连接.存储引擎,最后阐述一些基础概念. 第1章 理解MySQL 本章将介绍 ...

  7. 招聘前端、Java后端开发、测试、Mysql DBA

    公司介绍: http://www.lagou.com/gongsi/43095.html http://www.yamichu.com 简历发到: zhuye@yamichu.com 招聘职位: JA ...

  8. 读书笔记——《MySQL DBA 工作笔记》

    关于前言 作者在前言中提出的一些观点很具有参考价值, 梳理完整的知识体系 这是每一个技术流都应该追逐的,完整的知识体系能够使我们对知识的掌握更加全面,而不仅仅局限于点 建立技术连接的思维,面对需求,永 ...

  9. MySQL入门笔记

    MySQL入门笔记 版本选择: 5.x.20 以上版本比较稳定 一.MySQL的三种安装方式: 安装MySQL的方式常见的有三种: ·          rpm包形式 ·          通用二进制 ...

随机推荐

  1. Ubuntu 18.04安装Samba服务器及配置

    Ubuntu 18.04安装Samba服务器及配置 局域网下使用samba服务在Linux系统与Windows系统直接共享文件是一项很方便的操作.以Ubuntu为例配置samba服务,Linux服务器 ...

  2. VUE数组操作方法的局限

    1.不能通过索引值直接设置一个项: vm.items[indexOfItem] = newValue 但是可以用set方法设置: Vue.set(example1.items,indexOfItem, ...

  3. Java同步数据结构之CopyOnWriteArrayList/CopyOnWriteArraySet

    前言 前面介绍完了队列(包括双端队列),今天探讨以下Java并发包中一个List的并发数据结构实现CopyOnWriteArrayList,顾名思义CopyOnWriteArrayList也是一种基于 ...

  4. C# 去除所有的html标签

    /// <summary> /// 去除所有的html标签 /// </summary> /// <param name="strhtml">& ...

  5. 反射序列化字段的时候,需要添加[Datamember]不然会,忽略这个字段

    反射序列化字段的时候,需要添加[Datamember]不然会,忽略这个字段

  6. img标签替换为mip-img标签的方法

    function replaceMipImages($content){ preg_match_all('/<img (.*?)\>/', $content, $images); if(! ...

  7. 分组卷积+squeezenet+mobilenet+shufflenet的参数及运算量计算

    来一发普通的二维卷积 1.输入feature map的格式为:m * m * h1 2.卷积核为 k * k 3.输出feature map的格式为: n * n * h2 参数量:k * k * h ...

  8. CBES = component-based entity system

    比较好的介绍 CBES 的文章 http://www.richardlord.net/blog/what-is-an-entity-framework

  9. golang web框架设计1:框架规划

    GO WEB 编程13节,如何设计一个web框架 学习谢大的web框架设计 总体介绍 实现一个简易的web框架,我们采用mvc模式来进行开发. model:模型,代表数据结构.通常来说,模型类时包含查 ...

  10. Oracle中替换字符中空格、制表符、换行符、回车符

    引用:https://blog.csdn.net/linminqin/article/details/7386510 特殊符号ascii定义 制表符 chr(9)  换行符 chr(10) 回车符 c ...