走进压力测试

首先声明:本人并非专业测试人员,而是在项目开发过程当中正好接触到了压力测试的环节,特此对压力测试做了一些简单的了解。本文围绕压力测试相关的一些问题作出相应的整理,希望可以帮助大家快速简单的了解一下压力测试相关的问题。其中很多问题的一些见解是从一些前辈的博客当中摘抄过来的,这里就不一个一个的贴博客地址了。

什么是压测?
压力测试是通过不断向被测系统施加“压力”,测试系统在压力情况下的性能表现,考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在,也就是我们可以模拟巨大的工作负荷以查看应用程序在峰值使用情况下如何执行操作。

为什么要进行压力测试?
(1)通过压测可以尽可能的找出更多隐藏的代码错误,Web服务处于分布式计算的核心位置,它们之间的交互通常很难测试。分布式开发、大型的开发者团队以及对代码日益组件化的期望都有可能使Web服务的开发变得越来越容易隐藏错误。这些类型的错误极难检测出来。压力测试是检测这类代码错误的一种有效方法,但是只有在压力系统设计得比较有效的情况下才能发挥作用。
(2)考察当前软硬件环境下系统所能承受的最大服务并帮助找出系统瓶颈问题所在。
(3)保证系统在线上的处理能力和稳定性位置在标准范围内,做到心中有数。
压力测试中两种常见的错误类型内存泄漏,并发与同步
有效的压力测试系统将应用以下这些关键条件重复,并发,量级,随机变化

应在什么时候进行压力测试?
(1)接口开发完毕之后
接口开发完成之后就可以进行第一次压力测试。这一次压力测试可以简单压一下, 在本机进行就可以。压力测试的目的是检查代码在高并发下是否会报错(同步、事务相关问题)。另外,编译型语言要观察是否存在内存泄漏。 因为本机性能有限,一般来说按照100、200、300、500进程数进行压力测试,压到500如果没有报错就可以进行疲劳测试,观察内存占用。
(2)项目上线之前

压力测试场景
(1)单场景,压一个接口的
(2)混合场景,多个有关联的接口
压测时间:一般场景都运行10-15分钟。如果是疲劳测试,可以压一天或一周,根据实际情况来定。

压测前要明确本次压测功能及其指标
(1)本次压测为固定接口参数还是接口参数随机化?
(2)要求支持多少并发数?
(3)TPS(每秒钟处理事务数)目标多少?响应时间要达到多少?
(4)压服务器名称还是压服务器IP?(一般都是压测指定的服务器)

如何进行压力测试?
压力测试一个重点是如何产生压力,通常可以通过自己编写脚本模拟请求,或者使用成熟的压测工具进行。压力测试很重要的一点是如何使得模拟压测的数据尽量真实,越接近真实用户越好。

一个完整的性能测试方案
一、压力测试及生成性能报告,通过自己编写脚本模拟请求或者使用成熟的压测工具进行。
二、根据性能报告配合监控系统定位系统瓶颈,进行针对性优化。测试和优化的工作可以和日常开发并行,压力测试完成以后,我们会拿到一个压测报告,这个报告通常会告诉我们系统的QPS、TPS、响应时延等数据,这些数据可以让我们对服务器的性能有个整体的了解,发现存在的问题,但是不能帮助我们定位问题。这个时候我们可以从系统的各个组件入手,关注系统的CPU、内存、IO、网络,对比这些环节对整体性能的影响,确定性能问题是系统哪一部分造成的,然后针对性的在系统中逐个优化。在压力测试发现问题以后,就要进行有针对性的优化。对于不同的系统,这个过程的策略并不是确定的,但是大概可以划分为以下几个步骤:①为大点 (1)为小点
①、定位性能瓶颈,找出系统存在的问题,不同系统的特点不同,在性能瓶颈上也有不同的表现,一般来说,下面的几个方面通常存在比较大的优化空间:
(1)磁盘I/O及文件操作,由于磁盘I/O读写的速度要比内存慢很多,程序在运行过程中,如果需要等待磁盘I/O完成,那么低效的I/O操作会拖累整个系统。
(2)网络操作,对网络数据进行读写的情况与磁盘I/O类似。由于网络环境的不确定性,尤其是对互联网上数据的读写,网络操作的速度可能比本地磁盘I/O更慢。
(3)CPU,对计算资源要求较高的应用,由于其长时间、不间断地大量占用CPU资源,那么对CPU的争夺将导致性能问题。如科学计算、3D渲染等对CPU需求旺盛的应用。
(4)高并发下的上下文切换及锁竞争等,高并发程序如果没有做好优化,存在大量的锁竞争,激烈得锁竞争将会明显增加线程上下文切换的开销,对性能造成极大的影响
(5)数据库,大部分应用程序都离不开数据库,而海量数据的读写操作可能是相当费时的。而应用程序可能需要等待数据库操作完成或者返回请求的结果集,那么缓慢的同步操作将成为系统瓶颈。
②、确定调整目标,提出解决方案
找到系统的性能问题以后,需要作出对应的解决方案。
典型的影响性能的问题,比如:
(1)系统对高并发的场景响应不足,如数据库连接池过低,服务器连接数超过上限,数据库锁控制考虑不足等
(2)内存泄露,如在长时间运行下,内存没有正常释放,发生宕机等
(3)数据库优化不足,业务日益增长,关联表众多,SQL不够优化等
定位到上述问题,接下来就是提出合理的调整目标,比如服务器资源有限,可以通过配置更多的机器,服务上云等进行优化;如果对高并发支持不好,就可以在代码层面优化,提高并发支持;数据库性能问题,如慢查询等问题,就可以进行 SQL语句优化等。
③、实施解决方案,进行迭代开发
上一步的分析给出了一个初步的性能优化方案,接下来就是针对方案中提到的内容进行针对性的改进。这个过程可以应用敏捷的思想进行迭代,在开发完成后,为了对比优化结果,可以对调优后的系统进行小范围测试。
④、进行基准测试并分析调优结果
数据说明一切,性能优化的结果不能简单的通过 “感觉系统变快了”来衡量,最好是通过对比优化前后的测试结果,用图表的方式直观的把优化结果展示出来。
基准测试:指通过设计科学的测试工具和方式方法,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。对比测试结果,结合容量评估等工作,可以让系统发挥最大的效用。
三、估算容量承载能力,合理规划系统资源,进行压力测试的一个重要目的是让现有的服务器资源发挥最大的价值,经过前期的测试和分析,这时候我们对系统整体的性能有了一个认识,对服务器的承载能力有了预估,这个时候我们就可以结合业务规模配置服务器数量,CDN资源等,让最少的资源产生最大的价值。

