怎样正确做 Web 应用的压力测试?

面试的时候,很多后端或者QA的候选人都会跟我讲说有过压力测试的经验,但在我细问之后,极少有候选人能够把压力测试细节讲清楚。

这里整理一下我认为做压力测试时需要注意的一些细节。

1、环境

首先环境是非常重要的,需要尽可能跟生产环境靠近。

比方说,使用同样的nginx版本,php的话需要启用fpm,zend-optimizer等等,参数配置也最好跟生产环境保持一致。

当然,php的版本更加需要保持一致,不能说线上是跑5.3,而测试环境却是php 7;除非是要测试不同php版本的性能。

网络也需要注意,测试机跟服务器之间是什么网络连接?100M还是千兆的网线?也同样需要跟生产环境尽可能保持一致。

我曾经看过有人直接在自己的笔记本上跑压测的客户端,然后笔记本使用的wifi;这直接就变成是在测试wifi的性能了。

当然,也可以考虑直接在服务器本机上面跑压测程序,这样就可以规避掉网络层的,更有针对的去看服务器应用的性能;但那就要注意压测程序本身是否会占用过多的CPU、内存等资源而影响到服务器应用。

在测试高并发的场景下,也要注意修改linux的open files limit:

ulimit -n

命令可以显示file descriptors的值,这值默认是1024;也就是说,最多只能开1024个并发连接;一般情况下够用。如果需要测试C10K甚至更高的并发场景时,这个值就必须修改了。

2、工具

最常见的web压测工具是ab - apache benchmark;我偶尔会拿ab来做简单的快速测试。但做严格的测试时,ab就会显得非常不合适。

首先,ab是单线程程序,只能利用单一CPU,在给性能好的服务器端应用做压测时,往往跑ab的测试机负荷满了;而服务器应用的性能还绰绰有余。

这在测试默认启用多核的go程序是非常常见的。

建议至少使用techempower所用的wrk替代ab;wrk默认可以利用单一CPU的多个核。

其次,ab仅能是对单一url进行压测,而当我们仅仅只是反复测试单一URL时,出来的测试结果往往不能提现真实的压力场景。

比方说,应用程序反复查询、返回同一个账号的资料,跟随机查询、返回十万个用户是不一样的;前者的返回结果很容易就被数据库、应用给"缓存"掉。而对于被严重"缓存"的性能测试结果,并不能很好的反应真实场景下的性能表现。

如果要模拟真实的压测场景,我会推荐使用siege,siege的有多个参数方便模拟真实压力场景:

-f FILE, --file=FILE参数指定一个输入文件,在文件中指定多个不同的url,然后对这多个url进行压测。

-i, --internet则是指定随机发送输入文件中的url

wrk也支持使用lua脚本去生成压测的请求,siege上面能做的,wrk肯定也可以通过自己编写脚本去实现。

3、瓶颈

我会认为,压测的目的是在于找到系统的瓶颈,一定是要确定系统某个方面达到瓶颈了,压力测试才算是基本完成。

当我们说系统可以支撑某某压力时,一定要同时能够清楚的说出系统的瓶颈是在哪里;也就是说,当瓶颈得到改善的时候,系统的性能可以得到提高。

对于web应用,系统的瓶颈往往会是数据库;系统满负荷运作的时候,数据库的CPU或者是磁盘IO是否跑满了?

如果没有,那么很可能是说明瓶颈是在别的地方;如果是在应用,那么应用服务器的CPU、内存、IO等等也应该有所体现。

找到系统的瓶颈,是需要反复做不同测试、优化,然后分析出来的。

对于一些性能有高要求的公司,比方说七牛云,据说他们只接受网络IO这一瓶颈,压测的时候,是一定要把千兆网卡跑满,才算是性能达标;如果网卡没跑满,那就说明瓶颈是在别的地方,要去不断优化,直到网卡的物理限制成为系统的瓶颈。

4、延迟与吞吐

延迟latency与吞吐thoughput,是两个相关,但其实独立的概念。

最理想的系统是低延迟,高吞吐;但有时高延迟的系统,吞吐是可以超过低延迟的系统的。

文章来源:网络 版权归原作者所有

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系小编,我们将立即处理

相关推荐
Coder-thinking4 天前
QPS和TPS的区别简单理解
压力测试
测试界兮兮7 天前
我们怎么把自动化测试落地到一个项目上呢?
功能测试·程序人生·职场和发展·单元测试·压力测试
@王先生19 天前
压力测试(内存、磁盘、网络、cpu)
压力测试
程序员威子10 天前
软件测试中的白盒测试,这些技巧你知道吗?
功能测试·测试工具·jmeter·单元测试·测试用例·压力测试·postman
天蓝蓝2352811 天前
压力测试知识总结
压力测试
hai4058711 天前
软件测试之压力测试知识总结
压力测试
代码小念13 天前
12道经典性能测试人员面试题
软件测试·压力测试
MJH82713 天前
如何防止常见的Web应用安全漏洞!
前端·自动化测试·软件测试·功能测试·单元测试·集成测试·压力测试
慧都小妮子14 天前
CrowdStrike 的失败如何凸显了左移测试的重要性
软件测试·单元测试·压力测试·parasoft
MJH82714 天前
【压力测试】如何确定系统最大并发用户数?
自动化测试·软件测试·功能测试·测试工具·单元测试·压力测试·性能测试