介绍
v0.27.0版本为我们带来了新的执行引擎和许多新的执行器,可以满足您的特定要求。它还包括一个具有许多不同选项的新脚本API ,用于调整和模拟被测系统(SUT)负载。这是臭名昭著的#1007拉取请求工作了一年半的结果。
为了以恒定的速率生成查询,我们可以使用
constant-arrival-rate
演员。该运行程序在指定的时间以固定的频率运行迭代。这使得k6可以在测试执行期间动态更改活动虚拟用户(VU)的数量,以达到每单位时间指定的迭代次数。在本文中,我将解释如何使用此方案以恒定的速率生成请求。
脚本配置选项的基础
让我们看一下k6中用来描述使用
constant-arrival-rate
执行程序的脚本中的测试配置的关键参数:
- executor ():
— k6. VU - — , , . rate
()timeUnit
( ):
k6rate
timeUnit
.
:
rate: 1
,timeUnit: '1s'
« »rate: 1
,timeUnit: '1m'
« »rate: 90
,timeUnit: '1m'
« 90 », 1,5 /, 667 ,rate: 50
,timeUnit: '1s'
« 50 », 50 (requests per second — RPS), , .. 20
- duration ():
,gracefulStop
. preAllocatedVUs
:
.maxVUs
:
, .
这些参数一起构成一个脚本,该脚本是测试配置选项的一部分。下面的代码段是一个示例
constant-arrival-rate
脚本。
在此配置中,我们有一个
constant_request_rate
脚本,它是用作脚本标签的唯一标识符。此方案使用constant-arrival-rate
执行程序并在1分钟内运行。每秒钟(timeUnit
),将执行1次迭代(rate
)。预先配置的虚拟用户池包含20个实例,最多可包含100个实例,具体取决于请求和迭代的数量。
请记住,在测试过程中初始化虚拟用户可能会占用大量CPU资源,因此会扭曲测试结果。通常,最好
preAllocatedVU
有足够的资源来运行负载测试。因此,不要忘记根据测试中的请求数量以及要运行测试的速率来分配更多的虚拟用户。
export let options = {
scenarios: {
constant_request_rate: {
executor: 'constant-arrival-rate',
rate: 1,
timeUnit: '1s',
duration: '1m',
preAllocatedVUs: 20,
maxVUs: 100,
}
}
};
生成具有恒定频率的请求的示例 constant-arrival-rate
在上一教程中,我们演示了如何计算恒定请求率。让我们再次看一下它,牢记脚本的工作原理:
假设您希望被测系统每秒在端点上处理1000个请求。预分配100个虚拟用户(最多200个)可以使每个虚拟用户发送大约5到10个请求(基于100到200个虚拟用户)。如果每个请求花费的时间都超过1秒,那么最终您发出的请求将少于预期(更多
dropped_iterations
),这表示被测系统存在性能问题或不切实际的期望。在这种情况下,您应该解决性能问题并重新开始测试,或者通过调整来缓和您的期望timeUnit
。
在这种情况下,每个预先设置的虚拟用户将发出10个请求(
rate
可被preAllocatedVU
)。例如,如果在1秒内未收到请求,则花费了超过1秒的时间才能获得响应,或者您的被测系统花费了超过1秒的时间来完成任务,k6将增加虚拟用户的数量来弥补错过的请求。以下测试每秒生成1000个请求,并运行30秒,大约30,000个请求,如下面的输出所示:http_reqs
和iterations
。此外,k6仅使用了200个虚拟用户中的148个。
import http from 'k6/http';
export let options = {
scenarios: {
constant_request_rate: {
executor: 'constant-arrival-rate',
rate: 1000,
timeUnit: '1s', // 1000 , ..1000
duration: '30s',
preAllocatedVUs: 100, //
maxVUs: 200, // preAllocatedVU , ,
}
}
};
export default function () {
http.get('http://test.k6.io/contacts.php');
}
执行此脚本的结果如下:
$ k6 run test.js
/\ |‾‾| /‾‾/ /‾/
/\ / \ | |_/ / / /
/ \/ \ | | / ‾‾\
/ \ | |‾\ \ | (_) |
/ __________ \ |__| \__\ \___/ .io
execution: local
script: test.js
output: -
scenarios: (100.00%) 1 executors, 200 max VUs, 1m0s max duration (incl. graceful stop):
* constant_request_rate: 1000.00 iterations/s for 30s (maxVUs: 100-200, gracefulStop: 30s)
running (0m30.2s), 000/148 VUs, 29111 complete and 0 interrupted iterations
constant_request_rate ✓ [======================================] 148/148 VUs 30s 1000 iters/s
data_received..............: 21 MB 686 kB/s
data_sent..................: 2.6 MB 85 kB/s
*dropped_iterations.........: 889 29.454563/s
http_req_blocked...........: avg=597.53µs min=1.64µs med=7.28µs max=152.48ms p(90)=9.42µs p(95)=10.78µs
http_req_connecting........: avg=561.67µs min=0s med=0s max=148.39ms p(90)=0s p(95)=0s
http_req_duration..........: avg=107.69ms min=98.75ms med=106.82ms max=156.54ms p(90)=111.73ms p(95)=116.78ms
http_req_receiving.........: avg=155.12µs min=21.1µs med=105.52µs max=34.21ms p(90)=147.69µs p(95)=190.29µs
http_req_sending...........: avg=46.98µs min=9.81µs med=41.19µs max=5.85ms p(90)=53.33µs p(95)=67.3µs
http_req_tls_handshaking...: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...........: avg=107.49ms min=98.62ms med=106.62ms max=156.39ms p(90)=111.52ms p(95)=116.51ms
*http_reqs..................: 29111 964.512705/s
iteration_duration.........: avg=108.54ms min=99.1ms med=107.08ms max=268.68ms p(90)=112.09ms p(95)=118.96ms
*iterations.................: 29111 964.512705/s
vus........................: 148 min=108 max=148
vus_max....................: 148 min=108 max=148
编写测试脚本时,请考虑以下几点:
- k6 (), . , ,
maxRedirects: 0
. http ,maxRedirects
. - . , , , ,
sleep()
. - , , .
preAllocatedVU
/maxVU
, , , ,preAllocatedVU
,maxVU
.
WARN[0005] Insufficient VUs, reached 100 active VUs and cannot initialize more executor=constant-arrival-rate scenario=constant_request_rate
- ,
drop_iterations
,iterations
http_reqs
.dropped_iterations
, , . , ,preAllocatedVU
. , , , . - , , . :
WARN[0008] Request Failed
- 请记住,脚本API不支持持续时间,vus和阶段的全局使用,尽管它们仍可以使用。这也意味着您不能将它们与脚本一起使用。
结论
在v0.27.0发行之前,k6没有足够的支持来以恒定速率生成请求。因此,我们在JavaScript中实现了一种变通方法,计算脚本每次迭代完成请求所花费的时间。使用v0.27.0不再需要此功能。
在本文中,我讨论了k6如何使用以下新脚本API实现一致的请求率:
constant-arrival-rate
演员。该执行程序简化了代码,并提供了每秒实现固定数量请求的方法。这与同一篇文章的先前版本形成对比,在该文章中,我描述了另一种方法,该方法通过使用公式和一些样板JavaScript代码计算虚拟用户的数量,迭代次数和持续时间来获得几乎相同的结果。幸运的是,这种新方法可以按预期工作,并且我们不再需要使用任何技巧。
希望您喜欢阅读本文。我希望听到您的反馈。