Начало работы

WebRTC из CLI

Пишем и запускаем WebRTC нагрузочный тест через perfscale CLI — WHIP-публикация, P2P-звонки между VU и сводка WebRTC-метрик

Обзор

Движок perfscale гоняет WebRTC нагрузочные тесты через настоящий медиа-путь — каждый виртуальный пользователь выполняет ICE/DTLS-SRTP рукопожатия и передаёт настоящий RTP. Эта страница проведёт WHIP-тест публикации от YAML до сводки метрик; страница WebRTC в pro-фичах — полный справочник по actions и параметрам.

WebRTC-действия (pro/webrtc-*) — платная возможность: требуется план Scale или Enterprise, и в CLI, и под управлением controlplane.

Дашборд WebRTC нагрузочного теста — перцентили TTFF, виртуальные пользователи стримят RTP на SFU и счётчик ICE-рестартов

1. Установите CLI

npm install -g @perfscale/exe

Или скачайте бинарник под свою платформу со страницы GitHub Releases. У бинарника нет runtime-зависимостей — WebRTC работает на встроенном нативном движке, внешних бинарников не нужно.

2. Напишите тест

webrtc.test.yaml — публикуем синтетические аудио/видео в WHIP-endpoint, снимаем статистику, закрываем:

steps:
  - name: publish camera
    use: pro/webrtc-connect@v1
    with:
      signal: whip
      url: https://stream.example.com/whip/cam-${vu}
      bearer: ${WHIP_TOKEN}
    outputs: cam

  - name: send media
    use: pro/webrtc-publish@v1
    with:
      id: ${cam.id}
      tracks:
        - kind: video
          codec: av1
          source: synthetic
          bitrate: 1500kbps
          resolution: 1280x720
        - kind: audio
          codec: opus
          source: synthetic
          bitrate: 64kbps

  - name: measure
    use: pro/webrtc-stats@v1
    with: { id: ${cam.id} }

  - name: hang up
    use: pro/webrtc-close@v1
    with: { id: ${cam.id} }

webrtc.config.yaml — форма нагрузки:

vus: 5
duration: 30s

Для локального запуска нужен WHIP-target — подойдёт любой сервер, соответствующий стандарту (локальный LiveKit, mediasoup или WHIP-пример из Pion). Если его нет, проверьте файлы через perfscale lint (ниже) или направьте тест на P2P-звонок между VU (pro/webrtc-call@v1) — ему сервер вообще не нужен:

steps:
  - name: p2p call
    use: pro/webrtc-call@v1
    with:
      pairing:
        key: webrtc-room-1      # memory-драйвер — одного движка достаточно
      media: bidirectional
      hold: 10s

3. Запустите

perfscale run -f webrtc.test.yaml -c webrtc.config.yaml

-f выбирает встроенный нативный движок и требует -c. Проверить файлы без выполнения:

perfscale lint webrtc.test.yaml webrtc.config.yaml

Lint — это также место, где всплывают ошибки с capabilities: pro-действия требуют capability плана, и сценарий без нужной записи capabilities: падает на валидации до отправки первого пакета.

4. Читайте вывод

WebRTC-запуск печатает свои строки рядом с общими HTTP-метриками:

vus....................: 5 min=1 max=5
iterations.............: 48 1.60/s
webrtc_setup_ms........: avg=412.30 p(50)=398.10 p(90)=520.40 p(95)=561.00 p(99)=640.20
webrtc_ttff_ms.........: avg=255.80 p(50)=241.00 p(90)=330.50 p(95)=370.10 p(99)=402.00
webrtc_audio_rtt_ms....: avg=18.40 p(95)=42.10
webrtc_video_bitrate_bps: avg=1482.0k
webrtc_video_packets_lost_total: 3
webrtc_calls_total.....: 24
  • webrtc_ice_duration_ms / webrtc_dtls_duration_ms / webrtc_setup_ms — задержки фазы подключения, один сэмпл на успешный connect.
  • webrtc_ttff_ms — время до первого кадра на стороне подписчика.
  • webrtc_{audio,video}_* — качество медиа от фонового сэмплера getStats, пока соединения открыты; мультитрек добавляет per-track и per-layer серии (webrtc_video1_f_bitrate_bps).
  • webrtc_call_errors_<stage> — счётчики ошибок по стадиям для композитных P2P-звонков (ice, dtls, signaling, publish, subscribe, hold).

Чтобы гейтить CI на числах, экспортируйте сводку и проверяйте файл:

perfscale run -f webrtc.test.yaml -c webrtc.config.yaml --summary-export result.json
jq -e '.summary.error_rate < 0.01' result.json

Дальше

  • WebRTC (pro) — все параметры действий pro/webrtc-*: кастомный сигналинг через wasm-библиотеки, мультитрек и симулькаст, файловые источники и запись потоков, ICE-рестарт, джиттер-буфер и полный список метрик.
  • Разделяемые переменные — механизм рандеву за пейрингом pro/webrtc-call@v1, включая Redis-драйвер для мультиагентных тестов.