zoukankan      html  css  js  c++  java
  • 8-MySQL DBA笔记-测试基础

    第三部分 测试篇
    测试需要掌握的知识面很广泛,本篇的关注点是数据库的性能测试和压力测试,对于其他领域的测试,由于涉猎不多,笔者就不做叙述了。
    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)测试需要和各方都进行信息沟通,在充分了解软件的情况下再设计测试场景。

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

  • 相关阅读:
    POJ 2987:Firing(最大权闭合图)
    BZOJ 1001:[BeiJing2006]狼抓兔子(最小割)
    HDU 1007:Quoit Design(分治求最近点对)
    POJ 1986:Distance Queries(倍增求LCA)
    HDU 3879 && BZOJ 1497:Base Station && 最大获利 (最大权闭合图)
    BZOJ-1011 遥远的行星
    BZOJ-1044 木棍分割
    BZOJ-1042 硬币购物
    BZOJ-1050 旅行
    BZOJ-1037 生日聚会
  • 原文地址:https://www.cnblogs.com/BradMiller/p/12036095.html
Copyright © 2011-2022 走看看