12月阅读周·编写可测试的JavaScript代码:性能测试之负载测试篇

举报
叶一一 发表于 2024/12/23 18:11:24 2024/12/23
【摘要】 背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十一个月。已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScr...

背景

去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。

没有计划的阅读,收效甚微。

新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出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畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。