压测-基于K6的web性能测试和实时监控解决方案

对于性能测试,除了LoadRunner、Jmeter以外,新一代的测试工具还有哪些可选? 有没有原生集成测试结果集的数据可视化的测试解决方案? 本文尝试用Grafana Lab出品的K6解决上述问题。

概述

关于k6,一张图说明其基本特性:

方案选型

综上,选择K6主要解决了学习成本 & 实时监控对接的痛点,能够方便快速地构建web性能测试解决方案

安装部署

MacOS环境

直接通过Homebrew安装

1
$ brew install k6

CentOS环境

1
2
3
4
$ sudo yum install https://dl.k6.io/rpm/repo.rpm
$ sudo yum install k6
# 如CentOS版本低于8,则执行:
$ sudo yum install --nogpgcheck k6

场景案例

准备工作

建议提前做好被测机的系统参数调优

1
2
3
4
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_timestamps=1
ulimit -n 250000

示例场景1——直接指定并发数&时长

先创建名为 script.js 的用例文件:

1
2
3
4
5
6
7
8
9

import http from 'k6/http';
import { sleep } from 'k6';


export default function () {
http.get('http://nginx.example.site/');
sleep(1);
}

保存后执行:

1
k6 run --vus 100 --durating 10s script.js


等待执行完成后,可看到上述总结报告

示例场景2——阶梯式性能测试,并通过InfluxDB + Grafana呈现实时监控看板

同样,创建script.js用例文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import http from 'k6/http';
import { sleep } from 'k6';


export const options = {
stages: [
{ duration: '1m', target: 100 }, // below normal load
{ duration: '1m', target: 100 },
{ duration: '1m', target: 200 }, // normal load
{ duration: '1m', target: 200 },
{ duration: '1m', target: 300 }, // around the breaking point
{ duration: '1m', target: 300 },
{ duration: '1m', target: 400 }, // beyond the breaking point
{ duration: '1m', target: 400 },
{ duration: '1m', target: 0 }, // scale down. Recovery stage.
],
};

http.get('http://nginx.example.site');
sleep(1);
}

在本地或者服务端安装基于Docker-Compose的 InfluxDB + Grafana,用于接收k6测试过程中的实时数据

1
2
3
4
5
6
$ git clone 'https://github.com/k6io/k6'
$ cd k6
$ docker-compose up -d \
influxdb \
grafana

登录Grafana完成InfluxDB 数据源配置

然后完成K6 Dashboard导入。Dashboard来源:https://grafana.com/grafana/dashboards/2587


导入完成后执行测试用例,引入 -o 参数,确保输出到InfluxDB

1
k6 run -o influxdb=http://localhost:8086/k6 script.js

查看Grafana的实时监控

参考文档

https://k6.io/docs/misc/fine-tuning-os/
https://k6.io/docs/getting-started/installation/
https://k6.io/blog/zh/k6-vs-jmeter/