96SEO 2026-02-20 04:22 15
新手和专家都需要掌握的一项基本技能。

简单地说基准测试是针对系统设计的一种压力测试。
通常的目标是为了掌握系统的行为。
但也有其他原因如重现某个系统状态或者是做新硬件的可靠性测试。
本章将讨论
基准测试是一种测量和评估软件性能指标的活动例如对数据访问的带宽和延迟、对计算机的
的运算能力、作业吞吐能力是不是可以满足应用程序的要求从这两个例子能够看出测试的结果是可以量化表现的按照测试过程实现的结果是相同或处于可接受的区间内的、测试对象的测试结果是具有线性关系的满足以上三点的就是基准测试。
为什么基准测试很重要因为基准测试是唯一方便有效的、可以学习系统在给定的工作负载下会发生什么的方法。
基准测试可以观察系统在不同压力下的行为评估系统的容量掌握哪些是重要的变化或者观察系统如何处理不同的数据。
基准测试可以在系统实际负载之外创造一些虚构场景进行测试。
基准测试可以完成以下工作或者更多
验证基于系统的一些假设确认这些假设是否符合实际情况。
重现系统中的某些异常行为以解决这些异常。
测试系统当前的运行情况。
如果不清楚系统当前的性能就无法确认某些优化的效果如何。
也可以利用历史的基准测试结果来分析诊断一些无法预测的问题。
模拟比当前系统更高的负载以找出系统随着压力增加而可能遇到的扩展性瓶颈。
规划未来的业务增长。
基准测试可以评估在项目未来的负载下需要什么样的硬件需要多大容量的网络以及其他相关资源。
这有助于降低系统升级和重大变更的风险。
测试应用适应可变环境的能力。
例如通过基准测试可以发现系统在随机的并发峰值下的性能表现或者是不同配置的服务器之间的性能表现。
基准测试也可以测试系统对不同数据分布的处理能力。
测试不同的硬件、软件和操作系统配置。
比如
的版本能改善性能吗为当前的数据采用不同的存储引擎会有什么效果所有这类问题都可以通过专门的基准测试来获得答案。
证明新采购的设备是否配置正确。
笔者曾经无数次地通过基准测试来对新系统进行压测发现了很多错误的配置以及硬件组件的失效等问题。
因此在新系统正式上线到生产环境之前进行基准测试是一个好习惯永远不要相信主机提供商或者硬件供应商的所谓系统已经安装好并且能运行多快的说法。
如果可能执行实际的基准测试永远是一个好主意。
基准测试还可以用于其他目的比如为应用创建单元测试套件。
但本章我们只关注与性能有关的基准测试。
基准测试的一个主要问题在于其不是真实压力的测试。
基准测试施加给系统的压力相对真实压力来说通常比较简单。
真实压力是不可预期而且变化多端的有时候情况会过于复杂而难以解释。
所以使用真实压力测试可能难以从结果中分析出确切的结论。
基准测试的压力和真实压力在哪些方面不同有很多因素会影响基准测试比如数据量、数据和查询的分布但最重要的一点还是基准测试通常要求尽可能快地执行完成所以经常给系统造成过大的压力。
在很多案例中我们都会调整给测试工具的最大压力以在系统可以容忍的压力阈值内尽可能快地执行测试这对于确定系统的最大容量非常有帮助。
然而大部分压力测试工具不支持对压力进行复杂的控制。
务必要记住测试工具自身的局限也会影响到结果的有效性。
使用基准测试进行容量规划也要掌握技巧不能只根据测试结果做简单的推断。
例如假设想知道使用新数据库服务器后系统能够支撑多大的业务增长。
首先对原系统进行基准测试然后对新系统做测试结果发现新系统可以支持原系统
倍的业务增长。
这是因为在业务增长的同时系统的流量、用户、数据以及不同数据之间的交互都在增长它们不可能都有
倍时应用本身的设计也可能已经随之改变。
可能有更多的新特性会上线其中某些特性可能对数据库造成的压力远大于原有功能。
而这些压力、数据、关系和特性的变化都很难模拟所以它们对系统的影响也很难评估。
结论就是我们只能进行大概的测试来确定系统大致的余量有多少。
当然也可以做一些真实压力测试和基准测试有区别但在构造数据集和压力的时候要特别小心而且这样就不再是基准测试了。
基准测试要尽量简单直接结果之间容易相互比较成本低且易于执行。
尽管有诸多限制基准测试还是非常有用的只要搞清楚测试的原理并且了解如何分析结果所代表的意义。
基准测试有两种主要的策略一是针对整个系统的整体测试另外是单独测试MySQL。
这两种策略也被称为集成式full-stack以及单组件式single-component基准测试。
针对整个系统做集成式测试而不是单独测试MySQL的原因主要有以下几点
测试整个应用系统包括Web服务器、应用代码、网络和数据库是非常有用的因为用户关注的并不仅仅是MySQL本身的性能而是应用整体的性能。
MySQL并非总是应用的瓶颈通过整体的测试可以揭示这一点。
只有对应用做整体测试才能发现各部分之间的缓存带来的影响。
整体应用的集成式测试更能揭示应用的真实表现而单独组件的测试很难做到这一点。
另外一方面应用的整体基准测试很难建立甚至很难正确设置。
如果基准测试的设计有问题那么结果就无法反映真实的情况从而基于此做的决策也就可能是错误的。
或查询的性能。
针对应用中某个具体问题的测试。
为了避免漫长的基准测试可以通过一个短期的基准测试做快速的“周期循环”来检测出某些调整后的效果。
的基准测试也是有用的但是数据本身和数据集的大小都应该是真实的。
如果可能可以采用生产环境的数据快照。
不幸的是设置一个基于真实数据的基准测试复杂而且耗时。
如果能得到一份生产数据集的拷贝当然很幸运但这通常不太可能。
比如要测试的是一个刚开发的新应用它只有很少的用户和数据。
如果想测试该应用在规模扩张到很大以后的性能表现就只能通过模拟大量的数据和压力来进行。
在开始执行甚至是在设计基准测试之前需要先明确测试的目标。
测试目标决定了选择什么样的测试工具和技术以获得精确而有意义的测试结果。
可以将测试目标细化为一系列的问题比如“这种
有时候需要用不同的方法测试不同的指标。
比如针对延迟latency和吞吐量throughput就需要采用不同的测试方法。
吞吐量指的是单位时间内的事务处理数。
这一直是经典的数据库应用测试指标。
一些标准的基准测试被广泛地引用如
而且很多数据库厂商都努力争取在这些测试中取得好成绩。
这类基准测试主要针对在线事务处理OLTP的吞吐量非常适用于多用户的交互式应用。
常用的测试单位是每秒事务数TPS有些也采用每分钟事务数TPM。
这个指标用于测试任务所需的整体时间。
根据具体的应用测试的时间单位可能是微秒、毫秒、秒或者分钟。
根据不同的时间单位可以计算出平均响应时间、最小响应时间、最大响应时间和所占百分比。
最大响应时间通常意义不大因为测试时间越长最大响应时间也可能越大。
而且其结果通常不可重复每次测试都可能得到不同的最大响应时间。
因此通常可以使用百分比响应时间percentile
time来替代最大响应时间。
例如如果95的响应时间都是5毫秒则表示任务在
使用图表有助于理解测试结果。
可以将测试结果绘制成折线图比如平均值折线或者95百分比折线或者散点图直观地表现数据结果集的分布情况。
通过这些图可以发现长时间测试的趋势。
本章后面将更详细地讨论这一点。
并发性是一个非常重要又经常被误解和误用的指标。
例如它经常被表示成多少用户在同一时间浏览一个
协议是无状态的大多数用户只是简单地读取浏览器上显示的信息这并不等同于
服务器的并发性也不等同于数据库的并发性而仅仅只表示会话存储机制可以处理多少数据的能力。
Web服务器的并发性更准确的度量指标应该是在任意时间有多少同时发生的并发请求。
服务器的高并发一般也会导致数据库的高并发但服务器采用的语言和工具集对此都会有影响。
注意不要将创建数据库连接和并发性搞混淆。
一个设计良好的应用同时可以打开成百上千个
换句话说并发性基准测试需要关注的是正在工作中的并发操作或者是同时工作中的线程数或者连接数。
当并发性增加时需要测量吞吐量是否下降响应时间是否变长如果是这样应用可能就无法处理峰值压力。
并发性的测量完全不同于响应时间和吞吐量。
它不像是一个结果而更像是设置基准测试的一种属性。
并发性测试通常不是为了测试应用能达到的并发度而是为了测试应用在不同并发下的性能。
当然数据库的并发性还是需要测量的。
可以通过
在系统的业务压力可能发生变化的情况下测试可扩展性就非常必要了。
第11章将更进一步讨论可扩展性的话题。
简单地说可扩展性指的是给系统增加一倍的工作在理想情况下就能获得两倍的结果即吞吐量增加一倍。
或者说给系统增加一倍的资源比如两倍的CPU数就可以获得两倍的吞吐量。
当然同时性能响应时间也必须在可以接受的范围内。
大多数系统是无法做到如此理想的线性扩展的。
随着压力的变化吞吐量和性能都可能越来越差。
可扩展性指标对于容量规范非常有用它可以提供其他测试无法提供的信息来帮助发现应用的瓶颈。
比如如果系统是基于单个用户的响应时间测试这是一个很糟糕的测试策略设计的虽然测试的结果很好但当并发度增加时系统的性能有可能变得非常糟糕。
而一个基于不断增加用户连接的情况下的响应时间测试则可以发现这个问题。
一些任务比如从细粒度数据创建汇总表的批量工作需要的是周期性的快速响应时间。
当然也可以测试这些任务纯粹的响应时间但要注意考虑这些任务之间的相互影响。
批量工作可能导致相互之间有影响的查询性能变差反之亦然。
归根结底应该测试那些对用户来说最重要的指标。
因此应该尽可能地去收集一些需求比如什么样的响应时间是可以接受的期待多少的并发性等等。
然后基于这些需求来设计基准测试避免目光短浅地只关注部分指标而忽略其他指标。
使用真实数据的子集而不是全集。
例如应用需要处理几百GB的数据但测试只有1GB数据或者只使用当前数据进行测试却希望模拟未来业务大幅度增长后的情况。
使用错误的数据分布。
例如使用均匀分布的数据测试而系统的真实数据有很多热点区域随机生成的测试数据通常无法模拟真实的数据分布。
使用不真实的分布参数例如假定所有用户的个人信息profile都会被平均地读取。
在多用户场景中只做单用户的测试。
在单服务器上测试分布式应用。
与真实用户行为不匹配。
例如
页面中的“思考时间”。
真实用户在请求到一个页面后会阅读一段时间而不是不停顿地一个接一个点击相关链接。
反复执行同一个查询。
真实的查询是不尽相同的这可能会导致缓存命中率降低。
而反复执行同一个查询在某种程度上会全部或者部分缓存结果。
没有检查错误。
如果测试的结果无法得到合理的解释比如一个本应该很慢的查询突然变快了就应该检查是否有错误产生。
否则可能只是测试了
检测语法错误的速度了。
基准测试完成后一定要检查一下错误日志这应当是基本的要求。
忽略了系统预热warm
up的过程。
例如系统重启后马上进行测试。
有时候需要了解系统重启后需要多长时间才能达到正常的性能容量要特别留意预热的时长。
反过来说如果要想分析正常的性能需要注意若基准测试在重启以后马上启动则缓存是冷的、还没有数据这时即使测试的压力相同得到的结果也和缓存已经装满数据时是不同的。
使用默认的服务器配置。
第3章将详细地讨论服务器的优化配置。
测试时间太短。
基准测试需要持续一定的时间。
后面会继续讨论这个话题。
如果其他条件相同就应努力使测试过程尽可能地接近真实应用的情况。
规划基准测试的第一步是提出问题并明确目标。
然后决定是采用标准的基准测试还是设计专用的测试。
如果采用标准的基准测试应该确认选择了合适的测试方案。
例如不要使用
设计专用的基准测试是很复杂的往往需要一个迭代的过程。
首先需要获得生产数据集的快照并且该快照很容易还原以便进行后续的测试。
然后针对数据运行查询。
可以建立一个单元测试集作为初步的测试并运行多遍。
但是这和真实的数据库环境还是有差别的。
更好的办法是选择一个有代表性的时间段比如高峰期的一个小时或者一整天记录生产系统上的所有查询。
如果时间段选得比较小则可以选择多个时间段。
这样有助于覆盖整个系统的活动状态例如每周报表的查询、或者非峰值时间运行的批处理作业。
当然做这么多的前提是希望获得完美的基准测试结果实际情况通常不会很顺利。
可以在不同级别记录查询。
例如如果是集成式full-stack基准测试可以记录Web服务器上的
Log。
倘若要重演这些查询就要确保创建多线程来并行执行而不是单个线程线性地执行。
对日志中的每个连接都应该创建独立的线程而不是将所有的查询随机地分配到一些线程中。
查询日志中记录了每个查询是在哪个连接中执行的。
即使不需要创建专用的基准测试详细地写下测试规划也是必需的。
测试可能要多次反复运行因此需要精确地重现测试过程。
而且也应该考虑到未来执行下一轮测试时可能已经不是同一个人了。
即使还是同一个人也有可能不会确切地记得初次运行时的情况。
测试规划应该记录测试数据、系统配置的步骤、如何测量和分析结果以及预热的方案等。
应该建立将参数和结果文档化的规范每一轮测试都必须进行详细记录。
文档规范可以很简单比如采用电子表格spreadsheet或者记事本形式也可以是复杂的自定义的数据库。
需要记住的是经常要写一些脚本来分析测试结果因此如果能够不用打开电子表格或者文本文件等额外操作当然是更好的。
基准测试应该运行足够长的时间这一点很重要。
如果需要测试系统在稳定状态时的性能那么当然需要在稳定状态下测试并观察。
有时候无法确认测试需要运行多长的时间才足够。
如果是这样可以让测试一直运行持续观察直到确认系统已经稳定。
一个简单的测试规则就是等系统看起来稳定的时间至少等于系统预热的时间。
一个常见的错误的测试方式是只执行一系列短期的测试比如每次60秒并在此测试的基础上去总结系统的性能。
在执行基准测试时需要尽可能多地收集被测试系统的信息。
最好为基准测试建立一个将测试结果、配置文件、测试指标、脚本和其他相关说明都保存在其中。
即使有些结果不是目前需要的也应该先保存下来。
多余一些数据总比缺乏重要的数据要好而且多余的数据以后也许会用得着。
需要记录的数据包括系统状态和性能指标诸如
获得准确测试结果的最好办法是回答一些关于基准测试的基本问题是否选择了正确的基准测试是否为问题收集了相关的数据是否采用了错误的测试标准
接着确认测试结果是否可重复。
每次重新测试之前要确保系统的状态是一致的。
如果是非常重要的测试甚至有必要每次测试都重启系统。
一般情况下需要测试的是经过预热的系统还需要确保预热的时间足够长请参考前面关于基准测试需要运行多长时间的内容、是否可重复。
如果预热采用的是随机查询那么测试结果可能就是不可重复的。
如果测试的过程会修改数据或者schema那么每次测试前需要利用快照还原数据。
数据的碎片度和在磁盘上的分布都可能导致测试是不可重复的。
一个确保物理磁盘数据的分布尽可能一致的办法是每次都进行快速格式化并进行磁盘分区复制。
要注意很多因素包括外部的压力、性能分析和监控系统、详细的日志记录、周期性作业以及其他一些因素都会影响到测试结果。
一个典型的案例就是测试过程中突然有cron定时作业启动或者正处于一个巡查读取周期Patrol
cycle抑或RAID卡启动了定时的一致性检查等。
要确保基准测试运行过程中所需要的资源是专用于测试的。
每次测试中修改的参数应该尽量少。
变量控制的理想情况为一个变量。
一般情况下都是通过迭代逐步地修改基准测试的参数而不是每次运行时都做大量的修改。
举个例子如果要通过调整参数来创造一个特定行为可以通过使用分治法divide-and-conquer每次运行时将参数对分减半来找到正确的值。
和查询在某些情况下比如建立一个跨平台的应用时可能想知道同一条查询是如何在两个平台运行的不过这种情况并不多见。
另外基于MySQL的默认配置的测试没有什么意义因为默认配置是基于消耗很少内存的极小应用的。
有时候可以看到一些
采用了默认配置的缘故。
让人无语的是这样明显有误的测试结果还容易变成头条新闻。
最后如果测试中出现异常结果不要轻易当作坏数据点而丢弃。
应该认真研究并找到产生这种结果的原因。
通常来说自动化基准测试是个好主意。
这样做可以获得更精确的测试结果。
因为自动化的过程可以防止测试人员偶尔遗漏某些步骤或者误操作。
另外也有助于归档整个测试过程。
文件或者一组脚本。
脚本语言可以根据需要选择shell、PHP、Perl
等都可以。
要尽可能地使所有测试过程都自动化包括装载数据、系统预热、执行测试、记录结果等。
一旦设置了正确的自动化操作基准测试将成为一步式操作。
如果只是针对某些应用做一次性的快速验证测试可能就没必要做自动化。
但只要未来可能会引用到测试结果建议都尽量地自动化。
否则到时候可能就搞不清楚是如何获得这个结果的也不记得采用了什么参数这样就很难再通过测试重现结果了。
基准测试通常需要运行多次。
具体需要运行多少次要看对结果的记分方式以及测试的重要程度。
要提高测试的准确度就需要多运行几次。
一般在测试的实践中可以取最好的结果值或者所有结果的平均值抑或从五个测试结果里取最好三个值的平均值。
可以根据需要更进一步精确化测试结果。
还可以对结果使用统计方法确定置信区间confidence
interval等。
不过通常来说不会用到这种程度的确定性结果。
只要测试的结果能满足目前的需求简单地运行几轮测试看看结果的变化就可以了。
如果结果变化很大可以再多运行几次或者运行更长的时间这样都可以获得更确定的结果。
获得测试结果后还需要对结果进行分析也就是说要把“数字”变成“知识”。
最终的目的是回答在设计测试时的问题。
理想情况下可以获得诸如“升级到
可以在保持响应时间不变的情况下获得超过50的吞吐量增长”或者“增加索引可以使查询更快”的结论。
如何从数据中抽象出有意义的结果依赖于如何收集数据。
通常需要写一些脚本来分析数据这不仅能减轻分析的工作量而且和自动化基准测试一样可以重复运行并易于文档化。
最简单有效的图形就是将性能指标按照时间顺序绘制。
通过图形可以立刻发现一些问题而这些问题在原始数据中却很难被注意到。
或许你会坚持看测试工具打印出来的平均值或其他汇总过的信息但平均值有时候是没有用的它会掩盖掉一些真实情况。
幸运的是前面写的脚本的输出都可以定制作为
flushing”的问题在刷新落后于检查点时会阻塞所有的活动从而导致吞吐量严重下跌。
95的响应时间和平均响应时间指标都无法发现这个问题也就是说这两个指标掩盖了问题。
但图形会显示出这个周期性的问题请参考图2-3。
图2-3显示的是每分钟新订单的交易量NOTPMnew-order
minute。
从曲线可以看到明显的周期性下降但如果从平均值点状虚线来看波动很小。
一开始的低谷是由于系统的缓存是空的而后面其他的下跌则是由于系统刷新脏块到磁盘导致。
如果没有图形要发现这个趋势会比较困难。
这种性能尖刺在压力大的系统比较常见需要调查原因。
在这个案例中是由于使用了旧版本的
引擎脏块的刷新算法性能很差。
但这个结论不能是想当然的需要认真地分析详细的性能统计。
在性能下跌时SHOW
lock”的线程或者其他类似的现象。
在执行基准测试的时候要尽可能地收集更多的细节数据然后将数据绘制成图形这样可以帮助快速地发现问题。
回忆一下前文提供的两种测试类型集成式测试和单组件式测试。
毫不奇怪有些工具是针对整个应用进行测试也有些工具是针对
或者其他组件单独进行测试的。
集成式测试通常是获得整个应用概况的最佳手段。
已有的集成式测试工具如下所示。
应用服务这个结果可以转换成整个应用每秒可以满足多少请求。
这是个非常简单的工具用途也有限只能针对单个
http://httpd.apache.org/docs/2.0/programs/ab.html
中随机选择进行测试。
也可以定制http_load使其按照时间比率进行测试而不仅仅是测试最大请求处理能力。
更多信息请参考
http://www.acme.com/software/http_load/
应用程序可以加载其他应用并测试其性能。
它虽然是设计用来测试Web应用的但也可以用于测试其他诸如
都要复杂得多。
例如它可以通过控制预热时间等参数更加灵活地模拟真实用户的访问。
JMeter
拥有绘图接口带有内置的图形化处理的功能还可以对测试进行记录然后离线重演测试结果。
更多信息请参考http://jakarta.apache.org/jmeter/。
mysqlslaphttp://dev.mysql.com/doc/refman/5.1/en/mysqlslap.html可以模拟服务器的负载并输出计时信息。
它包含在
或者更新的版本中都可以使用。
测试时可以执行并发连接数并指定SQL语句可以在命令行上执行也可以把
的发行包中也提供了一款自己的基准测试套件可以用于在不同数据库服务器上进行比较测试。
它是单线程的主要用于测试服务器执行查询的速度。
结果会显示哪种类型的操作在服务器上执行得更快。
这个测试套件的主要好处是包含了大量预定义的测试容易使用所以可以很轻松地用于比较不同存储引擎或者不同配置的性能测试。
其也可以用于高层次测试比较两个服务器的总体性能。
当然也可以只执行预定义测试的子集例如只测试
这个套件的最大缺点主要有它是单用户模式的测试的数据集很小且用户无法使用指定的数据并且同一个测试多次运行的结果可能会相差很大。
因为是单线程且串行执行的所以无法测试多
http://dev.mysql.com/doc/en/mysql-benchmarks.html/
Smackhttp://vegan.net/tony/supersmack/是一款用于
的基准测试工具可以提供压力测试和负载生成。
这是一个复杂而强大的工具可以模拟多用户访问可以加载测试数据到数据库并支持使用随机数据填充测试表。
测试定义在“smack”文件中smack
网站http://sourceforge.net/projects/osdldbt/上这是一款类似某些工业标准测试的测试工具集例如由事务处理性能委员会TPCTransaction
测试工具未认证。
之前本书作者经常使用该工具不过现在已经使用自己研发的专用于
测试开发的。
在评估大压力下MySQL的一些行为时我们经常会利用这个工具进行测试简单的测试一般会采用
https://launchpad.net/perconatools
sysbenchhttps://launchpad.net/sysbench是一款多线程系统压测工具。
它可以根据影响数据库服务器性能的各种因素来评估系统的性能。
例如可以用来测试文件
http://www.mysqlperformanceblog.com/
http://www.mysqlperformanceblog.com/page/2/
http://www.mysqlperformanceblog.com/mysql-patches/
http://www.mysqlperformanceblog.com/mysql-performance-presentations/
http://www.mysqlperformanceblog.com/2006/09/06/slow-query-log-analyzes-tools/http_load最简单的用法就是循环请求给定的
19测试的结果很容易理解只是简单地输出了请求的统计信息。
下面是另外一个稍微复杂的测试还是尽可能快地循环请求给定的
系统上默认的路径是/usr/share/mysql/sql-bench。
在用这个工具集测试前应该读一下README文件了解使用方法和命令行参数说明。
如果要运行全部测试可以使用如下的命令
output/RUN-mysql_fast-Linux_2.4.18_686_smp_i686运行全部测试需要比较长的时间有可能会超过一个小时其具体长短依赖于测试的硬件环境和配置。
如果指定了--log命令行则可以监控到测试的进度。
测试的结果都保存在
可以执行多种类型的基准测试它不仅设计用来测试数据库的性能也可以测试运行数据库的服务器的性能。
实际上Peter
的测试场景来测试各个子系统的性能这些测试可以用来评估系统的整体性能瓶颈。
后面再演示如何测试数据库的性能。
测试在MySQL用户的工具包中这应该是最有用的工具之一。
尽管有其他很多测试工具可以替代
位整数测试计算素数直到某个最大值所需要的时间。
下面的例子将比较两台不同的
61.8596s测试的结果简单打印出了计算出素数的时间很容易进行比较。
在上面的测试中第二台服务器的测试结果显示比第一台快两倍。
测试的第一步是准备prepare阶段生成测试用到的数据文件生成的数据文件至少要比内存大。
如果文件中的数据能完全放入内存中则操作系统缓存大部分的数据导致测试结果无法体现I/O密集型的工作负载。
首先通过下面的命令创建一个数据集
prepare这个命令会在当前工作目录下创建测试文件后续的运行run阶段将通过读写这些文件进行测试。
第二步就是运行run阶段针对不同的I/O类型有不同的测试选项
--init-rngon--max-time300--max-requests0
子系统密切相关的包括每秒请求数和总吞吐量。
在上述例子中每秒请求数是
基准测试模拟了一个简单的事务处理系统的工作负载。
下面的例子使用的是一张超过百万行记录的表第一步是先生成这张表
sbtest...生成测试数据只需要上面这条简单的命令即可。
接下来可以运行测试这个例子采用了
60.0261/0.06如上所示结果中包含了相当多的信息。
其中最有价值的信息如下
总的事务数。
每秒事务数。
时间统计信息最小、平均、最大响应时间以及
百分比响应时间。
线程公平性统计信息thread-fairness用于表示模拟负载的公平性。
版的源代码自行编译这是一件简单、有用的事情这样就可以利用很多新版本的特性包括可以基于多个表而不是单个表进行测试可以每隔一定的间隔比如
秒打印出吞吐量和响应的结果。
这些指标对于理解系统的行为非常重要。
测试线程调度器的性能。
对于高负载情况下测试线程调度器的行为非常有用。
测试互斥锁mutex的性能方式是模拟所有线程在同一时刻并发运行并都短暂请求互斥锁互斥锁mutex是一种数据结构用来对某些资源进行排他性访问控制防止因并发访问导致问题。
测试顺序写的性能。
这对于测试系统的实际性能瓶颈很重要。
可以用来测试RAID控制器的高速缓存的性能状况如果测试结果异常则需要引起重视。
例如如果RAID控制器写缓存没有电池保护而磁盘的压力达到了
--num-threads、--max-requests和--max-time参数更多信息请查阅相关文档。
组织发布的一个测试规范用于模拟测试复杂的在线事务处理系统OLTP。
它的测试结果包括每分钟事务数tpmC以及每事务的成本Price/tpmC。
这种测试的结果非常依赖硬件环境所以公开发布的
注意对于I/O密集型的基准测试太短的持续时间会导致错误的结果因为系统可能还没有足够的时间对缓存进行预热。
而对于CPU密集型的基准测试这个时间又不应该设置得太长否则生成的数据量过大可能转变成I/O密集型。
的测试很简单并且结果也具有可比性但毕竟无法模拟真实的业务压力。
相比而言TPC-C
的一个很好的实现但也还有一些不足之处。
为了满足很多大型基准测试的需求本书的作者重新开发了一款新的类
https://code.launchpad.net/~percona-dev/perconatools/tpcc-mysql
文件说明了如何编译。
该工具使用很简单但测试数据中的仓库数量很多可能需要用到其中的并行数据加载工具来加快准备测试数据集的速度否则这一步会花费很长时间。
使用这个测试工具需要创建数据库和表结构、加载数据、执行测试三个步骤。
数据库和表结构通过包含在源码中的
工具完成该工具需要自行编译。
加载数据需要执行一段时间并且会产生大量的输出信息一般都应该将程序输出重定向到文件中这里尤其应该如此否则可能丢失滚动的历史信息。
下面的例子显示了配置过程创建了一个小型五个仓库的测试数据集数据库名为
*************************************
*************************************
..................................................
..................................................
..................................................
工具开始执行基准测试。
其同样会产生很多输出信息还是建议重定向到文件中。
下面是一个简单的示例使用五个线程操作五个仓库30
***************************************
***************************************
TpmC最后一行就是测试的结果每分钟执行完的事务数。
如果紧挨着最后一行前发现有异常结果输出比如有关于约束检查的信息那么可以检查一下响应时间的直方图或者通过其他详细输出信息寻找线索。
当然最好是能使用本章前面提到的一些脚本这样就可以很容易获得测试执行期间的详细的诊断数据和性能数据。
的使用者都应该了解一些基准测试的知识。
基准测试不仅仅是用来解决业务问题的一种实践行动也是一种很好的学习方法。
学习如何将问题分解成可以通过基准测试来获得答案的方法就和在数学课上从文字题目中推导出方程式一样。
首先正确地描述问题之后选择合适的基准测试来回答问题设置基准测试的持续时间和参数运行测试收集数据分析结果数据这一系列的训练可以帮助你成为更好的
基准测试可以很方便地比较不同系统的性能。
另一方面文件系统和磁盘基准测试则可以在系统出现问题时有效地诊断和隔离异常的组件。
通过这样的基准测试我们多次发现了一些数据库管理员的说法存在问题比如
控制器的缓存策略的配置并不是像工具中显示的那样。
通过对单块磁盘进行基准测试如果发现每秒可以执行
一块机械磁盘每秒只能执行几百次的随机读操作因为寻道操作是需要时间的。
如果经常执行基准测试那么制定一些原则是很有必要的。
选择一些合适的测试工具并深入地学习。
可以建立一个脚本库用于配置基准测试收集输出结果、系统性能和状态信息以及分析结果。
使用一种熟练的绘图工具如
不用浪费时间使用电子表格它们既笨重速度又慢。
尽量早和多地使用绘图的方式来发现基准测试和系统中的问题和错误。
你的眼睛是比任何脚本和自动化工具都更有效的发现问题的工具。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback