标题：负载压力测试
基本概述
  负载压力测试中动态参数关联负载压力测试有助于确认被测系统是否能够支持性能需求，以及预期的负载增长等。负载压力测试不只是关注不同负载场景下的响应时间等指标，它也要通过测试来发现在不同负载场景下会出现的，例如速度变慢、内存泄漏等问题的原因。负载压力测试是性能测试的重要组成部分，负载压力测试包括并发性能测试、疲劳强度测试、大数据量测试等内容。一般包括如下： 1、性能测试
性能测试用来保证产品发布后系统的性能能够满足用户需求。其中系统性能包括执行效率、资源占用、稳定性、安全性、兼容性、可扩展性、可靠性等。
2、性能评测
性能评测包括：在真实环境下，检查系统服务等级的满足情况，评估并报告整个系统的性能；对系统的未来容量作出预测和规划。 
  负载压力测试结构剖析3、性能调优
性能调优一般的步骤为首先查找形成系统瓶颈或者故障的根本原因，其次是进行性能调整和优化，最后便是评估性能调整的结果。
4、负载测试
负载测试时通过逐步增加系统负载，测试系统性能的变化，并最终确定在满足性能指标的情况下，系统所能承受的最大负载量的测试。
5、压力测试 
压力测试是通过逐步增加系统负载，测试系统性能的变化，并最终确定在什么负载条件下系统性能处于失效状态，并以此来获得系统能提供的最大服务级别的测试。
6、并发性测试
并发性测试的过程，是一个负载测试和压力测试的过程。即逐渐增加并发用户数负载，直到系统的瓶颈或者不能接收的性能点。并发性测试分为三类： 
  负载压力测试工具a、应用在客户端性能的测试；
b、应用在网络上性能的测试；
c、应用在服务器上性能的测试；
7、疲劳强度测试
8、大数据量测试 大数据量测试包括独立的数据量测试和综合数据量测试两类。
负载测试
术语“负载测试”在测试文献资料中通常都被定义为给被测系统加上它所能操作的最大任务数的过程。负载测试有时也会被称为“容量测试”，或者“耐久性测试/持久性测试”。  服务器负载测试容量测试的例子：
通过编辑一个巨大的文件来测试文字处理软件；
通过发送一个巨大的作业来测试打印机；
通过成千上万的用户邮箱来测试邮件服务器；
有一种比较特别的容量测试是叫作“零容量测试”，它是给系统加上空任务来测试的。 耐久性测试/持久性测试的的例子：在一个循环中不停的运行客户端超过一个扩展时间段。
负载测试的目的：
找到一些在测试流程中前面的阶段所进行的粗略测试中没有被找出的bugs，例如，内存管理bugs，内存泄露，缓冲器溢出等等。保证应用程序达到性能测试中确定的性能基线。这个可以在运行回归试验时，通过加载特定的最大限度的负载来实现。尽管性能测试和负载测试似乎很像，但他们的目的还是有差异的。一 
  负载压力测试站点测试工具方面，性能测试使用负载测试的技术，工具，以及用不同的负载程度来测度和基准化系统。在另一方面来讲，负载测试是在一些已经定义好的负载程度上进行测试的，通常对系统加上最大负载之后，系统应该仍然可以提供全部功能。这里需要明确一点，负载测试并不是要对系统加载上过度的负载而使系统不能工作，而是要使系统像一个上满了油的机器嗡嗡叫。 在负载测试的相关内容中，我想应该非常重要的是要有十分充足的数据来进行测试。从我的经验中得知，假若不用非常大的数据*去测的话，有很多严重的bug是不会的到的。比如说，LDAP/NIS/ActiveDirectory数据库中成千上万的用户，邮件服务器中成千上万的邮箱，数据库中成G成G的表，文件系统中很深的文件或者目录的层次，等等。显然，测试人员就需要使用自动化工具来产生这些庞大的数据集，比较幸运的是任何优秀的脚本语言都可以胜任这些工作。
