灏天阁

用 nodejs 对项目压力测试

· Yin灏

压力测试的目的

首先啊, 绝对不是为了压测、攻击别人的网站为乐。

  1. 探索线上系统流量承载的极限。

  2. 保障咱们这线上系统具备一定抗压能力

工具

autocannon 中文译为 自动炮, 是一款基于 nodejs 的压力测试工具,支持命令行写代码来进行测试

npm 地址 www.npmjs.com/package/aut…

因为我是前端所有选择了这个。 其他诸如 ab、webbench 均可。

压力测试

安装

全局安装 autocannon

npm i autocannon -g

命令行使用

执行

autocannon -c 100 -d 5 -p 1 https://appvxnsma4r5053.pc.xiaoe-tech.com/

命令解释

上述命令解释: 用 100 个连接、持续 5 秒去访问 https://appvxnsma4r5053.pc.xiaoe-tech.com/

执行示例截图

image.png

参数释义

  • -c/--connections NUM 并发连接的数量,默认 10
  • -p/--pipelining NUM 每个连接的流水线请求请求数。默认 1
  • -d/--duration SEC 执行的时间,单位秒
  • -m/--method METHOD 请求类型 默认 GET
  • -b/--body BODY 请求报文体
  • -H/--header 请求头

写代码压测

命令行呢,执行简单的压力测试还好, 复杂一点,还是建议写脚本.

例如

1、对后端接口进行压力测试

我举例一个场景, 比如你想对某新增接口的短时间内大量 新增测试, 就可以来试试。

创建一个 js 文件 例如

touch app.js

从调试工具 network 复制 fetch

image.png

书写如下

将上一步复制出来的信息,悉数填在下面。

const autocannon = require("autocannon");
autocannon(
  {
    url: "你的接口",
    headers: {
      accept: "application/json, text/plain, */*",
      "accept-language": "zh-CN,zh;q=0.9",
      authorization: "",
      cookie:
        "acw_tc=0bca324216820466206848044ebf9191e5a0e4b89a4e9bc8b18e333d13f537",
      "Referrer-Policy": "strict-origin-when-cross-origin",
    },
    body: "你的参数",
    method: "POST", // 你接口的methods get / post
    connections: 10, // 连接数
    pipelining: 1, // 流水线数量
    duration: 10, // 持续时间
  },
  console.log
);

执行测试

node app.js

执行后发现压力测试执行了三千多次,创建了三千多个任务, 后端接口直接响应变成了 30 秒。 如此就找到了一个问题。

手动创建这三千个创到什么时候,还得借助工具。

测试是不有 jemeter 等工具也能做?

image.png

image.png

如何定时执行

假如你想每天指定时间 来对自己的项目进行压力测试。

那么你可以把上述逻辑写成一个方法 参照这篇juejin.cn/post/716360… 定时去执行它, 这样就可以愉快的定时压测自己项目了, 你学废了吗?

如何不被发现

有时候,有没有一种可能,你不想被同事发现,你压测了自己的项目。

那么就不能暴露自己 ip。

建议不要使用公司的网络, 使用其他网络进行。

vpn 带宽够的话也是不错的选择, 这样日志里都是香港、新加坡的 ip, 同事们一头雾水。

或者在云服务器上执行, 访问日志就是云服务器的 IP。

如何发现咱系统的突破口

前端静态页面没啥可看的。

找能拉高瓶颈的点, 必须大量计算的拉高 cpu, 数据库磁盘的 IO

建议啊,打开咱项目,看咱后端接口, 最好是增删改的, 找那种响应相对比较慢的, 这种应该逻辑比较复杂, 去测试它, 不出意外,同样并发,压测这个,cpu 肯定飙的更高一些, 这样就能发现咱系统一些问题。

如何压测自己项目的时候查看可用情况

众所周知,如果压测的并发数比较高,你本地的带宽基本被榨干,此时本地你访问项目,可用情况是不准确的!

所以最好有两台电脑, 或者有一台服务器。 一台执行测试自己的项目,另外一台看看能否正常访问,是不是崩了, 没崩说还没到咱们系统的极限,可以尝试加大压力。

压测没给到压力?

咱们是流量压测 属于 DDOS

1、自身机器配置和网络带宽也是瓶颈, 倘若你本地带宽较小、机器配置也比较拉, 比如你设置 10000qps, 你的机器资源有限,根本一秒钟发不出这么多, 那必然。。。。 加机器 加带宽吧 哥们。

2、目标有昂贵的高仿服务器进行流量清洗、异常流量拦截, 你没有直接打到源站。

最后

压力测试可以模拟大量用户访问, 来测试我们应用的承载能力, 可以帮助我们提前发现问题和瓶颈,早早制定应对措施。

- Book Lists -