Yandex Cloud
Поиск
Связаться с экспертомПопробовать бесплатно
  • Кейсы
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
  • Marketplace
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Искусственный интеллект
    • Безопасность
    • Инструменты DevOps
    • Бессерверные вычисления
    • Управление ресурсами
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Калькулятор цен
    • Тарифы
    • Акции и free tier
  • Кейсы
  • Документация
  • Блог
Создавайте контент и получайте гранты!Готовы написать своё руководство? Участвуйте в контент-программе и получайте гранты на работу с облачными сервисами!
Подробнее о программе
Проект Яндекса
© 2026 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Организация сине-зеленого и канареечного развертывания версий веб-сервиса
    • Автоматизация сборки образов с помощью Jenkins и Packer
    • Непрерывное развертывание контейнеризованных приложений с помощью GitLab
    • Тестирование приложений с помощью GitLab
    • Создание тестовых ВМ через GitLab CI
    • Интеграция GitLab с Трекер
    • Высокопроизводительные вычисления (HPC) на прерываемых ВМ
    • Нагрузочное тестирование gRPC-сервиса
    • HTTPS-тест с постоянной нагрузкой с помощью Phantom
    • HTTPS-тест со ступенчатой нагрузкой с помощью Pandora
    • HTTP-тест с нагрузкой по сценарию с помощью Pandora
    • Нагрузочное тестирование с нескольких агентов
    • Запуск внешних агентов для нагрузочного тестирования
    • Нагрузочный тест с помощью JMeter
    • Получение статистики запросов к объектам Object Storage с использованием Query
    • Получение количества запросов к объектам Object Storage
    • Вызов нагрузочного тестирования из GitLab CI
    • Развертывание GitLab Runner на виртуальной машине Compute Cloud
    • Развертывание воркера SourceCraft на виртуальной машине Compute Cloud
    • Сравнение результатов нагрузочных тестов
    • Миграция нагрузочного тестирования на k6
    • ИИ-ревью пул-реквестов на GitHub с помощью Yandex Workflows и GitHub Actions

В этой статье:

  • Соответствие возможностей Load Testing и k6
  • Подготовьте окружение
  • Проверьте установку k6
  • Настройте инфраструктуру для генерации нагрузки
  • Перенесите профили нагрузки
  • const — постоянная нагрузка
  • line — линейный рост
  • step — ступенчатый рост
  • once — единоразовый всплеск
  • Перенесите тестовые данные и сценарии
  • HTTP-запросы
  • gRPC-запросы
  • Данные из файлов
  • Настройте автостоп
  • Остановка по времени ответа
  • Остановка по HTTP-кодам
  • Остановка по квантилям
  • Ограничение по времени
  • Настройте визуализацию результатов
  • Встроенный вывод
  • Экспорт в JSON
  • Визуализация в Grafana
  • Настройте регрессионный анализ
  • Thresholds в CI/CD
  • Хранение истории в Grafana
  • Настройте мониторинг ресурсов генератора
  • Настройте запуск в CI/CD
  • Что дальше
  1. Разработка и тестирование
  2. Миграция нагрузочного тестирования на k6

Миграция нагрузочного тестирования с Load Testing на k6

Статья создана
Yandex Cloud
Обновлена 8 апреля 2026 г.
  • Соответствие возможностей Load Testing и k6
  • Подготовьте окружение
  • Проверьте установку k6
  • Настройте инфраструктуру для генерации нагрузки
  • Перенесите профили нагрузки
    • const — постоянная нагрузка
    • line — линейный рост
    • step — ступенчатый рост
    • once — единоразовый всплеск
  • Перенесите тестовые данные и сценарии
    • HTTP-запросы
    • gRPC-запросы
    • Данные из файлов
  • Настройте автостоп
    • Остановка по времени ответа
    • Остановка по HTTP-кодам
    • Остановка по квантилям
    • Ограничение по времени
  • Настройте визуализацию результатов
    • Встроенный вывод
    • Экспорт в JSON
    • Визуализация в Grafana
  • Настройте регрессионный анализ
    • Thresholds в CI/CD
    • Хранение истории в Grafana
  • Настройте мониторинг ресурсов генератора
  • Настройте запуск в CI/CD
  • Что дальше

Важно

С 1 июля 2026 года сервис Load Testing прекращает работу. Подробнее на странице Закрытие сервиса Yandex Load Testing.