压力测试
压力测试是指通过对系统加载过度的资源或者例系统没有应该具有的令系统可以正常运作的资源，来使系统崩溃（在某些情况的时候，它又可以叫做负面测试）。进行这个疯狂行为的主要目的是为了保证系统出  负载压力测试故障及可以适当的恢复，而这个恢复得怎么样的特性则是叫做可恢复性。 当性能测试需要的是一个可控制的环境和不断的测度的时候，压力测试则是令为欢喜的引起混乱及不可预测性（译者按：从这一点可以看出作者是一个很优秀的测试人员）。还是举WEB应用系统为例，下面是一些对系统可行的压力测试方法：两倍的已经基线的并发用户数或者HTTP连接数；随机的关闭及重开连接到服务器上的网络上集线器/路由器的端口（例如，可以通过SNMP命令来实现）；把数据库断线然后再重启；当系统还在运行的时候，重建一个RAID阵列；在WEB和数据库服务器上运行消耗资源（如CPU，内存，磁盘，网络）的进程。
性能测试
性能测试的目的不是去找bugs,而是排除系统的瓶颈，以及为以后的回归测试建立一个基准。而性能测试的操作，实际上就是一个非常小心受控的测量分析过程。在理想的情况下，被测软件在这个时候已经是足够稳定了，所以这个过程得以顺利的进行。一组清晰已定义好的预期值是让一次有意义的性能测试的基本要  负载压力测试模拟网络连接环境素。如果连你自己都不知道系统性能有些什么是要测的，那么它对于你要测试的方法手段是没有指导意义的*。例如，给一个web应用做性能测试，你要知道至少两样东西：在不同并发用户数或者HTTP连接数情况下的负载预期值；可接受的响应时间；当你知道你的目标后，你就可以开始使用对系统持续增加负载的方法来观察系统的瓶颈所在。重新拿web应用系统来做例子，这些瓶颈可存在于多个层次，你可以使用多种工具来查明它们的所在：在应用层，开发人员可以通过profilers来发现低效率的代码，比如说较差的查找算法；在数据库层，开发人员和数据库管理员（DBA）可以通过特定的数据库profilers及事件探查器（queryoptimizers）。 在操作系统层，系统工程师可以使用一些工具如在Unix类的操作系统中的top、vmstat、iostat、在Windows系统中的PerfMon来监控CPU，内在，swap、磁盘I/O等硬件资源；专门的内核监控软件也可以在这一层面上被使用。在网络层上，网络工程师可以使用报文探测器（如tcpdump）。网络协议分析器（如ethereal），还有其它的工具（如netstat、MRTG、ntop、mii-tool）
从测试的观点来看，上面所有描述的活动都是一种白盒的方法，它对系统从内到外及多角度进行审查及监控。测度数据被取得及分析后，对系统的调整则成为理所当然的下一个步骤。然而，（除了上面的方法外）测试人员在给被测系统运行负载试验（这里为了不与我们所理解的负载测试-loadtesting的概念搞混，特译做负载试验）的时候，也采取了黑盒的方法。像对于WEB应用来讲，测试人员可以使用工具来模拟并发用户或者HTTP连接及测量响应时间。在我以前使用过的轻量级的负载测试开源工具有ab、siege、httperf。一个更重量级的工具是OpenSTA，但我没用过。我也还没有用过TheGrinder这个工具，但它在我将要做的事情中排名靠前。 
  负载压力测试当负载试验的结果显示出系统的性能来没有达到它的预期目标时，这就是要对应用和数据库的调整的时候了。同时你要确保让你的代码运行得尽可能高效，以及数据库在给定的操作系统和硬件配置的情况下最优化。测试驱动开发（TDD）的实践者会发现这种上下文结构框架是非常有用的，如可以通过负载试验及时间试验的函数性来增强现存单元测试代码的MikeClark的jUnitPerf。当一个特定的函数或者方法被剖析过和调试过后，开发人员就可以在jUnitPerf中，放入它的单元试验来确保它可以达到负载及时间上的性能需求。MikeClark称这为“持续性能测试”。我顺便也提一下我已经做了一个基于Python的jUnitPerf的初步研究，我称之为pyUnitPerf。