如何进行监控系统资源,定位性能瓶颈?
压力测试虽然可以暴露系统性能问题,如高并发下访问缓慢,服务宕机等。但是通过压测不能具体知道哪里存在瓶颈,必须要在压测同时配合适当的资源监控,帮助我们定位问题。
(1)使用nmon监控系统性能
nmon是Linux上广泛使用的监控与分析工具,相对于其它一些系统资源监控工具来说,nmon所记录的信息是比较全面的,它能在系统运行过程中实时地捕捉系统资源的使用情况,并且能输出结果到文件中,然后通过nmon_analyzer工具产生数据文件与图形化结果。
nmon所记录的数据包含以下一些方面:
● CPU占用率
● 内存使用情况
● 磁盘I/O速度、传输和读写比率
● 文件系统的使用率
● 网络I/O速度、传输和读写比率、错误统计率与传输包的大小
● 消耗资源最多的进程
● 计算机详细信息和资源
● 页面空间和页面I/O速度
● 用户自定义的磁盘组
● 网络文件系统
(2)使用rpc.rstatd监控系统性能
rpc.rstatd通常配合LoadRunner一起使用,注意与系统服务rpc.statd进行区分。rstatd后台程序可以从系统核心中获取系统性能统计的相关信息,将结果返回给调用程序。进行压力测试时,LoadRunner客户端通过给服务器上的 rstatd 后台程序发送请求,来收集应用或数据库服务器的性能数据。
(3)针对不同的服务合理配置资源监控方案
以Java服务为例,在压测同时可以对JVM虚拟机进行性能监控,这方面常用的有Jvisualvm、jps、jstack等。

压测结果分析
(1)有错误率同开发确认,确定是否允许错误的发生或者错误率允许在多大的范围内;
(2)Throughput吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数;
(3)压测结束,登陆相应的web服务器查看CPU等性能指标,进行数据的分析;
(4)最大的tps:不断的增加并发数,加到tps达到一定值开始出现下降,那么那个值就是最大的tps;
(5)最大的并发数:最大的并发数和最大的tps是不同的概率,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数;
(6)压测过程出现性能瓶颈,若压力机任务管理器查看到的cpu、网络和cpu都正常,未达到90%以上,则可以说明服务器有问题,压力机没有问题;
(7)影响性能考虑点包括:数据库、应用程序、中间件(Tomact、Nginx)、网络和操作系统等方面。

常见压力测试工具?
(1)Apache JMeter是Apache组织开发的基于Java的压力测试工具,用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java 对象、数据库, FTP服务器, 等等。
JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能回归测试,通过创建带有断言的脚本来验证你的程序是否返回了期望的结果,为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。
(2)LoadRunner是惠普旗下一款自动负载测试工具,它能预测系统行为,优化性能。LoadRunner强调的是整个企业的系统,它通过模拟实际用户的操作行为和实时性能监测,来帮助更快的确认和查找问题。此外,LoadRunner 能支持最宽范的协议和技术,量身定做地提供解决方案。
(3)其他测试工具
Siege是一款开源的压力测试工具,可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的响应时间,并在一定数量的并发访问下重复进行。
TCPCopy是一种请求复制(所有基于tcp的packets)工具,可以把在线请求导入到测试系统中去。TCPCopy的特点是可以拷贝线上真实流量,模拟用户数据

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值