В качестве замены рекомендуется использовать k6 — открытый инструмент нагрузочного тестирования от Grafana Labs. k6 поддерживает HTTP, gRPC, WebSocket и другие протоколы, легко встраивается в CI/CD и предоставляет гибкие средства анализа результатов.

В этом руководстве описано, как перенести существующие сценарии нагрузочного тестирования на k6 с сохранением привычных возможностей: профилей нагрузки, автостопа, мониторинга и регрессионного анализа.

Чтобы перенести сценарии нагрузочного тестирования на k6:

  1. Изучите соответствие возможностей.
  2. Подготовьте окружение.
  3. Проверьте установку k6.
  4. Настройте инфраструктуру для генерации нагрузки.
  5. Перенесите профили нагрузки.
  6. Перенесите тестовые данные и сценарии.
  7. Настройте автостоп.
  8. Настройте визуализацию результатов.
  9. Настройте регрессионный анализ.
  10. Настройте мониторинг ресурсов генератора.
  11. Настройте запуск в CI/CD.

Соответствие возможностей Load Testing и k6Соответствие возможностей Load Testing и k6

Возможность в Load Testing

Аналог в k6

Подробнее

Агент — управляемая ВМ для генерации нагрузки

Любая машина с установленным k6: локальный компьютер, ВМ в облаке, контейнер в CI/CD

Инфраструктура для генерации нагрузки

Генераторы нагрузки — Pandora, Phantom, JMeter

Единый встроенный генератор k6 с поддержкой HTTP/1.1, HTTP/2, gRPC, WebSocket

Тестовые данные и сценарии

Профиль нагрузки — const, line, step, once

Сценарии (scenarios) с executor'ами: constant-arrival-rate, ramping-arrival-rate, shared-iterations и др.

Профили нагрузки

Тестирующие потоки — параллельные соединения для генерации RPS

Виртуальные пользователи (VU) — каждый выполняет сценарий в цикле; RPS = VU / время итерации

Профили нагрузки

Тестовые данные — форматы URI, HTTP_JSON, GRPC_JSON, файлы из Object Storage

Запросы описываются в JavaScript-скрипте; внешние данные загружаются через SharedArray

Тестовые данные и сценарии

Автостоп — остановка теста по времени ответа, HTTP-кодам, квантилям

Thresholds с параметром abortOnFail — аналогичные критерии остановки

Автостоп

Результаты тестирования — графики квантилей, кодов ответов, RPS

Встроенная сводка в терминале; визуализация через Grafana + InfluxDB/Prometheus

Результаты тестирования

Дашборд регрессий — отслеживание деградации между запусками

Grafana-дашборд с историей запусков и алерты на пороговые значения

Регрессионный анализ

Мониторинг агента — CPU, память, диск, сеть через Telegraf/Monitoring

Telegraf, node_exporter и Prometheus или Monitoring для ВМ в облаке

Мониторинг ресурсов генератора

Консоль управления — веб-интерфейс для настройки и запуска тестов

CLI k6 run для запуска; Grafana для визуализации; CI/CD для автоматизации

Запуск в CI/CD

Конфигурация теста — YAML-файл с параметрами генератора

JavaScript-файл с объектом options — профили, пороги и сценарии в одном месте

Профили нагрузки

Подготовьте окружениеПодготовьте окружение

  1. Установите k6 на машину, с которой планируете запускать тесты:

    Linux
    macOS
    Docker
    sudo gpg -k
    sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg \
      --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
    echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" \
      | sudo tee /etc/apt/sources.list.d/k6.list
    sudo apt-get update && sudo apt-get install k6
    
    brew install k6
    
    docker pull grafana/k6
    
  2. Если вы планируете визуализировать результаты, подготовьте стек мониторинга — например, Grafana с InfluxDB или Prometheus.

Проверьте установку k6Проверьте установку k6

Убедитесь, что k6 установлен и работает. Следующая команда запустит короткий тест — десять виртуальных пользователей в течение 30 секунд будут отправлять GET-запросы и проверять код ответа:

k6 run - << 'EOF'
import http from 'k6/http';
import { sleep, check } from 'k6';

export const options = {
  vus: 10,
  duration: '30s',
};

export default function () {
  const res = http.get('https://test.k6.io/');
  check(res, { 'статус 200': (r) => r.status === 200 });
  sleep(1);
}
EOF

По завершении k6 выведет сводку: количество запросов, среднее время ответа, процент успешных проверок и другие метрики. Это тот же формат результатов, с которым вы будете работать в дальнейшем.

Чтобы посмотреть полный список команд и флагов, выполните:

k6 --help

