菜单
文档breadcrumb arrow Grafana k6breadcrumb arrow 示例breadcrumb arrow 跨 VU 分配工作负载
开源

跨 VU 分配工作负载

k6 可以为不同的 VU 函数调度不同的负载模式。包含多个工作负载的测试可以更好地模拟现实世界的流量,其中用户行为很少是统一的。例如,电子商务网站的大部分流量可能来自只搜索商品和阅读评论的用户。一小部分用户可能会积极购物,执行涉及写入数据库和调用不同 API 的操作。

以下部分提供了如何构建 k6 脚本以在 VU 之间拆分逻辑的示例。要检查特定行为的结果,您可以创建自定义指标或使用标签按场景、代码块或单个请求进行过滤。

注意

这些技术可能会创建非常复杂的配置。然而,更复杂的配置会增加结果解释的歧义性

跨场景拆分逻辑

注意

在此上下文中,工作负载指的是由场景模拟的流量模式。

一种分配流量的方法是使用场景为不同函数调度不同的工作负载。

  1. 在您的选项中定义多个场景。
  2. 使用场景的 exec 属性来执行不同 VU 函数的工作负载。

例如,想象一个社交媒体网站通常有 100 个并发用户。其中,80 个用户可能访问他们的联系人页面,20 个用户可能查看新闻。要配置这种分布,请创建两个具有不同吞吐量或 VU 的场景

JavaScript
import http from 'k6/http';

export const options = {
  //scenario to view contacts
  scenarios: {
    contacts: {
      executor: 'shared-iterations',
      exec: 'contacts',
      vus: 80,
      iterations: 100,
    },
    //scenario to view news
    news: {
      executor: 'shared-iterations',
      exec: 'news',
      vus: 20,
      iterations: 100,
    },
  },
};

//use the exec property to run different scenarios for different functions

export function contacts() {
  http.get('https://test.k6.io/contacts.php');
}

export function news() {
  http.get('https://test.k6.io/news.php');
}

要查看特定场景的详细结果,您可以按内置场景标签进行过滤。

按 VU ID 分配逻辑

在某些情况下,为每种行为编写一个场景可能不方便或不切实际。作为替代方案,您可以使用来自k6/execution模块的执行上下文变量在一定范围的 VU 中分配逻辑。使用 exec 对象,您可以将逻辑限定到特定实例、场景或所有 VU。

例如,此语句将行为分配给测试中的前 25 个 VU。

bash
if (exec.vu.idInTest <= 25) {
   //do something;
  }

为了更灵活,您可以使用取模表达式根据百分比分配 VU。例如,以下脚本根据不同的用户画像分配逻辑

  • 40% 的用户查看新闻。
  • 60% 的用户玩抛硬币游戏。
    • 一半赌正面,一半赌反面。
JavaScript
import http from 'k6/http';
import exec from 'k6/execution';

export const options = {
  scenarios: {
    quickRamp: {
      executor: 'ramping-arrival-rate',
      startRate: 0,
      timeUnit: '1s',
      preAllocatedVUs: 100,
      stages: [
        { target: 10, duration: '10s' },
        { target: 10, duration: '15s' },
        { target: 0, duration: '5s' },
      ],
    },
  },
};

export default function () {
  if (exec.vu.idInTest % 10 < 4) {
    // 0-3 range, read the news
    http.get('http://test.k6.io/news');
  } else if (exec.vu.idInTest % 10 < 7) {
    // 4-6 range, bet heads
    http.get('http://test.k6.io/flip_coin.php?bet=heads');
  } else {
    // 7-9 range, bet tails
    http.get('http://test.k6.io/flip_coin.php?bet=tails');
  }
}

要查看特定请求或组的结果,您可以定义标签

随机化行为

为了增加一定程度的随机行为,可以考虑使用来自k6 utils中的随机化函数之一。

例如,此脚本随机分配一种行为在三分之一的时间内发生,另一种行为在所有其他时间内发生。

JavaScript
import { sleep } from 'k6';
import { randomIntBetween } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';

export default function () {
  if (randomIntBetween(1, 3) % 3 > 1) {
    console.log('1 in 3 times');
  } else {
    console.log('2 in 3 times');
  }
}

有关更复杂的随机化示例,请阅读此论坛帖子