假若在调试过应用程序及数据库后，系统还是没有达到性能的预期目标，在这种情况下，还是有一些其它的调试的流程可以针对前面讲过的那几个层次来使用的。下面就是一些在应用程序代码*之外仍可以提高WEB应用系统性能的例子：
使用WEB缓存装制，如Squid提供的装置；
将高访问量的网页静态化，以避免这些高访问量对数据库进行大量的调用；
通过负载平衡的方法来水平缩放WEB服务器的结构；
在水平缩放数据库群及将它们分为读写服务器和只读服务器后，还要对只读服务器群负载平衡；
通过增加更多的硬件资源（CPU，内存，磁盘等）纵向的缩放WEB及数据库服务器群；
增加网络的带宽。 
  负载压力测试由于现在的WEB应用系统都是十分复杂的系统，性能调试有时要具有一些艺术性才行。在每次修改一个变量及重新测度的时候一定要非常小心，否则的话，在变化中将会有很多难于确定和重复的不确定因素。在一个规范的测试环境比如说一个测试实验试，它是不会常常的重现实际应用时的服务器配置环境。在这样的情况下，分段测试环境，也就是生产实际环境的一个子集就可以派上用场了。但同时系统的期望性能也需要相应的调低一点。“运行负载试验->测度性能->调试系统”这个循环一直要被重复执行到被测试系统达到了期望的性能标准了才可以停。在这个时候，测试人员就可以明了在正常条件下的系统运转怎么样，同时这些就可以做为以后在回归测试中，评价新版本的软件性能的一个标准了。性能测试还有另一个目标就是建立一组被测系统的基准数据。在很多行业中都会有这种行业标准的基准数据，比如说TPC公布的。还有很多软硬件厂家都为了在TCP排名中靠前而对他们的机器进行精心调试。所以说你应当非常谨慎的说明在你进行测试的时候，并没有在种类繁多的软硬件产品中进行全部测试。
分析处理
分析原则：
1、具体问题具体分析（这是由于不同的应用系统，不同的测试目的，不同的性能关注点）
2、查找瓶颈时按以下顺序，由易到难。 
  压力测试工具软件服务器硬件瓶颈-〉网络瓶颈（对局域网，可以不考虑）-〉服务器操作系统瓶颈（参数配置）-〉中间件瓶颈（参数配置，数据库，web服务器等）-〉应用瓶颈（SQL语句、数据库设计、业务逻辑、算法等）注：以上过程并不是每个分析中都需要的，要根据测试目的和要求来确定分析的深度。对一些要求低的，我们分析到应用系统在将来大的负载压力（并发用户数、数据量）下，系统的硬件瓶颈在哪儿就够了。分段排除法很有效。
分析的信息来源： 1、根据场景运行过程中的错误提示信息；
2、根据测试结果收集到的监控指标数据。
一、错误提示分析
分析实例：
1、Error:Failedtoconnecttoserver“10.10.10.30:8080″:[10060]Connection
Error:timedoutError:Server“10.10.10.30″hasshutdowntheconnectionprematurely 
  负载压力测试分析：