Настройте инфраструктуру для генерации нагрузкиНастройте инфраструктуру для генерации нагрузки

В Load Testing тесты запускались на управляемых агентах — виртуальных машинах, которые создавались и настраивались автоматически.

В k6 генератор нагрузки запускается на любой машине: локальном компьютере, виртуальной машине в облаке или в контейнере CI/CD-пайплайна.

Если вашим тестам требовался доступ к целевому приложению через внутреннюю сеть Yandex Cloud, создайте виртуальную машину в нужной подсети и запускайте k6 на ней.

Ориентировочные рекомендации по ресурсам для генератора нагрузки (для простых HTTP-сценариев без тяжелой обработки ответов):

Профиль нагрузки

vCPU

RAM

До 10 000 RPS

2

2 ГБ

До 20 000 RPS

4

4 ГБ

До 40 000 RPS

8

8 ГБ

Для сценариев с JSON-парсингом, множественными проверками или большими телами ответов потребуется больше ресурсов. Подробнее в руководстве по запуску масштабных тестов.

Для нагрузки свыше 40 000 RPS используйте распределенное выполнение k6.

Перенесите профили нагрузкиПеренесите профили нагрузки

В Load Testing нагрузка задавалась в единицах RPS через профили line, const, step и once. В k6 нагрузка управляется через количество виртуальных пользователей (VU) и сценарии. Каждый VU выполняет тестовый сценарий в цикле — итоговый RPS зависит от числа VU и времени выполнения одной итерации.

const — постоянная нагрузкаconst — постоянная нагрузка

Load Testing:

load_profile:
  load_type: rps
  schedule:
    - {duration: 300s, type: const, ops: 10000}

k6 — фиксированное число VU:

export const options = {
  scenarios: {
    constant_load: {
      executor: 'constant-vus',
      vus: 100,
      duration: '5m',
    },
  },
};

Если требуется точный контроль RPS, используйте executor constant-arrival-rate:

export const options = {
  scenarios: {
    constant_load: {
      executor: 'constant-arrival-rate',
      rate: 10000,
      timeUnit: '1s',
      duration: '5m',
      preAllocatedVUs: 200,
      maxVUs: 500,
    },
  },
};

line — линейный ростline — линейный рост

Load Testing:

load_profile:
  load_type: rps
  schedule:
    - {duration: 180s, type: line, from: 1, to: 10000}

k6:

export const options = {
  scenarios: {
    ramp_up: {
      executor: 'ramping-arrival-rate',
      startRate: 1,
      timeUnit: '1s',
      preAllocatedVUs: 200,
      maxVUs: 500,
      stages: [
        { duration: '3m', target: 10000 },
      ],
    },
  },
};

step — ступенчатый ростstep — ступенчатый рост

Load Testing:

load_profile:
  load_type: rps
  schedule:
    - {duration: 30s, type: step, from: 10, to: 100, step: 5}

k6 — эквивалент через несколько стадий. В исходном профиле 18 ступеней (от 10 до 100 с шагом 5) за 30 секунд — примерно 1,7 с на ступень:

export const options = {
  scenarios: {
    stepped_load: {
      executor: 'ramping-arrival-rate',
      startRate: 10,
      timeUnit: '1s',
      preAllocatedVUs: 50,
      maxVUs: 200,
      stages: [
        { duration: '1.7s', target: 15 },
        { duration: '1.7s', target: 20 },
        { duration: '1.7s', target: 25 },
        { duration: '1.7s', target: 30 },
        { duration: '1.7s', target: 35 },
        { duration: '1.7s', target: 40 },
        { duration: '1.7s', target: 45 },
        { duration: '1.7s', target: 50 },
        { duration: '1.7s', target: 55 },
        { duration: '1.7s', target: 60 },
        { duration: '1.7s', target: 65 },
        { duration: '1.7s', target: 70 },
        { duration: '1.7s', target: 75 },
        { duration: '1.7s', target: 80 },
        { duration: '1.7s', target: 85 },
        { duration: '1.7s', target: 90 },
        { duration: '1.7s', target: 95 },
        { duration: '1.7s', target: 100 },
      ],
    },
  },
};

once — единоразовый всплескonce — единоразовый всплеск

Load Testing:

load_profile:
  load_type: rps
  schedule:
    - {type: once, times: 133}

k6:

export const options = {
  scenarios: {
    burst: {
      executor: 'shared-iterations',
      vus: 133,
      iterations: 133,
    },
  },
};

Перенесите тестовые данные и сценарииПеренесите тестовые данные и сценарии

