k6 中的 sleep 功能是暂停所有虚拟用户的执行,还是一次只暂停一个用户的执行?

Posted

技术标签:

【中文标题】k6 中的 sleep 功能是暂停所有虚拟用户的执行,还是一次只暂停一个用户的执行?【英文标题】:Does the sleep function in k6 pause execution of all virtual users or just one user at a time? 【发布时间】:2020-04-09 08:44:57 【问题描述】:

我是使用https://k6.io 进行负载测试的新手,我想知道sleep 函数的行为。

现在我已经构建了一个包含多个阶段的负载测试。在我的默认函数中,我有许多被执行的请求(get 和 post)。

我注意到,如果我只是按顺序执行几分钟,我在弹性 beanstalk 上运行的应用程序开始变慢并最终抛出 500 错误。

但是,如果我像这样在每个请求之后添加 sleep 语句:


const getMe = http.get(`$appEndpoint/me`, params)
check(getMe, 
  'me: status was 200': r => r.status == 200,
  'me: response time OK (under 500ms)': r => r.timings.duration < maxResponseTimeMs,
  );

sleep(Math.floor(Math.random() * 4) + 1)

// next request would follow below

然后我可以轻松地将虚拟用户数量增加 10 倍而没有任何问题。

所以我的问题是:

sleep 是否会导致 k6 在这段时间内暂停所有虚拟用户的所有请求,或者它只是一次暂停一个虚拟用户的请求。

据我了解,虚拟用户本质上只是运行负载测试的 default 函数的并行执行,因此整个函数会为所有用户暂停,还是针对每个用户执行此操作。

在文档中找不到有关此的任何信息,因此任何指针将不胜感激!

谢谢

【问题讨论】:

【参考方案1】:

sleep 是否会导致 k6 在这段时间内暂停所有虚拟用户的所有请求,或者它只是一次暂停一个虚拟用户的请求。

您的直觉是正确的:由于 VU 并行执行 default 函数并且彼此隔离,因此 sleep() 调用将仅暂停该 VU 的执行。

由于您在迭代之间随机休眠 1-4 秒,因此您的服务器可能能够处理随机数量的流量,而尽可能快地发送请求,因为您的测试机器可以发送它们会导致速度变慢和 500 错误.在测试期间,您会发现最适合您的系统的平衡是什么,以及最适合您的。

这种sleep()-ing 技术正是出于这个原因很有用,因此您可以控制发送的请求数量。也可以看看--rps option。

【讨论】:

以上是关于k6 中的 sleep 功能是暂停所有虚拟用户的执行,还是一次只暂停一个用户的执行?的主要内容,如果未能解决你的问题,请参考以下文章

达到更多虚拟用户时 k6 显示的错误

C#中关于Thread.sleep(1000)的问题!!

Thread.sleep() 和断点之间的区别(暂停线程)

c语言sleep用法是啥?

用户体验升级|丝滑般享受的执剑人单点登录功能来了!

wait & sleep