背景
在没有性能测试实践的情况下,压力测试和负载测试从字面上来看意思差不多,笔者也经常记不住这两个的区别是什么,因此写一篇文章来让自己加深印象。
然后由于找到的文章都是把性能测试相提并论(其实我一直觉得性能测试包含压力测试和负载测试),因此这里也提上一笔。
概念
性能测试
收集所有和测试有关的所有性能,测试软件在系统中的运行性能,度量系统与预定义目标的差距。
关注: how much and how fast
压力测试
通过 逐步增加系统负载,确定在什么条件下系统失效,以此获得系统能提供的最大服务级别;
负载测试
指数据在超负荷环境中运行,程序是否能够承担。通过逐步增加系统负载,确定在满足性能指标的情况下,系统所能承受的最大负载量。
关注:how much
举例:一个人背X斤
负载测试:200斤情况下,是否能坚持5分钟。
压力测试:200,300,400...斤情况下,他的表现,什么时候失败,失败之后什么表现,重新扛200是否正常。
这里提一下其他的性能测试: 强度测试(spike testing,extreme testing ,hammer testing,容量测试,压力测试);
- 强度测试: 在系统资源特别低的情况下软件系统运行情况,找到系统在那里失效以及如何失效的地方;
- spike testing: 短时间的极端负载测试
- extreme testing: 在过量用户下的负载测试
- hammer testing: 连续执行所有能做的操作
- 容量测试: 确定系统可处理同时在线的最大用户数,使系统承受超额的数据容量来发现它是否能够处理。通常和数据库有关,关注大容量。
测试目的
压力测试
可以知道在什么极限情况下系统会崩溃,是否具有自我恢复性,更多是为了确定系统稳定性
负载测试
获得系统正常工作时所能承受的最大负载,也称为容量测试;
压力测试
可分为稳定性测试和破坏性测试。
稳定性测试
在选定的压力值下,持续运行24小时以上的测试。考察各项性能指标是否在指定范围内,有无内存泄漏,有无功能性故障等。
观察log日志等,查看监视系统,服务器等性能的日志文件,找出问题出现的关键时间或检查运行参数。
破坏性测试
在稳定性测试中可能会出现一些问题,如系统性能明显降低,但很难暴露出真实的原因。通过破坏性不断加压,往往能快速造成系统的崩溃或让问题明显暴露。
如何测试?
工具
- 应用层 ,profilers 发现低效代码
- 数据库层,数据库profilers 和 时间探查器(query optimizers)
- 操作系统层,Unix(top,vmstat,iostat );windows(PerfMon监控CPU,内在,swap,磁盘I/O等硬件资源)
- 网络层,报文探测器,网络协议分析器,netstat,MRTG,ntop,mii-tool
- 负载测试开源工具: apache bench,siege,httperf,openSTA,the grinder
提高WEB应用系统性能的例子
- 使用web缓存装置,如squid提供的装置
- 将高访问量的网页静态化避免高访问量对数据库的大量调用
- 通过负载平衡的方法来水平缩放web服务器的结构
- 水平缩放数据库群及分为读写服务器和只读服务器,对只读服务器群负载平衡
- 增加硬件资源
- 增加网络带宽
压力测试方法
- 并发用户/HTTP连接的基线数翻倍
- 随机关闭重启集线器/路由器端口
- 数据库断线然后重启
- 系统运行中,重建RAID阵列
- 运行消耗资源(CPU,内存,磁盘, 网络)的进程
参考:
负载测试、压力测试和性能测试的区别
性能测试、压力测试和负载测试
性能测试 vs 负载测试 vs 压力测试
性能测试VS负载测试VS压力测试 中文翻译