Fork me on GitHub

服务器压力测试

简介

压力测试(Stress Test),也称为强度测试、负载测试,通过加压测试,确定一个系统的瓶颈或者应用不能服务的性能点,来获得应用系统能提供的最大的服务级别的测试。目的是验证软件是否符合客户需求,提高应用系统可用性,减少系统的宕机时间和因此带来的损失。最终产物是包括测试环境,方法和结果的测试报告。

通俗地讲,压力测试是为了发现在什么条件下应用程序的性能会变得不可接受而进行的测试,例如文件系统接收批量数据文件传输,对数据库进行大数据量的查询计算、导入导出、批量数据操作,多客户机同时进行web服务的某一个提交操作。如果没有事先考虑超高并发或超大数据量的情况,那么在极限场景出现的时候很可能导致应用系统崩溃,造成巨大损失,包括不限于客户的交易数据,一分钟几十万上下的服务,运维人员的奖金和因为加班失去的打团时间(FOR AZEROTH!)。

软件 下载地址
nmon16g_x86.tar.gz 点击下载
nmon_analyser_v52_1.zip 点击下载

WHY

进行压力测试意义就在于让你清晰的知道当前的计算资源和应用架构是否满足预估服务级别。

比如某公司办公系统提供给全国各分部12000万员工使用,要在一分钟内处理所有人的访问,查询提交等操作,则测试并发量需满足12000/60=200并发数/S,同时实际工作环境不排除同一时刻有数千用户同时登录使用的极端场景,根据经验600并发可模拟6000人以上实际操作并发量,需要对100/200/600并发访问进行测试,事先把使用场景拉到极限并预设处理方案,真正发生的时候就不会手足无措,避免崩溃。通过分析各个并发场景下软硬件资源的使用率情况,找到极限并发量或当前系统的可容忍并发量,如果现在的设计通过压力测试完全满足12000人的使用,在20000人以上同时使用才会有性能问题,就可以放心开放给后续单位,系统用户到达20000之前都不用担心;根据现有的测试报告,评估资源扩张方案,2w人需要这么多资源,4w人给翻倍,10w人给上集群,100w人给上分布式。

比如你公司有一个网站,搭建了一个web服务,目的是正常提供服务生命不息赚钱不止。那么,你的web应用得设计合理,实现高并发的请求处理,处理不了高并发后面的访问就会失败;数据库设计得合理,单用户访问秒级还是毫秒级,单用户能做到毫秒级,一千个用户,十万个用户,一千万呢,3s打开的页面50%的人会放弃,5s才能打开的页面…,想想你打开淘宝首页需要5s,还有心情继续逛么;服务器资源得足够,否则处理超大任务量时CPU,内存,存储都是瓶颈。谷歌淘宝亚马逊这些跨国级公司每天亿级别的访问量,靠的是以亿美刀为单位的技术开发投入,茫茫多数据中心的服务器资源支撑的。你拥有的只是简单的应用和一点点计算资源,同样的也不用考虑太大的访问量,压力测试将你现在的资源能提供给多少人用,怎么用,使用人数激增的话能撑多久,以后公司扩张要从给十万级用户提供服务提高到百万级用户,需要多少资源全都数据化,然后根据数据制定预案,任何场景手里都有紧急预案,那还慌个屁。

HOW

来来来,给你看个宝贝,如来神掌十块钱一本便宜卖给你(╯‵□′)╯︵┻━┻
《浅谈服务器性能测试的全生命周期——从测试、结果分析到优化策略》

进行压力测试

不同应用系统提供的服务不同,极端场景下承受压力的姿势ORZ也不一样,压力测试要具体情况具体分析,根据当前场景设计合适的测试方案。

大体思路一致,通过采用测试工具软件,编写测试脚本程序或使用各大厂商提供的压力测试服务等手段;

模拟出实际生产场景中的软硬件环境及用户使用过程的系统负荷进行加压;

在应用系统达到极限以前进行长时间或超大负荷地运行,在不断加压发现瓶颈,对软件系统和操作系统优化调整,再加压测试的循环中,最终实现在满足客户需求的基础上尽可能优化的目的。

通常要进行压力测试的资源包括内存容量、CPU 可用性、磁盘空间和网络带宽,以及应用架构,数据库设计等。

获取压测结果

vmstat:对操作系统的内存信息、进程状态、cpu活动等进行监视

top:按照系统中当前进程的CPU利用率以及占用的内存大小进行排序

uptime:显示系统已经运行了多长时间

netstat:显示本机的网络连接情况

free:监控Linux内存

sar:获取系统的CPU,运行队列,磁盘IO,分页,内存,CPU中断,网络等多项数据

iostat:监控磁盘I/O

Nmon:提供对CPU、内存、网络、磁盘等系统资源占用情况分析,相比其他Linux命令获取到的数据,nmon的功能更为集中、配置性更强。通过nmon采集到数据之后可以在windows系统中使用nmon_analyser做数据的展示以及分析工作,可视化效果比较好。

上述工具除了最后的NMON外都是linux的自带命令,使用nmon需要自行下载安装,安装包里是二进制命令,将对应自己系统的命令改名了nmon,放到系统路径里即可。使用方式可自定义,比如每2s采集一次,共300次,可以收集10分钟的系统信息,将压力测试的时间段放在这个时间窗口里。生成的结果文件可以使用nmon_analyser进行导入分析。

1. 解压,找到对应自己系统的命令,加执行权限,改名为nmon,移动到/usr/bin下;

2. 如图执行命令,生成分析结果;-s 2 每2秒采集一次数据,-c 10 采集10次,-f 生成的数据文件名中包含文件创建的时间。

