Как замерял производительность при нагрузочном тестировании

«Как замерял производительность при нагрузочном тестировании» — вопрос из категории Тестирование производительности, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При нагрузочном тестировании веб-приложений и API я использовал JMeter и k6, собирая ключевые метрики для анализа производительности и поиска узких мест.

Основные метрики, которые я замерял:

  • Время отклика (Response Time): Среднее, 90-й (p90) и 95-й (p95) процентили. p95 важен, так как показывает опыт 95% пользователей.
  • Пропускная способность (Throughput): Количество успешных запросов в секунду (RPS).
  • Процент ошибок: Доля запросов с HTTP-статусами 5xx, таймаутами или сбоями.
  • Метрики инфраструктуры: Загрузка CPU, использование памяти (RAM), IO-операции диска на серверах приложения и БД (снимал через Grafana + Prometheus).

Пример сценария на k6:

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

export const options = {
  stages: [
    { duration: '30s', target: 50 },   // Плавный рост до 50 VU
    { duration: '1m', target: 50 },    // Удержание нагрузки
    { duration: '20s', target: 0 },    // Спад
  ],
  thresholds: {
    'http_req_duration': ['p(95)<500'], // 95% запросов должны быть быстрее 500мс
    'http_req_failed': ['rate<0.01']    // Менее 1% ошибок
  }
};

export default function () {
  const res = http.get('https://api.example.com/users');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1);
}

Дополнительно анализировал логи базы данных (например, медленные SQL-запросы в PostgreSQL) и настройки веб-сервера (Nginx/Apache).