12月阅读周·编写可测试的JavaScript代码:性能测试之负载测试篇
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。
这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十一个月。
已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》、《JavaScript权威指南》、《JavaScript异步编程设计快速响应的网络应用》。
当前阅读周书籍:《编写可测试的JavaScript代码》。
负载测试
性能测试可以在应用程序级别确定性能瓶颈,并可以回答这样的基本问题,“你的应用程序能跑多快?”负载测试会尝试确定可以处理多少个应用程序。这非常类似于性能测试。事实上,大家可能会说性能测试是负载测试的子集。性能测试可以确定最小负载下应用程序可以做什么,而负载测试确定在最大负载下应用程序是如何执行的。“最大”不一定是崩溃之前的每秒请求数,而是应用程序在响应无法接受之前可以处理多少个加载。我们可以定义响应时间的多少。
尽管能够处理巨大的负载并在合理的时间内进行响应是很好的,但负载测试的最终目标是不仅要尝试测试面对重负载的低响应时间,还要能知道最大可接受的响应时间是多少。在最大限制到达之前,水平扩展服务器也许会更容易,而不再需要重写代码来处理负载本身。最终,将会有一个必要的水平或垂直扩展交叉点,确定该点是非常有用的。
但负载测试不仅仅是针对整个应用程序。单独的功能也可以进行负载测试以确定其性能。负载测试也不仅仅是“时间”,在系统或功能进行载荷测试时,内存、磁盘、CPU利用率也是很重要的考虑因素。这些资源最大化(或多个)使用的最终结果会增加响应时间,所以知道这些值的边界是非常重要的。
浏览器负载测试
浏览器中进行Web应用程序的负载测试,通常会让应用程序发送尽可能多的流量,并衡量其性能。衡量性能通常意味着是测试响应时间:获取(GET)一个页面或多次提交(POST)一个表单,并跟踪应用程序需要多长时间来响应。
该类型测试的规范化工具是Apache Bench。命令行ab工具在GET、POST、PUT以及DELETE页面时接受很多选项参数,并会将结果转储成CSV文件。本文中,我们将使用该工具的Node.js版本,名为nodeload。
除了重复请求URL以外,nodeload还有很多很好的特性,所以让我们开始学习一下。首先要安装该工具:
sudo npm install nodeload -g
作为一个基本示例,我们将使用nl.js实用程序,它类似于ab的Apache Bench可执行文件。
Nodeload还有一个很好的报表功能。要查看报表能,先让我们来看一个完整的例子。首先,我们对Web应用程序进行一个长时间的负载运行。在Web服务器响应请求时,我们将测量它的CPU、磁盘以及内存负载。最后,在测试运行时,我们将会看到Web服务器性能的动态更新图。
第一步是发送大量的请求。这里我们发送100000次。在该请求运行的同时,nodeload在8000端口上运行一个Web服务器用于显示请求活动。完成后,最终的HTML和JSON值被保存到当前目录中——非常酷。
与此同时,可以利用自己最喜欢的统计生成器(vmstat、iostat、uptime、ps,等等)监视服务器上所发生的情况,并使用nodeload绘图以及持久化数据。使用Linux以及/proc文件系统时,可以很容易地对服务器数据进行报表绘制。
nodeload还提供了一个方便的循环类Loop,用于在指定的频率内执行代码。如下示例中,每隔5秒,该构造函数就会执行getMemory和getCPU函数:
var myLoop = new loop.loop(
function (finished, args) {
getMemory();
getCpu();
finished();
},
[], // No args
[], // No conditions
0.2, // Once every 5 seconds
);
myLoop.start();
上述代码中的最后一个参数是每秒中循环应该执行的最大次数。
当然,我们可以挑选任何我们喜欢的数据。getProc实用函数没有显示数据;它只需要获取/proc文件系统的一个文件,并将其对象化。有趣的地方是将当前数据添加到在头部定义的内存图表中,并将其添加到报告摘要中,该摘要将会显示在Web报告页面的右列。
nodeload有很多其他技巧,包括循环并行执行的多个循环;对数据集进一步分析的统计软件包,以及一个非常灵活的、以编程方式进行的特定请求(不用仅发送HTTP请求)。当然,可以在循环里封装任何测试、页面访问或任何其他代码,并可以很简单将结果图形化。
总结
对于导致缓慢和产生瓶颈的代码,监控软件包可以很容易地监控并收集运行时数据。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)