HTTP-запросыHTTP-запросы

Если ваши тесты использовали формат URI или HTTP_JSON, перенесите запросы в скрипт k6:

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

export default function () {
  // GET-запрос
  const res = http.get('https://my-app.example.com/api/items');
  check(res, {
    'статус 200': (r) => r.status === 200,
  });

  // POST-запрос
  const payload = JSON.stringify({ title: 'Новая задача', completed: false });
  const params = { headers: { 'Content-Type': 'application/json' } };
  const postRes = http.post('https://my-app.example.com/api/items', payload, params);
  check(postRes, {
    'создано': (r) => r.status === 201,
  });

  sleep(1);
}

gRPC-запросыgRPC-запросы

Если вы тестировали gRPC-сервисы через Pandora с форматом GRPC_JSON, в k6 используйте встроенный модуль k6/net/grpc.

Load Testing (формат GRPC_JSON):

{"tag": "/api.Adder/Add", "call": "api.Adder.Add", "metadata": {"Authorization": ["Bearer ..."]}, "payload": {"x": 21, "y": 12}}

k6:

import grpc from 'k6/net/grpc';
import { check } from 'k6';

const client = new grpc.Client();
client.load(['proto'], 'adder.proto');

export default () => {
  if (__ITER === 0) {
    client.connect('my-grpc-service.example.com:8080', { plaintext: true });
  }

  const response = client.invoke('api.Adder/Add', { x: 21, y: 12 }, {
    metadata: { authorization: 'Bearer ...' },
  });

  check(response, {
    'статус OK': (r) => r.status === grpc.StatusOK,
  });

};

Данные из файловДанные из файлов

Если тестовые данные хранились в Object Storage, загрузите их локально и используйте в скрипте через SharedArray:

import http from 'k6/http';
import { SharedArray } from 'k6/data';

const data = new SharedArray('urls', function () {
  return JSON.parse(open('./test-data.json'));
});

export default function () {
  const item = data[Math.floor(Math.random() * data.length)];
  http.get(item.url);
}

Настройте автостопНастройте автостоп

В Load Testing автостоп прерывал тест при нарушении заданных условий. В k6 аналогичную функцию выполняют пороговые значения (thresholds) с параметром abortOnFail.

Остановка по времени ответаОстановка по времени ответа

Load Testing:

autostop:
  - time(1s, 30s)

k6 — используйте высокий квантиль (например, p(99)), чтобы приблизиться к поведению оригинала, где проверяется время каждого запроса:

export const options = {
  thresholds: {
    http_req_duration: [
      { threshold: 'p(99)<1000', abortOnFail: true, delayAbortEval: '30s' },
    ],
  },
};

Остановка по HTTP-кодамОстановка по HTTP-кодам

Load Testing:

autostop:
  - http(5xx, 10%, 30s)

Встроенная метрика http_req_failed учитывает все ответы с кодом >= 400 (4xx и 5xx). Чтобы отслеживать только 5xx, создайте кастомную метрику:

import http from 'k6/http';
import { Rate } from 'k6/metrics';

const errors5xx = new Rate('errors_5xx');

export const options = {
  thresholds: {
    errors_5xx: [
      { threshold: 'rate<0.1', abortOnFail: true, delayAbortEval: '30s' },
    ],
  },
};

export default function () {
const res = http.get('https://my-app.example.com/api/endpoint');
errors5xx.add(res.status >= 500);
}

Остановка по квантилямОстановка по квантилям

Load Testing:

autostop:
  - quantile(95, 100ms, 10s)

k6:

export const options = {
  thresholds: {
    http_req_duration: [
      { threshold: 'p(95)<100', abortOnFail: true, delayAbortEval: '10s' },
    ],
  },
};

Ограничение по времениОграничение по времени

Load Testing:

autostop:
  - limit(10m)

k6 — задается через duration в параметрах сценария:

export const options = {
  scenarios: {
    default: {
      executor: 'constant-vus',
      vus: 50,
      duration: '10m',
    },
  },
};

Настройте визуализацию результатовНастройте визуализацию результатов

Встроенный выводВстроенный вывод

По завершении теста k6 выводит сводку с основными метриками в терминал:

  • http_req_duration — время ответа (avg, min, med, max, p90, p95);
  • http_req_failed — доля неуспешных запросов;
  • http_reqs — общее количество запросов и RPS;
  • iterations — количество выполненных итераций;
  • vus — количество виртуальных пользователей.

Экспорт в JSONЭкспорт в JSON