A、应用服务死掉（小用户时：程序上的问题。程序上处理数据库的问题）
B、应用服务没有死（应用服务参数设置问题）
例：在许多客户端连接Weblogic应用服务器被拒绝，而在服务器端没有错误显示，则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connectionrefused消息，说明应提高该值，每次增加25％
C、数据库的连接（1、在应用服务的性能参数可能太小了；2、数据库启动的最大连接数（跟硬件的内存有关）。）
分析：可能是以下原因造成
A、应用服务参数设置太大导致服务器的瓶颈；B、页面中图片太多；C、在程序处理表的时候检查字段太大多。
二．监控指标数据分析
1、最大并发用户数：
应用系统在当前环境（硬件环境、网络环境、软件环境（参数配置））下能承受的最大并发用户数。在方案运行中，如果出现了大于3个用户的业务操作失败，或出现了服务器shutdown的情况，则说明在当前环境下，系统承受不了当前并发用户的负载压力，那么最大并发用户数就是前一个没有出现这种现象的并发用户数。如果测得的最大并发用户数到达了性能要求，且各服务器资源情况良好，业务操作响应时间也达到了用户要求，那么可行。否则，再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。
2、业务操作响应时间：
分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用“事务性能摘要”图，可以确定在方案执行期间响应时间过长的事务。细分事务并分析每个页面组件的性能。如果服务器耗时过长，请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长，请使用“网络监视器”图确定导致性能瓶颈的网络问题
3、服务器资源监控指标： 内存：
1、UNIX资源监控中指标内存页交换速率（Pagingrate），如果该值偶尔走高，表明当时有线程竞争内存。如果持续很高，则内存可能是瓶颈。也可能是内存访问命中率低。
2、Windows资源监控中，如果Process\PrivateBytes计数器和Process\WorkingSet计数器的值在长时间内持续升高，同时Memory\Availablebytes计数器的值持续降低，则很可能存在内存泄漏。
内存资源成为系统性能的瓶颈的征兆：很高的换页率(highpageoutrate)；进程进入不活动状态；交换区所有磁盘的活动次数可高；可高的全局系统CPU利用率；内存不够出错(outofmemoryerrors)。
处理器：
1、UNIX资源监控（Windows操作系统同理）中指标CPU占用率（CPUutilization），如果该值持续超过95%，表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQLServer，可接受的最大上限是80-85%合理使用的范围在60%至70%。
2、Windows资源监控中，如果System\ProcessorQueueLength大于2，而处理器利用率（ProcessorTime）一直很低，则存在着处理器阻塞。
CPU资源成为系统性能的瓶颈的征兆：很慢的响应时间(slowresponsetime)；CPU空闲时间为零(zeropercentidleCPU)；过高的用户占用CPU时间(highpercentuserCPU)；过高的系统占用CPU时间(highpercentsystemCPU)；长时间的有很长的运行进程队列(largerunqueuesizesustainedovertime)。
磁盘I/O：
1、UNIX资源监控（Windows操作系统同理）中指标磁盘交换率（Diskrate），如果该参数值一直很高，表明I/O有问题。可考虑更换更快的硬盘系统。
2、Windows资源监控中，如果DiskTime和Avg.DiskQueueLength的值很高，而PageReads/sec页面读取操作速率很低，则可能存在磁盘瓶径。
I/O资源成为系统性能的瓶颈的征兆： 过高的磁盘利用率(highdiskutilization)；
太长的磁盘等待队列(largediskqueuelength)；
等待磁盘I/O的时间所占的百分率太高(largepercentageoftimewaitingfordiskI/O)；
太高的物理I/O速率：largephysicalI/Orate(notsufficientinitself)；
过低的缓存命中率(lowbuffercachehitratio(notsufficientinitself))；
太长的运行进程队列，但CPU却空闲(largerunqueuewithidleCPU)。
4、数据库服务器：
SQLServer数据库：
1、SQLServer资源监控中指标缓存点击率（CacheHitRatio），该值越高越好。如果持续低于80%，应考虑增加内存。
2、如果FullScans/sec（全表扫描/秒）计数器显示的值比1或2高，则应分析你的查询以确定是否确实需要全表扫描，以及SQL查询是否可以被优化。
3、NumberofDeadlocks/sec(死锁的数量/秒)：死锁对应用程序的可伸缩性非常有害，并且会导致恶劣的用户体验。该计数器的值必须为0。
4、LockRequests/sec(锁请求/秒)，通过优化查询来减少读取次数，可以减少该计数器的值。
Oracle数据库：
1、如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90，那么需要增加SHARED_POOL_SIZE的大小。
快存（共享SQL区）和数据字典快存的命中率： select(sum(pins-reloads))/sum(pins)fromv$librarycache；
select(sum(gets-getmisses))/sum(gets)fromv$rowcache；
自由内存：select*fromv$sgastatwherename=‘freememory’。
2、如果数据的缓存命中率小于0.90，那么需要加大DB_BLOCK_BUFFERS参数的值（单位：块）。
缓冲区高速缓存命中率：selectname,valuefromv$sysstatwherenamein(‘dbblockgets’，‘consistentgets’‘physicalreads’)HitRatio=1-(physicalreads/(dbblockgets+consistentgets))。
3、如果日志缓冲区申请的值较大，则应加大LOG_BUFFER参数的值。
日志缓冲区的申请情况：selectname，valuefromv$sysstatwherename=‘redologspacerequests’。
4、如果内存排序命中率小于0.95，则应加大SORT_AREA_SIZE以避免磁盘排序。
内存排序命中率：selectround((100*b.value)/decode((a.value+b.value)，0，1，(a.value+b.value)),2)fromv$sysstata，v$sysstatbwherea  .name=’sorts(disk)’andb  .name=’sorts(memory)’
注：上述SQLServer和Oracle数据库分析，只是一些简单、基本的分析，特别是Oracle数据库的分析和优化，是一门专门的技术，进一步的分析可查相关资料。