3. analyser解压后是一个excel文件和一个word文件,word文件是具体用法,excel包含了可以处理nmon导出结果的宏(记得在信任中心启用所有宏,否则无法运行)。打开excel,点击导入刚才生成的服务器结果集。nmon_analyser_v52_1.xlsm会将处理后的信息存放在一个新生成的excel里面。

结果分析和调优

分析硬件主要是希望选择合适的配置,节约资源,避免出现高射炮打蚊子的情况。

1.CPU

实际测试过程中,如果在大压力下持续观察CPU的使用率很低,那么CPU的资源基本上是可以满足服务器要求的。这样的情况其实是有点浪费CPU资源的,比较理想的情况是压力不大的时候CPU利用率比较低,压力上来之后CPU利用率保持在60%-70%。稍微加压CPU使用率拉满,线程全被占用,如果其他性能未到极限,那么CPU就是瓶颈,要么设定这是极限场景,避免出现,要么换主机。

2.内存

内存的大小也是影响服务器性能的一个重要因素。内存太小,系统进程要被阻塞,应用程序会变得缓慢,甚至是失去响应;如果太大的话,也是造成一种浪费。Linux系统中采用物理内存和虚拟内存两种方式,使用虚拟内存可以缓解物理内存的不足,但是如果占用过多的虚拟内存的话,应用程序的性能会明显的下降。原则是一定要够用,留出至少30%的冗余。

PS:有时候free只有一点点不意味着没内存了,不要慌,看《正确计算linux系统内存使用率》

3.带宽

网络带宽的大小限制了客户端与服务器交互的流量,相对其他硬件资源,网络带宽在价格上更贵。这需要我们合理预估服务器的可服务器能力,需要占用的带宽资源,如果测出是网络的瓶颈,处理方式一般有减少网络流量和通讯次数,压缩通讯数据,再不行就拿钱开更高的带宽。

4.存储

目前磁盘都是机械方式运作的,主要体现在磁盘读写前寻找磁道的过程。磁盘自带的读写缓存大小,对于磁盘读写速度至关重要。读写速度快的磁盘,通常都带有较大的读写缓存。磁盘的寻道过程是机械方式,决定了其随机读写速度将明显低于顺序读写。在我们做系统设计和实现时,需要考虑到磁盘的这一特性。没什么说的,离CPU越近,IO速度越快,成本越高,加内存,换固态,用内存数据库减少应用读写数据文件。

5.系统

目前大部分的服务器都是运行在Linux操作系统上的,服务器端的各种软件都为它而设计,不同的操作系统在内核实现上各不相同,比如debian,suse,federo,centos,ubuntu,红帽各有特色,应用软件运行在系统上,始终要调用系统的文件系统,内存管理机制,网络实现,内核设计,这些深层次的东西对应用还是有影响的,不过这么深层次的东西大多数人接触不到也没必要,centos/ubuntu二选一即可。

6.数据库

应用运行最终产生的数据最终得落在数据库。林林总总那么多数据库,关系非关系就不一一列举了,只要知道数据库的正确设置对应用影响极大即可,系统文件描述符,缓冲区大小,time_wait快速回收设置等,mysql的配置文件my.cnf文件中,修改不同的配置(比如innodb_flush_log_at_trx_commit 设置为0,1还是2 )会影响数据库的读写性能,甚至是线程池配置的线程个数也会对服务器的性能产生较大的影响,,具体如何调整找架构师和DBA。

7.应用程序

应用程序设计需要合理,比如程序中需要频繁申请内存,使用bzero和memset对服务器性能影响差距可能会很大,另外程序中的一些查询操作,采用不同的数据结构,可以实现时间和空间上的相互转化,这些细节累积起来差距就很大。

EXAMPLE

我司为某系统开发了一套提供给全国各省管理人员共计6k家单位使用的软件,用来对各省市的某种数据进行入库,管理,分析。每个单位开放给2人使用,场景预估满足所有操作人员在1分钟内批量录入数据,即可达到上线要求,则测试并发量需满足12000/60=200并发数/S,同时实际生产环境不排除存在同一时刻6000单位均有用户登录使用的极端场景,根据经验600并发可模拟6000人以上实际操作并发量,故本次压力测试需测试600并发的极端场景。

思路是配置一台压力测试机来模拟对业务系统发起100/200/300/600并发访问,每次测试15分钟,利用nmon记录期间服务器性能变化。对应用系统和服务器的表现进行性能分析,是否满足上线要求,如果满足,可以继续测试极限并发量,也可以出具测试报告,本次测试结束。如果不足,问题在哪里,如何优化调整,调整后继续测试,直到满足上线要求。

具体操作是创建一台满配的16C,64G内存的centos系统虚拟机,部署tomcat运行开发写的测试程序,该程序实现自定义并发数然后运行,对应用系统发起http请求的功能。应用系统部署在6台16C,32G内存,200G存储的centos虚拟机上,后端是10C,12G内存,200G存储的RDS(阿里云产品,类mysql)。用nmon记录服务器性能变化,通过页面能否正常访问,访问速度延迟来判断应用是否正常。6台应用可以通过负载均衡服务器设置权重,通过调整权重将压力倾斜到某台或者某几台服务器,各种场景都通过后撰写测试报告,本次压力测试施工完毕★,°:.☆( ̄▽ ̄)/$:.°★

本文标题:服务器压力测试

文章作者:Chaos

发布时间:2018年07月11日 - 15:07

最后更新:2018年07月11日 - 03:07

原始链接:http://www.lovepanda.tk/2018/07/11/压力测试/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。