Что такое метрика RPS (Requests Per Second)?

Ответ

RPS (Requests Per Second, запросов в секунду) — это ключевая метрика производительности, которая показывает, сколько HTTP-запросов сервер или микросервис способен обработать за одну секунду. Это прямой индикатор пропускной способности (throughput) системы.

Зачем измерять RPS?

  • Оценка производительности: Понимание, как ведет себя приложение под нагрузкой.
  • Планирование емкости (Capacity Planning): Определение необходимого количества серверов/инстансов для ожидаемой нагрузки.
  • Выявление узких мест (Bottlenecks): Падение RPS при увеличении нагрузки может указывать на проблемы с CPU, памятью, блокировками в БД или внешними API.
  • Настройка автоскейлинга: Правила автомасштабирования (например, в Kubernetes или облачных провайдерах) часто основываются на RPS или аналогичных метриках.

Как измеряется? Обычно с помощью нагрузочного тестирования инструментами вроде k6, JMeter, Locust или Vegeta.

Пример простого скрипта для k6:

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

export const options = {
  stages: [
    { duration: '30s', target: 50 }, // Плавный рост до 50 виртуальных пользователей
    { duration: '1m', target: 50 },  // Удержание нагрузки
    { duration: '30s', target: 0 },  // Плавное снижение
  ],
};

export default function () {
  const res = http.get('https://test-api.example.com/products');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1); // Имитация "мышления" пользователя
}

После запуска теста k6 выдаст отчет, включающий средний RPS, процентили времени ответа и процент ошибок.

Важные нюансы:

  • RPS vs. Throughput: RPS — частный случай throughput, специфичный для HTTP. Throughput может измеряться в других единицах (операций/сек, Мбит/сек).
  • Зависимость от сложности запроса: RPS для "тяжелого" POST-запроса с вычислениями будет на порядки ниже, чем для простого GET-запроса за статичными данными.
  • Не единственная важная метрика: Высокий RPS бесполезен, если растет время отклика (latency) или процент ошибок. Всегда анализировать вместе с p95/p99 latency и error rate.
  • Влияние кэширования: Кэширование на уровне приложения (in-memory, Redis) или CDN радикально повышает RPS для подходящих запросов.

Ответ 18+ 🔞

Слушай, вот объясняю про RPS, запросы в секунду, как есть. Это, по сути, счётчик того, сколько раз твой сервер могут пнуть за секунду, чтобы он не сдох. Прямой показатель, насколько он вообще живучий.

А нахуя это вообще мерить?

  • Просто понять, не говно ли ты написал. Посмотреть, как твоё творение держится, когда на него начинают наваливать.
  • Чтобы не попасть на бабки. Чтобы заранее прикинуть, сколько этих твоих виртуальных серверов надо купить, когда к тебе толпа пользователей придёт. А то будет ой.
  • Найти узкое горлышко. Если RPS при росте нагрузки сначала растёт, а потом в пол обрушивается — всё, приехали. Ищи, где тормозит: процессор в пелёнке, память кончилась, база данных легла или какой-нибудь внешний сервис тебя послал.
  • Для магии автоскейлинга. Эти умные системы, которые сами добавляют или убирают сервера, часто как раз на RPS и смотрят. Мало пинков — убавили, много — добавили.

Как меряют? Да просто насилуют специальными программами! Берут k6, JMeter, Locust — и начинают долбить твой API, как будто ему нечего делать.

Вот, смотри, простейший пример для k6:

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

export const options = {
  stages: [
    { duration: '30s', target: 50 }, // Плавно наращиваем до 50 виртуальных уёбков
    { duration: '1m', target: 50 },  // Держим нагрузку, смотрим, не сдохнет ли
    { duration: '30s', target: 0 },  // Плавно отпускаем
  ],
};

export default function () {
  const res = http.get('https://test-api.example.com/products');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1); // Пользователь же не робот, ему подумать надо
}

Запустишь эту хуйню — и тебе вывалят отчёт: средний RPS, время ответа, где какие процентили, сколько ошибок. Всё как на духу.

Но есть важные детали, ёпта:

  • RPS и общая пропускная способность — не одно и то же. RPS — это про HTTP-пинки. А throughput может быть в чём угодно: в операциях с базой в секунду, в мегабитах. Не путай.
  • Всё зависит от запроса. RPS на запрос «отдай главную страницу» и на запрос «пересчитай мне всю аналитику за год» — это, блядь, небо и земля. Один будет как пуля, а второй — ползти, как черепаха в сиропе.
  • RPS один — ни о чём. Можно иметь овердохуища запросов в секунду, но если каждый из них выполняется по 10 секунд, то пользователи просто сдохнут от ожидания. Смотри всегда вместе с временем отклика (особенно p95, p99) и процентом ошибок. Одно без другого — пиздёж.
  • Кэш — твой лучший друг. Если правильно прикрутил кэширование (в памяти, в Redis, на CDN), то RPS для статики или одинаковых запросов взлетает до небес. Сервер просто отдаёт уже готовый ответ, а не ебётся с вычислениями каждый раз.