Чтобы сохранить детальные результаты, выполните команду:

k6 run --out json=results.json test.js

Визуализация в GrafanaВизуализация в Grafana

Для получения графиков, аналогичных тем, что предоставлял Load Testing (квантили времени ответа, коды ответов, RPS), настройте экспорт метрик в одну из поддерживаемых систем.

InfluxDB v1 + Grafana:

k6 run --out influxdb=http://localhost:8086/k6 test.js

Важно

Встроенный вывод --out influxdb поддерживает только InfluxDB v1. Для InfluxDB v2 используйте расширение xk6-output-influxdb.

Используйте готовый дашборд для k6 в Grafana. Он включает графики:

  • квантили времени ответа (аналог графика «Квантили» в Load Testing);
  • количество виртуальных пользователей (аналог «Тестирующие потоки»);
  • HTTP-коды ответов;
  • RPS.

Prometheus + Grafana:

K6_PROMETHEUS_RW_SERVER_URL=http://localhost:9090/api/v1/write \
  k6 run -o experimental-prometheus-rw test.js

Настройте регрессионный анализНастройте регрессионный анализ

В Load Testing дашборды регрессий позволяли отслеживать деградацию показателей от запуска к запуску. В k6 аналогичный результат достигается двумя способами.

Thresholds в CI/CDThresholds в CI/CD

Задайте пороговые значения в скрипте — k6 завершится с ненулевым кодом возврата при их нарушении:

export const options = {
  thresholds: {
    http_req_duration: ['p(95)<200', 'p(99)<500'],
    http_req_failed: ['rate<0.01'],
  },
};

В CI/CD-пайплайне проверяйте код возврата k6:

load-test:
  script:
    - k6 run test.js
  # При нарушении порогов задание упадет автоматически

Хранение истории в GrafanaХранение истории в Grafana

При экспорте результатов в InfluxDB или Prometheus история всех запусков сохраняется автоматически. Настройте в Grafana:

  1. Дашборд с графиками ключевых метрик (p95, p99, RPS, процент ошибок).
  2. Алерты на превышение пороговых значений.
  3. Аннотации для отметки моментов запуска тестов.

Это обеспечит наглядное отслеживание тренда производительности, аналогичное дашбордам регрессий Load Testing.

Настройте мониторинг ресурсов генератораНастройте мониторинг ресурсов генератора

В Load Testing мониторинг агента (CPU, память, диск, сеть) был встроен в сервис. При использовании k6 для мониторинга машины-генератора используйте стандартные средства:

  • Telegraf + Grafana — если мониторинг уже настроен, данные продолжат собираться.
  • Monitoring — если генератор работает на виртуальной машине Compute Cloud, метрики ВМ доступны в Monitoring без дополнительной настройки.
  • node_exporter + Prometheus — стандартный подход для мониторинга Linux-машин.

Настройте запуск в CI/CDНастройте запуск в CI/CD

k6 легко встраивается в любой CI/CD-пайплайн.

Пример для GitLab CI:

load-test:
  stage: test
  image: grafana/k6
  script:
    - k6 run
        -u ${K6_VUS:-50}
        -d ${K6_DURATION:-5m}
        --env BASE_URL="${BASE_URL}"
        test.js
  artifacts:
    paths:
      -load-performance.json

Для сохранения результатов в файл используйте функцию handleSummary() в скрипте:

export function handleSummary(data) {
  return {
    'load-performance.json': JSON.stringify(data, null, 2),
  };
}

Пример для GitHub Actions:

- name: Нагрузочное тестирование
  uses: grafana/k6-action@v0.3.1
  with:
    filename: test.js
    flags: -u 50 -d 5m

Что дальшеЧто дальше

  • Документация k6 — полное руководство по возможностям инструмента.
  • Примеры скриптов k6 — готовые сценарии для различных протоколов.
  • k6 Extensions — расширения для поддержки дополнительных протоколов (SQL, Kafka, Redis и других).
  • Grafana Cloud k6 — управляемый сервис для запуска k6 с визуализацией и хранением результатов.

Была ли статья полезна?

Предыдущая
Сравнение результатов нагрузочных тестов
Следующая
ИИ-ревью пул-реквестов на GitHub с помощью Yandex Workflows и GitHub Actions
Создавайте контент и получайте гранты!Готовы написать своё руководство? Участвуйте в контент-программе и получайте гранты на работу с облачными сервисами!
Подробнее о программе
Проект Яндекса
© 2026 ООО «Яндекс.Облако»