vyvchy
    Теми розділу

    10 · Performance testing

    Стратегія performance-тестування: від вимог до звіту

    Зміст

    Задача приходить в одному формулюванні: «подивись, чи витримаємо». Попередні глави розділу дали для неї деталі — види тестів, метрики, модель навантаження, інструменти, стенд, моніторинг, аналіз. Але між реченням замовника й фінальним звітом стоїть послідовність рішень, і майже жодне з них не технічне: що вважаємо успіхом, на яких даних міряємо, з чим порівнюємо, кому й якими числами розповідаємо, коли вважаємо роботу закінченою. Провалюються перф-активності зазвичай саме тут, а не на скрипті.

    Ця глава — маршрут, а не переказ попередніх. Кожна тема взята рівно настільки, щоб було видно її місце в ланцюжку, а за деталями стоїть лінк на главу, де тема живе. Читати корисно двічі: перед першим самостійним прогоном — як чекліст, і перед співбесідою рівня senior — як карту.

    Тест-план перф-тесту: шість рішень до першого прогону

    Канон формулює вхідну умову різко: перф-тестування не слід починати, не зрозумівши спершу, які виміри й метрики потрібні. Ціна порушення — не час, а сенс: результати нема з чим порівняти, і прогін оцінюється субʼєктивною думкою однієї-двох людей. Тому «план» тут — не документ на двадцять сторінок, а шість відповідей, які мають існувати до того, як хтось відкриє інструмент.

    РішенняПитання, на яке воно відповідаєДе розібрано
    Цілізаради чого прогін і хто вважатиме його вдалимЦілі та місце в QA-процесі
    Scopeякі транзакції граємо і які метрики збираємоМетрики
    Профільскільки і чого подаємо системіМодель навантаження
    Середовищеде міряємо і на яких данихСередовище й достовірність
    Критерії прийманняза яким числом ухвалюємо вердиктNFR, SLA, SLO, SLI
    Ризикиякого режиму відмови ми боїмосяВиди performance-тестів

    Цілі задають стейкхолдери, а не тестувальник: саме вони визначають цілі, термінологію й критерії того, чи ціль досягнуто. Канон вимагає розводити користувацькі цілі (задоволеність користувача й бізнес-цілі) і технічні (операційні аспекти, здатність масштабуватися, умови появи деградації). І дає три питання, з яких починається розмова: які виконуватимуться в тесті і який середній очікується; які системні метрики збиратимуться і які значення очікуються; яких поліпшень очікують проти попередніх циклів.

    Scope — це не «покрити все». Збирати більше метрик, ніж потрібно, не обовʼязково добре: кожна обрана метрика потребує засобу для послідовного збору й звітування, тож завдання — визначити досяжний набір, що підтримує цілі тесту. Канон називає й метод — GQM (Goal-Question-Metric): спершу цілі, потім питання, за якими буде видно, що їх досягнуто. І одразу межу, гострішу за метод: забагато вимірів робить аналіз важким і негативно впливає на фактичну продуктивність застосунку.

    (acceptance criteria) канон привʼязує до трьох джерел одразу: загальних цілей перф-тесту, SLA і базових значень. Машинної форми вони набувають у порозі (threshold) — виразі виду <агрегація> <оператор> <значення>, який наприкінці прогону обчислюється в true або false; провалений поріг робить провальним увесь тест і дає ненульовий код виходу. Тут ховається пастка вічнозелених прогонів: чек без порога гейтом не є — невдалі чеки тест провалом не завершують, вони лише ведуть облік частки невдач.

    Профіль і середовище: дві частини плану, на яких сипляться цифри

    (operational profile) — фактичний або передбачений патерн використання компонента чи системи, і будується він із даних, а не з уяви. Канон дає три джерела: інтервʼю або воркшопи зі стейкхолдерами, дані про використання схожих застосунків і спостереження за поведінкою користувачів на визначених задачах. Дока k6 описує той самий крок із боку практики: щоб визначити трафік, знайдіть типові патерни у власних аналітиці й моніторингу. Два правила поверх: будувати згори вниз — спершу прості широкі профілі, деталізувати лише за потреби, — і рецензувати профілі з головними стейкхолдерами до того, як із них зроблять . Друге правило і є захистом від найдорожчої помилки: «ми міряли не те». Окремо канон нагадує, що навантаження не завжди накладає користувач — пакетні системи теж мають профілі.

    Середовище оцінюють одним поняттям — (test environment fidelity). Вимога канону має дві половини, і друга важливіша за першу: зробити середовище настільки близьким до продакшену, наскільки можливо, а якщо це неможливо — мати чітке розуміння відмінностей і того, як результати проєктуватимуться на продакшн. Найважливіші частини — дані, конфігурація заліза й ПЗ, конфігурація мережі, причому дані стоять першими: їхні розмір і структура можуть кардинально вплинути на результат, а передбачити цей вплив до тестування важко. Перед основним прогоном стенд валідують контрольованим набором тестів.

    І чесна межа: прод не відтворюється в принципі. Канон SRE каже прямо — продакшн зазвичай не герметичний, бо темп вносить живі зміни, тож усе продове середовище навмисно не є представницьким для жодної окремої версії бінарника з репозиторію. «Prod-like» — це кероване розходження, яке ви можете назвати, а не рівність, якої можна досягти. Підготовка й ізоляція даних для сценарію — у главі Кореляція, параметризація і тестові дані, вибір самого генератора — у главі Інструменти навантаження.

    Цикл: базовий вимір → прогін → аналіз → оптимізація → повтор

    Перф-тестування ітеративне за природою: кожен прогін дає інсайт, інформація з нього йде на виправлення або оптимізацію параметрів, наступна ітерація показує наслідок змін — і так, поки цілі не досягнуто. Це не захід перед релізом, а контур із початком і умовою виходу.

    Ні

    Так

    Базовий вимір
    знімок на підготовлених даних

    Прогін
    профіль + пороги

    Аналіз
    симптом → ресурс → код

    Цілі досягнуто?

    Оптимізація
    зміна в системі або конфігурації

    Звіт і рішення
    залишковий ризик числом

    Ні

    Так

    Базовий вимір
    знімок на підготовлених даних

    Прогін
    профіль + пороги

    Аналіз
    симптом → ресурс → код

    Цілі досягнуто?

    Оптимізація
    зміна в системі або конфігурації

    Звіт і рішення
    залишковий ризик числом

    Початок контуру — (performance baseline), набір метрик для порівняння поточних і раніше досягнутих результатів. Він потрібен, щоб продемонструвати конкретні поліпшення або підтвердити досягнення критеріїв приймання. Деталь, яку регулярно пропускають: baseline не «беруть із проду» — канон каже, що його може бути потрібно спершу створити, використовуючи знеособлені дані з бази, де це можливо. Саме тому він відтворюваний.

    Далі — три цілі, які легко злипаються в одну. Порівняння з базовим виміром відповідає на питання «чи ми не погіршилися проти зафіксованої точки»; тренд — «куди ми рухаємося загалом»; виявлення релізу — «чи пускати цей білд». Дока k6 перелічує їх окремими пунктами, і це не буквоїдство: сплутавши їх, ставлять поріг там, де потрібен графік. А перед довгим прогоном варто почати зі -тесту — низьке навантаження на секунди чи хвилини, щоб переконатися, що скрипт працює і система нормально почувається з кількома користувачами.

    Жодне з цих трьох порівнянь не існує без збережених результатів — на них контур і замикається, тож форму виводу обирають ще до першого прогону. Розвилка проста: k6 віддає метрики або агрегованою статистикою, або окремими точками з мітками часу, і для порівняння прогонів годиться друга форма — підсумкова зведена цифра тренду не показує й регресію в конкретному відрізку прогону сховає.

    Умова, без якої контур не працює, — відтворюваність: повтор на незміненій системі має давати статистично ідентичні результати в межах заданого . Звідси й дрібниці, які виглядають бюрократією, а є фундаментом: якщо під час тесту дані генеруються або змінюються, може знадобитися відновити початкові дані перед наступним циклом. І окремо про наївне порівняння: час є одним із найбільших джерел зміни спостережуваних метрик, тому оцінити деградацію порівнянням «до й після» важко — реліз у понеділок ми порівнюємо з поведінкою у вихідні й вносимо великий обсяг шуму. Розкид лікують не ширшим порогом, а повторенням: Lighthouse CI називає багаторазовий прогін заради зменшення дисперсії серед своїх можливостей. Як контур живе в — у главі Performance-тести в CI/CD; як із симптому дістати назву ресурсу — у главі Аналіз результатів.

    Планування ємності: від «скільки тримаємо» до «скільки треба»

    (capacity testing) визначає, скільки користувачів або транзакцій система підтримає і при цьому все ще виконає заявлені цілі продуктивності. Умова «і при цьому» — половина означення: максимум, при якому система ще відповідає за час X, і максимум, при якому вона просто не падає, — два різні числа, і ємністю канон називає перше. Поруч стоїть (scalability testing) — воно визначає здатність системи рости під майбутні вимоги, не порушуючи чинних і не відмовляючи. Ємність — про зараз і на цьому залізі, масштабованість — про потім і, ймовірно, на іншому.

    Планування ємності починається там, де результат тесту перестає бути «пройдено/провалено». Канон описує вихід масштабованості як експлуатаційний артефакт: щойно межі відомі, порогові значення можна встановити й моніторити на проді, щоб отримати попередження про проблеми, які ось-ось виникнуть, а продове середовище — підлаштувати відповідною кількістю заліза. І окремо — що робити, коли чисел ще немає: якщо очікувану кількість транзакцій або одночасних користувачів не можна специфікувати рано, проєктні й архітектурні рішення мають допускати високозмінну масштабованість.

    Далі — застереження, яке рятує від найпоширенішого артефакту планування, таблички «ми тримаємо N RPS». Різні запити мають кардинально різні вимоги до ресурсів, а вартість запиту може змінюватися від довільних чинників — коду клієнта або навіть часу доби. Висновок канону SRE прямий: моделювання ємності як «запитів за секунду» або через статичні ознаки запитів часто виявляється поганою метрикою, бо співвідношення змінюються, а рухома ціль — погана метрика; краще міряти ємність прямо в доступних ресурсах. Практичний наслідок: «система тримає 5000 запитів за секунду» без указання складу запитів на інший мікс не переноситься.

    Ще одна цифра, яку люблять писати у звіт, — точка, після якої графік ламається. (knee point) запозичена з математики, і канонічного означення саме для кривої навантаження вона не має; критикують її щонайменше з 1940-х за те, що положення перегину є функцією обраних масштабів координат: розтягнули вісь — і перегин переїхав. Тому у звіті точку називають разом із критерієм, за яким її визначили. Що система робить за цією точкою — окрема вимога: (graceful degradation) означає віддавати відповіді, не такі точні або з меншим обсягом даних, але дешевші в обчисленні, і лише при екстремальному перевантаженні переходити на помилки.

    Комунікація: бізнесу — одні числа, інженерам — інші

    Правило розподілу дає сам канон, розкладаючи три головні метрики за адресатами: час відповіді — турбота користувача, — турбота бізнесу, — турбота системи. Це не стилістика презентації, а вимога до тесту: результати мусять бути зрозумілі й легко порівнянні з очікуваннями стейкхолдерів.

    Один прогін

    Час відповіді
    перцентилі транзакцій

    Пропускна здатність
    транзакцій за одиницю часу

    Утилізація й насичення
    ресурси системи

    Користувач і продукт

    Бізнес

    Розробка та експлуатація

    Один прогін

    Час відповіді
    перцентилі транзакцій

    Пропускна здатність
    транзакцій за одиницю часу

    Утилізація й насичення
    ресурси системи

    Користувач і продукт

    Бізнес

    Розробка та експлуатація

    Форма, у якій говорять із бізнесом, задана каноном через негативний приклад: сказати «так, клієнти все ще можуть чекати довго під час оформлення» — не допомагає, бо не дає уявлення ні про досягнуте зниження , ні про залишковий рівень. Замість цього потрібна ясна картина частки клієнтів, які ймовірно зазнають затримок, рівних або більших за певні пороги. Тобто пишеться в тій самій формі, що й ціль: «X% користувачів повільніше за Y». Звідси й вимога до чисел: усереднення часів відповіді приховує важливу деталь — більшість запитів може бути швидкою, а довгий хвіст набагато повільнішим, — тому у звіті мають бути щонайменше медіана й високий . Варто памʼятати й межу силабуса: найвищий зріз у його канонічній таблиці метрик — 90-й перцентиль, а p95 і p99 приходять із практики SRE та інструментів. І окрема обережність, коли генераторів або інстансів кілька: квантилі не можна агрегувати, а усереднення попередньо порахованих квантилів дає статистично беззмістовні значення — спільний перцентиль існує лише там, де зберігався сам розподіл у придатному до агрегації вигляді.

    Склад самого звіту канон теж називає: серед типових складників — результати базового тесту як «знімок» продуктивності на заданий момент, і склад знімка заданий: дата й час старту, ціль щодо одночасних користувачів, виміряна пропускна здатність і ключові знахідки — загальна , час відповіді й середня пропускна здатність.

    З інженерами розмова інша: вона про наслідки, а не про цифри. Тут працює опублікована (service level objective, SLO) — вона задає очікування щодо роботи сервісу й зменшує безпідставні скарги на кшталт «сервіс повільний»; без явної цілі користувачі виробляють власні уявлення, які можуть не мати нічого спільного з уявленнями тих, хто систему проєктує й експлуатує. Спільною мовою з розробкою це робить (error budget): обʼєктивна метрика, погоджена обома сторонами, якою можна керувати переговорами у відтворюваний спосіб. Вона знімає структурне напруження, яке канон називає прямо: продуктову розробку оцінюють переважно за швидкістю постачання, SRE — за надійністю сервісу. Повний розбір SLI/SLO/SLA — у главі Вимоги до продуктивності, джерела чисел для дашбордів — у главі Моніторинг і спостережуваність, клієнтський бік того самого досвіду — у главі Фронтенд-продуктивність і Core Web Vitals.

    Коли зупинитись

    Питання «скільки ще тестувати» має одну засурсену відповідь і одну домовлену. Засурсена починається з того, що ніколи не можна усунути повністю — певний ризик на проді існуватиме завжди, тож ціллю є не нуль, а названий залишковий рівень. Те саме говорить економіка надійності: 100% майже ніколи не є правильною ціллю, бо вона зазвичай більша, ніж користувачі хочуть або помічають, а вартість не зростає лінійно — інкрементне поліпшення може коштувати у 100 разів більше за попередній крок. Користувач із 99%-надійним смартфоном не відрізнить сервіс на 99,99% від сервісу на 99,999%.

    Звідси й готовий механізм зупинки: поки бюджет помилок лишається — релізи тривають; якщо порушень достатньо, щоб його вичерпати, релізи тимчасово зупиняють, а ресурси вкладають у те, щоб зробити систему стійкішою. І дві поради з боку самих цілей: досконалість може зачекати — краще почати з вільної цілі й затягувати її, ніж узяти надто сувору й потім послаблювати; цілей має бути якнайменше.

    Наша практика (не канон). Далі — те, як це роблять команди, з якими ми працювали; окремого стандарту чи специфікації під це немає. Три ознаки, за якими зупиняються: остання ітерація не змінила метрику, заради якої її робили; наступна гіпотеза вимагає зміни архітектури, а не конфігурації — це вже задача планування, а не прогону; залишковий ризик сформульовано числом, з яким власник продукту згоден жити. Найгірший критерій зупинки — «закінчився спринт»: він не називає ні досягнутого рівня, ні того, що лишилося неперевіреним.

    Типові помилки

    • «Прогін показав деградацію на 40%». Насправді деградувати міг генератор: якщо інструмент використовує 100% процесора для створення навантаження, тест зазнає , і метрики покажуть значно більший час відповіді, ніж є насправді. Саме тому канон вимагає моніторити й машини .
    • «Стенд удвічі слабший, отже прод витримає вдвічі більше». Насправді це не консервативна оцінка, а помилка: продуктивність є нелінійною функцією середовища, і чим далі стенд від продакшену, тим важче робити точні прогнози.
    • «Прогін зелений — продуктивність у нормі». Насправді зеленим він може бути тому, що на метрику не поставлено жодного порога: невдалі чеки самі тест не валять. Прогін без порогів має не вердикт, а числа, які хтось потім прочитає на око.
    • «Порівняли з прогоном минулого тижня — маємо регресію». Насправді час є одним із найбільших джерел зміни спостережуваних метрик, і деградація цілком могла статися й без вашої зміни; порівняння робочого дня з вихідними вносить великий обсяг шуму.
    • «Помилки віддаються швидко — середній час покращився». Насправді швидкі відмови — симптом, а не полегшення: бекенд може перевантажитися, навіть якщо переважна більшість його процесора витрачається просто на відхилення запитів.
    • «Звели p95 з двох генераторів у спільний». Насправді квантилі не можна агрегувати, а усереднення попередньо порахованих квантилів дає статистично беззмістовні значення. Спільний перцентиль існує лише там, де зберігався придатний до агрегації розподіл.

    Підсумок

    • План перф-тесту — це шість відповідей, а не документ. Цілі, scope, профіль, середовище, критерії приймання й ризики мають існувати до того, як хтось відкриє інструмент.
    • Критерій приймання стоїть на трьох ногах — загальні цілі тесту, SLA і базові значення, — а машинної форми набуває в порозі. Прогін без порога вердикту не дає.
    • Перф-тестування — контур, а не захід. Умова його роботи — відтворюваність, умова виходу — досягнуті цілі, а не закінчений спринт.
    • Ємність міряють у ресурсах і при дотриманні цілей. «Тримаємо N запитів за секунду» без складу запитів і без цілі часу відповіді — цифра, яка не переноситься нікуди.
    • Звіт адресний. Час відповіді — користувачеві, пропускна здатність — бізнесу, утилізація — інженерам; залишковий ризик пишеться часткою користувачів і порогом, а не фразою «може бути повільно».

    Можливі питання

    • «З чого ви почнете перф-тестування нового сервісу?» Чекають, що кандидат почне не з інструмента, а з цілей і чисел: хто задає ціль, які транзакції критичні, з чим порівнюватимемо. Слабка відповідь стартує з «підняв би JMeter».
    • «Що входить у план перф-тестування?» Дивляться, чи назве кандидат середовище й профіль окремими рішеннями, а не «сценаріями». Плюс балів за згадку, що критерії приймання привʼязані до SLA й базових значень.
    • «Як ви зрозумієте, що результат прогону достовірний?» Перевіряють розуміння відтворюваності й достовірності середовища: чи згадає кандидат ресурси генератора, дані стенда, відновлення стану між циклами й заборону лінійної екстраполяції.
    • «Скільки користувачів витримує наша система?» Питання-пастка: коректна відповідь містить зустрічне питання про ціль («витримує» при якому часі відповіді) і про склад навантаження.
    • «Як ви доповісте результат бізнесу і коли вважатимете роботу завершеною?» Дивляться на вміння перекласти метрики в ризик — частка користувачів, поріг, залишковий рівень замість «іноді буває повільно», — і на зрілість критерію зупинки: ризик неусувний повністю, 100% не є правильною ціллю, а зупинку задає домовлений залишковий рівень або стан бюджету помилок, не календар.

    Джерела

    Тест-план перф-тесту: шість рішень до першого прогону

    • ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — вимога зрозуміти потрібні виміри й метрики до початку, хто задає цілі, розведення користувацьких і технічних цілей, три питання до стейкхолдерів, GQM як метод добору метрик, ціна зайвих вимірів, три джерела критеріїв приймання.
    • Grafana k6 — Thresholds — поріг як кодифікація цілі рівня сервісу, синтаксис виразу та ненульовий код виходу при провалі.
    • Grafana k6 — Checks — невдалі чеки не валять тест самі: щоб чек став гейтом, його поєднують із порогом.

    Профіль і середовище: дві частини плану, на яких сипляться цифри

    • ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — три джерела побудови операційного профілю, підхід згори вниз, рецензія профілів зі стейкхолдерами, профілі для пакетних систем, вимога до достовірності середовища та її друга половина, першість даних, валідація стенда до прогону.
    • ISTQB Glossary — операційний профіль як фактичний або передбачений патерн використання компонента чи системи.
    • Grafana k6 — Automated performance testing — власні аналітика й моніторинг як джерело типових патернів трафіку для профілю.
    • Google SRE Book — Chapter 17: Testing for Reliability — продакшн не герметичний і не є представницьким для жодної окремої версії бінарника.

    Цикл: базовий вимір → прогін → аналіз → оптимізація → повтор

    • ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — ітеративна природа перф-тестування, базовий вимір як набір метрик для порівняння та його створення на знеособлених даних, вимога відтворюваності, відновлення початкових даних між циклами.
    • Grafana k6 — Automated performance testing — порівняння з базовим виміром, спостереження за трендом і виявлення регресій як три окремі цілі регулярних прогонів.
    • Grafana k6 — Load test types — смоук-тест перед більшими прогонами: низьке навантаження, коротка тривалість, перевірка скрипта й базових метрик.
    • Google SRE Workbook — Chapter 16: Canarying Releases — час як найбільше джерело зміни метрик і шум порівняння «до й після» на прикладі понеділка проти вихідних.
    • GoogleChrome/lighthouse-ci — README — багаторазовий прогін як спосіб зменшити дисперсію виміру.
    • Grafana k6 — Results output — дві форми виводу метрик, агрегована статистика й окремі точки з мітками часу, і гранулярний вивід як умова порівняння прогонів.

    Планування ємності: від «скільки тримаємо» до «скільки треба»

    • ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — означення тестування ємності з умовою «і при цьому виконає цілі», мета тестування масштабованості, межі як пороги моніторингу на проді й підлаштування заліза, вимога закладати високозмінну масштабованість, коли числа ще невідомі.
    • ISTQB Glossary — означення capacity як відповідності максимальних меж параметра вимогам і scalability як здатності підлаштуватися під змінну ємність.
    • Google SRE Book — Chapter 21: Handling Overload — різна вартість запитів, «запити за секунду» як погана метрика ємності, вимір ємності в доступних ресурсах, деградовані відповіді як сходинка перед помилками.
    • Wikipedia — Knee of a curve — положення перегину залежить від обраних масштабів координат, і критика цього щонайменше з 1940-х. Джерело енциклопедичне (secondary) і не стосується тестування: канонічного означення точки перегину для кривої навантаження в реєстрі немає, тож ці твердження підтвердженими каноном не вважаються.

    Комунікація: бізнесу — одні числа, інженерам — інші

    • ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — розкладка трьох метрик за адресатами, вимога зрозумілості й порівнюваності результатів з очікуваннями, негативний приклад формулювання залишкового ризику, склад знімка базового тесту у звіті, 90-й перцентиль як найвищий зріз у таблиці метрик §4.1.2.
    • Google SRE Book — Chapter 4. Service Level Objectives — усереднення приховує довгий хвіст, розподіли замість середніх, побічний ефект опублікованої цілі та зменшення безпідставних скарг.
    • Google SRE Book — Chapter 3. Embracing Risk — бюджет помилок як погоджена обома сторонами метрика для переговорів і протилежні стимули розробки й експлуатації.
    • Prometheus — Histograms and summaries — квантилі не агрегуються, усереднення попередньо порахованих квантилів статистично беззмістовне, а придатний до агрегації розподіл зберігає гістограма.

    Коли зупинитись

    Типові помилки

    • Grafana k6 — Running large tests — генератор на 100% процесора зазнає тротлінгу, і метрики показують значно більший час відповіді, ніж є насправді.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.