Вимоги до продуктивності: NFR, SLA, SLO, SLI
Зміст
Найчастіша причина, чому перф-тестування не дає результату, — не інструмент і не стенд. Це відсутність числа. Прогін відпрацював, у звіті двадцять метрик — і жодна не відповідає на питання «то ми пройшли чи ні». Далі починається торг: розробник каже «нормально», підтримка каже «повільно», менеджер питає «релізимо?». Кожен правий по-своєму, бо критерію не існує, а замість нього — субʼєктивна думка кількох людей.
Ця глава — про те, як побажання «має працювати швидко» перетворюється на твердження, яке перевіряє машина. Дорога має чотири зупинки: вимога (звідки взялося число), (як воно записане й за яких умов чинне), поріг (як його перевіряє прогін) і (як помітити, що стало гірше). Плюс механізм, який робить із цих чисел управлінське рішення, — .
Звідки беруться вимоги до продуктивності
Спершу — що саме вимога обіцяє. Продуктивність (performance efficiency) у каноні означає не «швидкість», а нефункціональну характеристику ISO 25010 з трьома підхарактеристиками, і кожна дає свій предмет виміру.
| Підхарактеристика | Що обіцяє вимога |
|---|---|
| Часова поведінка (time behavior) | відповісти на ввід у заданий час і за заданих умов; найпоширеніша ціль перф-тесту |
| Утилізація ресурсів (resource utilization) | скільки ресурсу система зʼїдає — досліджують, якщо доступність ресурсів визнано ризиком |
| Ємність (capacity) | поведінка на межах: кількість користувачів або обсяги даних; оцінюється придатність архітектури |
Глосарій дає точні означення трьох суміжних понять: продуктивність — ступінь, у якому система виконує свої функції з ефективним використанням ресурсів за заданих умов, пропускної здатності й часу; ємність — ступінь, у якому максимальні межі параметра відповідають вимогам; масштабованість — ступінь, у якому систему можна підлаштувати під змінну ємність. Усі три підхарактеристики впливають на здатність масштабуватися, і наслідок для формулювання прямий: вимога «має бути швидко» не покриває ні утилізації, ні ємності. Система, яка відповідає за 200 мс, але робить це на 99% CPU, таку вимогу формально виконує — хоча запасу на перший же сплеск у неї немає.
Далі — хто дає число. Канон відповідає однозначно: цілі, термінологію і критерії того, чи ціль досягнуто, задають стейкхолдери, причому користувацькі цілі (задоволеність, бізнес-цілі) варто розводити з технічними (здатність масштабуватися, умови появи деградації). Чому чисел зазвичай немає і які шість наслідків це тягне — у главі про цілі перф-тестування; коротко: перф-тестування часто позбавлене тест-, тож робота починається не з інструмента, а з видобування вимоги.
Коли стейкхолдер каже «ну, як у всіх», методикою збору стають дві поради канону SRE. Перша: починайте з того, що важливо користувачам, а не з того, що ви можете виміряти — корисніше йти від бажаних цілей назад до індикаторів, ніж навпаки. Друга: не виводьте ціль із поточної продуктивності, бо, взявши сьогоднішнє значення без рефлексії, можна застрягти в підтримці системи, яка вимагає героїчних зусиль. Плюс про кількість: цілей має бути якнайменше, а починати краще з вільної та затягувати, ніж брати надто сувору й потім послаблювати. Планку при цьому задає не команда — користувачі порівнюють продукт не лише з конкурентами, а з найкращими сервісами, якими користуються щодня.
Скільки метрик брати — теж вимога, а не смак: кожна потребує засобу для послідовного збору й звітування, тож канон вимагає визначити досяжний набір під цілі тесту (робочий підхід — GQM, Goal-Question-Metric: спершу цілі, потім питання, за якими видно, що цілей досягнуто; канон одразу називає й межу методу — GQM пасує процесу перф-тестування не завжди, бо частина метрик описує здоровʼя системи й із цілями прямо не повʼязана). Друга межа вже з боку самого виміру, і вона фізична: забагато вимірів робить аналіз важким і негативно впливає на фактичну продуктивність застосунку.
Робити це треба на початку: для послідовних моделей розробки канон називає ідеальною практикою включити критерії продуктивності до , визначених на самому початку проєкту. Сенс роботи дока k6 описує як зміну режиму: у багатьох організаціях продуктивність лишається невідчутною, і вони реагують, лише коли стається погане, — а автоматизація існує рівно для того, щоб перевести команду з реактивного режиму в проактивний. Доведена до кінця вимога виглядає буденно — саме такі формулювання дока наводить як приклади: «менш ніж 1% запитів повертають помилку», «95% запитів мають час відповіді нижче 200 мс», «конкретний ендпойнт завжди відповідає протягом 300 мс».
SLI, SLO і SLA — три різні артефакти
Три абревіатури постійно вживають як синоніми, і канон SRE пояснює чому: термін SLA перевантажений і набув різних значень залежно від контексту, тож SLI та SLO варті окремого ретельного означення.
| Термін | Означення | Що це фізично |
|---|---|---|
| SLI — індикатор рівня сервісу (service level indicator) | ретельно означена кількісна міра якогось аспекту наданого рівня сервісу | метрика |
| SLO — ціль рівня сервісу (service level objective) | цільове значення або діапазон значень для рівня сервісу, який міряється індикатором | число на цій метриці |
| SLA — угода про рівень сервісу (service level agreement) | явний або неявний контракт із користувачами, що включає наслідки виконання або невиконання SLO, які він містить | контракт із наслідком |
Природна структура цілі — SLI ≤ ціль або нижня межа ≤ SLI ≤ верхня межа. А відрізнити SLO від SLA можна одним питанням: «що станеться, якщо ціль не виконано?» Немає явного наслідку — це майже напевно SLO. Наслідки найлегше впізнати, коли вони фінансові (знижка або штраф), але бувають і інші: Google Search не має публічної SLA — «ми не підписували контракт із усім світом», — хоча наслідки недоступності цілком реальні, це удар по репутації й падіння рекламного доходу.
Які метрики стають індикаторами — теж не довільно. Найпоширеніший SLI — запиту; поряд стоять частота помилок як частка всіх отриманих запитів і (system ) у запитах за секунду, а набір залежить від класу системи (для систем зберігання це затримка, доступність і довговічність). Виміри часто агрегуються: сирі дані збирають за вікном і перетворюють на швидкість, середнє або . Іноді доступний лише — клієнтська затримка часто релевантніша для користувача, але виміряти буває можливо лише серверну, і це чесно фіксують у формулюванні. Застереження те саме, що з метриками прогону: не варто брати в SLI кожну метрику з системи моніторингу.
Опублікована ціль має ще один ефект, про який рідко думають: вона задає очікування і зменшує безпідставні скарги на кшталт «сервіс повільний» — без явної цілі користувачі виробляють власні уявлення про бажану продуктивність. Для тестувальника SLA при цьому не юридичний артефакт, а джерело чисел і окрема метрика: канон перф-тестування ставить її серед критеріїв приймання — поряд із цілями тесту й базовим виміром, — а серед бізнес-метрик прогону називає дотримання або частоту порушень SLA.
Анатомія числа: від «має працювати швидко» до перевірної вимоги
Вимога перестає бути побажанням, коли в ній зʼявляються чотири відповіді: що міряємо, яким зрізом, за яких умов і в якій точці.
Що. Одиниця виміру в каноні — не запит, а : набір активностей, які система виконує від ініціації до завершення одного або кількох процесів. «Оформити замовлення» — це одна транзакція, а не один HTTP-запит. Сама метрика без доуточнення не діє: щоб бути осмисленою і придатною до дії, потребує уточнення в термінах часу доби, кількості одночасних користувачів, обсягу оброблюваних даних.
Яким зрізом. Тут працює перцентиль: φ-квантиль — значення спостереження з рангом φ*N серед N спостережень, де 0,5-квантиль зветься медіаною, а 0,95-квантиль — 95-м перцентилем. Середнє в цю роль не годиться — воно приховує, що більшість запитів швидкі, а довгий хвіст набагато, набагато повільніший (глава про метрики). Якщо важлива форма кривої, одного зрізу мало, і канон радить задавати кілька цілей одразу: «90% викликів завершаться менш ніж за 1 мс», «99% — менш ніж за 10 мс», «99,9% — менш ніж за 100 мс». А для різнорідних навантажень пишуть окремі цілі на клас: пакетній обробці важлива , інтерактивному клієнту — затримка.
За яких умов і в якій точці. Це те, що викидають найчастіше, а без нього суперечку «виконано чи ні» не розвʼязати. Правило коротке: ціль має вказувати, як її міряють і за яких умов вона чинна. Канонічний приклад — «99% (усереднено за 1 хвилину) викликів Get RPC завершаться менш ніж за 100 мс (виміряно на всіх бекенд-серверах)»; щоб не переписувати умови щоразу, канон радить тримати набір шаблонів з інтервалом агрегації, частотою вимірів і точкою виміру затримки.
Точка виміру — не формальність. Інструмент розводить три різні «часи»: Elapsed time міряє від моменту перед відправленням запиту до отримання останньої відповіді, Latency — до першої, а Connect Time із TLS із Latency автоматично не віднімається. І окремо: JMeter не включає час рендерингу й не виконує клієнтський код, наприклад JavaScript. Тому вимога «сторінка відкривається за 2 секунди» протокольним прогоном не перевіряється взагалі — вимірюється інша величина, а розрив між нею і тим, що бачить користувач, показує життєвий цикл запиту. Вікно й спосіб збору теж мусять стояти у вимозі: попередньо порахований квантиль не можна перерахувати під інше вікно, а квантилі не можна агрегувати — усереднення готових квантилів із кількох інстансів дає статистично беззмістовні значення.
Разом вимога перестає бути реченням і стає набором полів — саме в такій формі її можна віддати в поріг прогону, де k6 для метрик типу Trend приймає avg, min, max, med і p(N):
type PerformanceRequirement = {
transaction: string; // "checkout"
aggregation: string; // "p(95)" — зріз розподілу
operator: '<' | '<=';
value: number; // 500
unit: 'ms' | 'ratio';
load: string; // "200 запитів/с, профіль checkout-peak"
measuredAt: string; // "сервер, час до останнього байта"
window: string; // "усереднено за 1 хвилину"
};
Прочитане вголос, це і є вимога: «95% транзакцій оформлення завершуються швидше за 500 мс за навантаження 200 запитів на секунду, виміряно на боці сервера, з вікном агрегації в одну хвилину». Числа тут ілюстративні — канон дає форму, а значення приходять від стейкхолдерів і з базових вимірів.
«При 200 RPS»: навантаження — частина вимоги, а не її контекст
Число часу відповіді без навантаження нічого не означає: те саме p95 на порожній системі й на піку відрізняється в рази. Тому друга половина вимоги — (load profile). Він специфікує активність, якої система під тестом може зазнати на проді, і складається з визначеної кількості екземплярів, які виконують дії заздалегідь заданих протягом заданого періоду; коли екземплярами є користувачі, вживають термін «віртуальні користувачі» (virtual users), а глосарій формулює те саме як документацію з кількістю , набором транзакцій і періодом. Термінологічна деталь: профіль навантаження — це і є «сценарій», канон каже прямо, що агрегування операційних профілів дає профіль навантаження, який зазвичай так називають.
Будується він із чотирьох складників — ціль тесту, операційні профілі, відомі проблеми пропускної здатності й конкурентності, кількість і розподіл у часі, — а розподіл має канонічні форми: рівномірне наростання (ramp-up), рівномірне спадання (ramp-down), миттєві зміни (steps) і заздалегідь визначені розподіли, де обсяг наслідує денні або сезонні бізнес-цикли. Тобто «піковий трафік» у вимозі — це посилання на форму розподілу, а не окремий тест. Для вимоги критично, щоб профіль був відтворюваним, і порада інструмента тут категорична: тримайтеся простих патернів — «наростання, плато, спадання» вистачає для всіх видів тесту, — і уникайте «американських гірок», бо результати мають бути порівнянними й інтерпретовними. Технічно мікс виражається кількома сценаріями k6, кожен зі своїм патерном планування й екзекʼютором.
Окремий клас вимог формулюють не через час, а через ємність: скільки користувачів або транзакцій система підтримає, і при цьому все ще виконає заявлені цілі продуктивності. Ця обмовка й робить ємність вимірюваною — максимум, при якому система «просто не падає», і максимум, при якому вона ще відповідає за 500 мс, це два різні числа. Як будувати профіль — глава про модель навантаження; які види тестів яку вимогу закривають — глава про види перф-тестів.
Поріг: критерій pass/fail самого прогону
Поріг (threshold) — це критерій pass/fail, який ви задаєте для метрик свого тесту; якщо продуктивність системи під тестом не задовольняє його умов, тест завершується зі статусом провалу. Призначення сформульоване прямо: тестувальники часто використовують пороги, щоб кодифікувати свої SLO. Поріг — це та сама ціль, записана мовою, яку розуміє .
Вираз порога обчислюється в true або false і має форму <aggregation_method> <operator> <value>: avg < 200, count >= 500, p(90) < 300. Пара, яка покриває найтиповіший випадок, — http_req_failed: ['rate<0.01'] і http_req_duration: ['p(95)<200']: нижче 1% і 95% запитів швидші за 200 мс. Доступні агрегації залежать від : Counter дає count і rate, Gauge — value, Rate — rate, Trend — avg, min, max, med і p(N). Механіка гейта проста й тому надійна: усі пороги виконано — код виходу 0, провалено хоч один — ненульовий; довга форма дозволяє ще й обірвати прогін на провалі (abortOnFail).
Тут же живе найпоширеніша плутанина розділу — чек порогом не є. Невдалі чеки не спричиняють переривання тесту й не завершують його зі статусом провалу: інструмент лише веде облік їхньої частки, і кожен чек створює rate-метрику; щоб чек обірвав або провалив прогін, його треба поєднати з порогом. Потрібні чеки при цьому обовʼязково: іноді навіть відповідь 200 містить повідомлення про помилку, і без перевірки тіла прогін міряє швидкість віддавання помилок.
Граблі, які інструмент називає прямо: не задавайте кілька порогів на одну метрику, повторюючи той самий ключ обʼєкта. Пороги — властивості JavaScript-обʼєкта, тож два ключі з однаковим імʼям задати не можна, і решта буде мовчки проігнорована; кілька умов пишуть масивом — RTT: ['p(99)<300', 'p(70)<250', 'avg<200']. Це реальний клас дефекту в конфігурації тесту: прогін зелений, бо половина критеріїв не перевірялася.
Звідки береться саме це число — питання не до інструмента: критерії приймання мають бути встановлені для всіх релевантних вимірів і привʼязані до загальних цілей перф-тесту, SLA і базових значень. І остання межа: поріг — не SLO. SLO живе на проді й міряється тижнями та місяцями, поріг — його зліпок на час прогону, і його значення часто суворіше, бо стенд менший, а вибірка коротша. Чи робити з порога гейт релізу в й що таке — предмет окремої глави про перф-тести в CI/CD; тут поріг цікавить нас лише як критерій, за яким сам прогін оголошується пройденим або проваленим.
Baseline: вимога у формі «не гірше, ніж було»
Абсолютне число є не завжди — і це не привід не мати критерію. Третя легітимна форма вимоги порівняльна, і канон називає її прямо серед питань до стейкхолдерів: яких поліпшень продуктивності очікують від цих тестів порівняно з попередніми циклами.
Точкою відліку працює базовий вимір (performance baseline) — набір метрик, які використовують для порівняння поточних і раніше досягнутих вимірів продуктивності. У каноні він стоїть серед критеріїв приймання поряд із цілями тесту й SLA і дає змогу продемонструвати конкретні поліпшення та/або підтвердити досягнення критеріїв. Деталь, яку легко проґавити: базовий вимір створюють, за потреби на знеособлених даних із бази, — він не «береться з проду», і саме тому його можна відтворити. Наслідок для контролю жорсткий: порівнювати можна лише прогони на тому самому середовищі й тих самих даних, а після переїзду стенда старий baseline перестає бути baseline.
Регулярні прогони закривають при цьому три різні цілі: порівняння поточної продуктивності з наявним базовим виміром, розуміння варіацій метрик у часі (плаский чи змінний тренд) і виявлення регресій нових релізів. Baseline відповідає на питання «чи ми не погіршилися проти зафіксованої точки», тренд — «куди ми рухаємося загалом», і лише третє схоже на pass/fail. Найдешевша страховка — перф-: перед більшими прогонами варто валідувати, що скрипти працюють як очікується і що система нормально почувається з кількома користувачами, інакше є порівняти базовий вимір із результатом зламаного скрипта. Докладніше — глава про види перф-тестів.
Бюджет помилок: чому 100% — хибна ціль
Це рівень розмови, який відрізняє кандидата, що вміє формулювати вимоги, від кандидата, що вміє ними керувати. Бюджет помилок (error budget) — чітка обʼєктивна метрика, що визначає, наскільки ненадійним сервісу дозволено бути протягом кварталу; його спільно визначають дві команди на основі SLO. Коротше означення того ж механізму — дозволена частота, з якою SLO можна не виконати.
Починається все з від стовідсоткової цілі. Наполягати, що SLO виконуватимуться 100% часу, і нереалістично, і небажано: це може знизити темп інновацій і розгортань, вимагати дорогих, надмірно консервативних рішень — або і те, і те. Понад певну точку зростання надійності гірше, а не краще, і причин дві. Ціна: вартість не зростає лінійно, інкрементне поліпшення може коштувати у 100 разів більше за попередній крок. Сприйняття: користувач із 99%-надійним смартфоном не відрізнить надійності сервісу 99,99% від 99,999%.
Механіка — чотири кроки. Продуктовий менеджмент визначає SLO на квартал; фактичний аптайм міряє нейтральна третя сторона — система моніторингу; різниця між цими двома числами і є бюджет ненадійності, що лишився; поки виміряний аптайм вищий за SLO, нові релізи можна викочувати. Арифметика на прикладі: якщо SLO — успішно обслужити 99,999% усіх запитів за квартал, бюджет становить 0,001%, і проблема, через яку впало 0,0002% очікуваних запитів, витрачає 20% квартального бюджету.
Навіщо це — сформульовано без евфемізмів. Продуктова розробка оцінюється переважно за швидкістю постачання, SRE — за надійністю; бюджет дає обом сторонам спільний стимул і обʼєктивну метрику для переговорів. Так у багатьох продуктах керують темпом релізів: поки цілі виконуються, релізи тривають, а якщо порушень достатньо, щоб вичерпати бюджет, релізи тимчасово зупиняють і вкладають ресурси в стійкість. Бюджет їдять і зовнішні події — мережевий збій чи відмова дата-центру, — а команда, якій постійно важко запускати фічі, може свідомо послабити SLO. Висновок для нас один: якщо ціль сформульована через затримку, перф-регресія їсть той самий бюджет, що й падіння сервісу, — і суперечка «чи це достатньо повільно, щоб гальмувати реліз» має числову відповідь.
Типові помилки
- «У нас SLA 99,9%» → виглядає як контракт, а насправді майже завжди це SLO: спитайте, що станеться, якщо ціль не виконано. Немає явного наслідку — знижки, штрафу — немає й угоди.
- «Візьмемо за ціль наші поточні 300 мс» → виглядає як реалізм, а насправді це спосіб застрягти в підтримці системи, яка вимагає героїчних зусиль: канон прямо забороняє виводити ціль із поточної продуктивності.
- «Ціль — 100% успішних запитів» → виглядає як турбота про якість, а насправді ціль нереалістична й небажана: вона зупиняє темп змін, а користувач із 99%-надійним пристроєм різниці не помітить.
- «Вимога:
p95 < 500 мс» → виглядає як число, а насправді це половина числа: без навантаження, точки виміру й вікна агрегації метрика часу відповіді не придатна до дії — канон вимагає доуточнення часом доби, кількістю одночасних користувачів і обсягом даних. - «Сторінка має відкриватися за 2 секунди — перевіримо навантажувальним прогоном» → виглядає як пряма перевірка, а насправді протокольний інструмент не включає час рендерингу й не виконує клієнтський код: ви виміряєте іншу величину, ніж обіцяли користувачу.
- «Додали чек на тіло відповіді — тепер прогін валиться на помилках» → виглядає як гейт, а насправді невдалі чеки лише накопичують частку. Гейтом чек стає в парі з порогом на його
rate-метрику. - «Поставили два пороги на одну метрику» → виглядає як суворіший критерій, а насправді другий ключ обʼєкта затирає перший мовчки, і половина умов не перевіряється. Кілька умов задають масивом.
- «Помилок було 12 штук — це мало» → виглядає як оцінка, а насправді помилки міряють часткою від усіх виконаних запитів (метрика типу
Rate, порігrate<0.01): 12 помилок на 100 запитів і на 100 000 — різні події.
Підсумок
- SLI, SLO і SLA — три різні артефакти: метрика, число на ній і контракт із наслідком. Питання «що станеться, якщо ціль не виконано» розводить друге й третє за один хід.
- Вимога — це набір полів, а не речення. Транзакція, зріз розподілу, поріг, навантаження, точка виміру й вікно агрегації; без будь-якого з них суперечку «виконано чи ні» не розвʼязати.
- Навантаження входить у вимогу. Число часу відповіді чинне лише для названого профілю, а ємність вимірюється тільки з обмовкою «і при цьому все ще виконує заявлені цілі».
- Поріг — критерій pass/fail самого прогону, а не SLO. Він кодифікує ціль мовою ранера й віддає вердикт кодом виходу; чек без порога лишається індикатором, а порівняльна вимога «не гірше, ніж було» працює лише на тому самому середовищі й тих самих даних.
- Бюджет помилок перетворює надійність на керовану величину. 100% — хибна ціль, а вичерпаний бюджет — заздалегідь погоджена підстава зупинити релізи.
Можливі питання
- «Чим SLA відрізняється від SLO і SLI?» — сильна відповідь називає три різні сутності (метрика, ціль, контракт) і дає критерій розрізнення: наявність явного наслідку невиконання. Бонус — приклад сервісу без публічної SLA, у якого наслідки все одно є.
- «Замовник каже: має працювати швидко. Що робите далі?» — дивляться, чи перетворите ви побажання на перевірну вимогу. Очікують перелік полів: транзакція, перцентиль, поріг, навантаження, точка виміру, вікно. Слабка відповідь зупиняється на «попрошу конкретне число».
- «Вимог до продуктивності немає. Звідки їх узяти?» — перевіряють процес, а не інтуїцію. Сильна відповідь іде від стейкхолдерів і критеріїв приймання, згадує, що починати треба від того, що важливо користувачам, а не від того, що вимірне, і що виводити ціль із поточної продуктивності не можна.
- «Прогін зелений. Це означає, що вимогу виконано?» — дивляться на розуміння механіки гейта: чи є пороги взагалі, чи не затерто їх дублем ключа і чи був чек на змістовність відповіді.
- «Що таке error budget і навіщо він QA?» — очікують означення через SLO, арифметику «ціль 99,999% означає бюджет 0,001%» і головне — наслідок: вичерпаний бюджет є погодженою підставою зупинити релізи, а перф-регресія їсть той самий бюджет.
- «У нас немає абсолютних цілей, є лише порівняння з минулим релізом. Це нормально?» — перевіряють, чи знаєте ви, що порівняльна вимога легітимна, і чи назвете її умову: той самий стенд, ті самі дані, зафіксований базовий вимір.
Джерела
Звідки беруться вимоги до продуктивності
- ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — §1.1: продуктивність як ISO 25010, три підхарактеристики й вплив усіх трьох на масштабованість; §4.1.1: стейкхолдери задають цілі, термінологію і критерії, розведення користувацьких і технічних цілей; §2.1: підхід GQM і його межа, ціна кожної зайвої метрики; §4.1.2: забагато вимірів шкодить і аналізу, і самій продуктивності; §3.4: критерії продуктивності як частина критеріїв приймання від початку проєкту.
- Google SRE Book — Chapter 4. Service Level Objectives — як обирати цілі: від того, що важливо користувачам, а не від того, що вимірне; заборона виводити ціль із поточної продуктивності; «цілей якнайменше» і «почати з вільної та затягувати».
- ISTQB Glossary — означення
performance efficiency,capacityіscalabilityяк трьох окремих понять. - web.dev — Why does speed matter? — планку очікувань задають найкращі сервіси, якими користувач користується щодня, а не конкуренти.
- Grafana k6 — Thresholds — приклади готових формулювань вимоги, до яких зводиться робота зі стейкхолдерами.
- Grafana k6 — Automated performance testing — продуктивність у багатьох організаціях лишається невідчутною, і вони реагують, лише коли стається погане; мета автоматизації — перехід від реактивного режиму до проактивного.
SLI, SLO і SLA — три різні артефакти
- Google SRE Book — Chapter 4. Service Level Objectives — означення SLI, SLO і SLA та причина розводити їх; структура цілі; питання «що станеться, якщо не виконано» і приклад із відсутністю публічної SLA в Google Search; перелік поширених SLI та їх набори за класами систем; агрегація вимірів; застереження про клієнтську й серверну затримку; ефект опублікованої цілі.
- ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — §4.1.2: SLA серед критеріїв приймання поряд із цілями тесту й базовими значеннями; §2.1: дотримання або частота порушень SLA як бізнес-метрика прогону.
Анатомія числа: від «має працювати швидко» до перевірної вимоги
- ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — §4.2.2: транзакція як одиниця виміру часу відповіді; §2.1: метрика часу відповіді потребує доуточнення часом доби, кількістю одночасних користувачів і обсягом оброблюваних даних.
- Google SRE Book — Chapter 4. Service Level Objectives — вимога вказувати спосіб виміру й умови чинності, канонічний приклад формулювання, кілька цілей для опису форми кривої й окремі цілі на клас навантаження, шаблони з інтервалом агрегації, частотою вимірів і точкою виміру; середнє приховує довгий хвіст.
- Apache JMeter — User's Manual: Glossary —
Elapsed time,LatencyіConnect Timeяк три різні виміри; відсутність часу рендерингу й виконання клієнтського коду. - Prometheus — Histograms and summaries — означення φ-квантиля через ранг; заборона перераховувати готовий квантиль під інше вікно й агрегувати квантилі між інстансами.
- Grafana k6 — Thresholds — агрегації, доступні для метрик типу
Trend, і синтаксисp(N), у якому вимога стає порогом.
«При 200 RPS»: навантаження — частина вимоги, а не її контекст
- ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — §4.2.4: означення профілю навантаження, чотири складники й чотири форми розподілу в часі; §4.1.2: агрегування операційних профілів дає профіль навантаження, який називають сценарієм; §1.2: ємність як кількість користувачів або транзакцій із дотриманням заявлених цілей.
- ISTQB Glossary — профіль навантаження як документація з кількістю віртуальних користувачів, набором транзакцій і періодом; ємність як відповідність максимальних меж параметра вимогам.
- Grafana k6 — Scenarios — кілька незалежних сценаріїв із власними екзекʼюторами як інструментальна форма міксу.
- Grafana k6 — Load test types — порада тримати прості патерни навантаження, застереження проти «американських гірок» і вимога отримати порівнянні й інтерпретовні результати.
Поріг: критерій pass/fail самого прогону
- Grafana k6 — Thresholds — поріг як критерій pass/fail і кодифікація SLO, форма виразу й приклади, агрегації за типами метрик, коди виходу,
abortOnFail, заборона дублювати ключ і форма масиву. - Grafana k6 — Checks — невдалі чеки не валять тест, облік частки,
rate-метрика чека й вимога поєднати чек із порогом; відповідь200з повідомленням про помилку. - Grafana k6 — Metrics — типи метрик
Counter,Gauge,RateіTrend, від яких залежить доступна агрегація порога. - ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — §4.1.2: критерії приймання для всіх релевантних вимірів і їх привʼязка до цілей тесту, SLA та базових значень.
Baseline: вимога у формі «не гірше, ніж було»
- ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — §4.1.2: baseline як набір метрик для порівняння, місце серед критеріїв приймання і створення базового виміру на знеособлених даних; §4.1.1: очікувані поліпшення проти попередніх циклів як питання до стейкхолдерів.
- Grafana k6 — Automated performance testing — порівняння з базовим виміром, спостереження за трендом і виявлення регресій релізів як три окремі цілі регулярних прогонів.
- Grafana k6 — Load test types — порада починати зі смоук-тесту, щоб валідувати скрипт і поведінку системи на кількох користувачах.
Бюджет помилок: чому 100% — хибна ціль
- Google SRE Book — Chapter 3. Embracing Risk — означення бюджету помилок, чому надмірна надійність гірша, нелінійна вартість і межа сприйняття користувача, механіка в чотири кроки з арифметикою прикладу, конфлікт стимулів розробки й експлуатації, керування темпом релізів і свідоме послаблення цілі.
- Google SRE Book — Chapter 4. Service Level Objectives — бюджет як дозволена частота невиконання SLO і нереалістичність цілі «100% часу».
Що таке вимога до продуктивності і чому «має працювати швидко» нею не є?
— це твердження, яке перевіряє машина й видає однозначне «так» або «ні». Слово «швидко» такої відповіді не дає: розробник, підтримка й менеджер вкладають у нього три різні числа, тож замість критерію команда отримує голосування. Щоб побажання стало вимогою, у ньому мають зʼявитися одиниця виміру, зріз розподілу, , навантаження, за якого воно чинне, і точка, у якій міряють. Без цього прогін закінчується звітом на двадцять метрик, з якого неможливо витягнути вердикт «релізимо чи ні». Практичний наслідок для QA простий: робота на перф-проєкті починається не з установлення інструмента, а з видобування числа зі стейкхолдерів.
Які три підхарактеристики має продуктивність і навіщо їх розводити?
Продуктивність (performance efficiency) у ISO 25010 — не синонім швидкості, а парасолька над трьома різними обіцянками. Часова поведінка (time behavior) — вкластися в заданий за заданих умов; це найпоширеніша ціль перф-тесту. (resource utilization) — скільки процесора, памʼяті, зʼєднань система на це витрачає; її досліджують, коли доступність ресурсів визнали . Ємність (capacity) — до яких меж за користувачами або обсягами даних система взагалі лишається робочою. Розводити їх треба тому, що вимога, написана тільки про час, дві інші не закриває: сервіс, який тримає 200 мс на майже вичерпаному процесорі, за такою вимогою вважається справним — хоча витримати навіть невеликий приріст трафіку йому вже нічим. І окремо варто памʼятати, що ємність та здатність масштабуватися (scalability) — різні поняття: перше про сьогоднішню межу, друге про можливість цю межу підняти.
Чим відрізняються SLI, SLO і SLA?
Це три різні артефакти, які плутають, бо всі три звучать як «доступність 99,9%». SLI (service level indicator) — , тобто ретельно означена кількісна міра одного аспекту сервісу; фізично це метрика, наприклад запиту. SLO (service level objective) — , тобто конкретне значення або діапазон на цьому індикаторі; фізично це число на метриці. SLA (service level agreement) — угода з користувачами, яка додає до цілей наслідки їх виконання чи невиконання; фізично це контракт. Природна форма запису цілі — SLI ≤ ціль або двостороння нижня межа ≤ SLI ≤ верхня межа. Для тестувальника ця ієрархія має пряме застосування: SLA — джерело чисел для , а дотримання SLA (або частота порушень) саме по собі стає метрикою прогону.
Як одним питанням відрізнити SLO від SLA?
Питання звучить так: «а що станеться, якщо ціль не виконано?» Якщо на боці постачальника нічого не станеться — це SLO, хоч би скільки разів документ називався угодою. Якщо є заздалегідь описаний наслідок — знижка або штраф — це вже SLA. Фінансові наслідки впізнати найлегше, але вони не єдині: у Google Search публічної SLA немає взагалі («ми не підписували контракт із усім світом»), а наслідки недоступності цілком матеріальні — репутація й рекламні гроші. У побуті команд слово «SLA» вживають майже завжди неправильно, тому на співбесіді очікують саме цього критерію розрізнення, а не переказу абревіатур.
Які метрики зазвичай стають SLI і скільки їх брати?
Найпоширеніший індикатор — затримка запиту; поряд ідуть від усіх отриманих запитів і у запитах за секунду. Набір залежить від класу системи: для сховища доречні затримка, доступність і довговічність даних, для систем великих даних — пропускна здатність і наскрізна затримка. Іноді доступний лише : користувачеві релевантніша клієнтська затримка, а виміряти реально можна серверну — тоді це чесно фіксують у самій вимозі, а не роблять вигляд, що виміряли те саме. Головна дисципліна — не тягнути в SLI все, що вміє віддавати моніторинг: кожна метрика потребує стабільного способу збору й звітування, а надлишок вимірів і аналіз ускладнює, і сам застосунок пригальмовує. Робоче правило: цілей має бути якнайменше, і краще почати з вільної та поступово затягувати, ніж узяти надто сувору й публічно її послаблювати.
Замовник каже «має працювати швидко». Ваші наступні кроки?
Спершу зʼясувати, про що саме йдеться: яка , а не який — «оформити замовлення» і «POST /orders» це різні речі. Далі поставити шість питань, які перетворюють фразу на поле анкети: що міряємо, яким зрізом розподілу, з яким граничним значенням, за якого навантаження, у якій точці виміру й з яким вікном агрегації. Відповіді складаються у твердження, яке читається вголос без другого тлумачення: 95 оформлень зі 100 укладаються в 500 мс на профілі пікового вечора, час знімається на бекенді, число рахується за хвилинним вікном. Слабка відповідь на співбесіді зупиняється на «попрошу конкретне число» — бо число без умов чинності ту саму суперечку відтворює, лише на пізнішій стадії. Корисно памʼятати й про порядок: критерії продуктивності мають потрапити до критеріїв приймання на старті проєкту, а не за тиждень до релізу.
Чому вимогу пишуть на перцентиль, а не на середнє?
Тому що середнє змішує в одне число дві різні сукупності — швидку більшість і повільний хвіст — і показує щось середнє між ними, чого не переживає жоден реальний користувач. натомість фіксує ранг спостереження: 95-й перцентиль — значення, нижче якого лежать 95% вимірів, медіана — те саме для половини. Тому вимога, записана на середнє, спокійно пропускає прогін, де кожен двадцятий користувач чекає секунди. Якщо для продукту важлива форма кривої, а не одна точка, канон радить писати кілька цілей одразу — скажімо, 90% швидше за 1 мс, 99% швидше за 10 мс, 99,9% швидше за 100 мс. А для різних класів навантаження цілі просто різні: інтерактивному клієнту важлива затримка, пакетній обробці — пропускна здатність.
Вимога звучить «p(95)<500 мс». Чого їй бракує, щоб стати перевірною?
Це половина вимоги: є що і є зріз, немає умов чинності. Бракує навантаження — те саме p95 на порожньому стенді й на піку відрізняється в рази, тому число без профілю нічого не стверджує. Бракує точки виміру — на клієнті, на балансувальнику чи на бекенді це три різні величини. Бракує вікна агрегації й частоти вимірів — «p95 за хвилину» і «p95 за добу» дають різні числа на тих самих даних. Корисно також уточнити час доби й обсяг оброблюваних даних, бо на порожній базі й на базі з мільйонами записів це фактично різні системи. Щоб не переписувати умови щоразу, зручно тримати шаблон вимоги з полями та підставляти значення — саме так формулювання стає придатним і для порогу прогону, і для суперечки «виконано чи ні».
Що таке транзакція як одиниця виміру часу відповіді?
Транзакція — це набір дій, які система виконує від ініціації до завершення одного або кількох процесів, тобто закінчена операція з погляду користувача. «Оформити замовлення» — одна транзакція, хоч під нею може бути десяток HTTP-запитів: перевірка кошика, резервація складу, платіж, лист-підтвердження. Вимогу пишуть саме на транзакцію, бо користувач чекає результату операції, а не окремого виклику. Практичний наслідок: у звіті прогону мають бути помітки транзакцій, інакше ви отримаєте час найповільнішого запиту замість часу бізнес-операції, а ще краще — не отримаєте нічого зіставного з вимогою. Це ж пояснює, чому «додати ще один запит у флоу» може зламати вимогу, не зробивши жоден окремий запит повільнішим.
Вимог до продуктивності немає взагалі. Звідки їх узяти?
Числа задають стейкхолдери — вони ж визначають термінологію і те, за яким критерієм ціль вважається досягнутою; завдання QA — цей процес організувати, а не вигадати числа за них. Корисно одразу розділяти цілі користувацькі (задоволеність, бізнес-показники) і технічні (де починається деградація, як система масштабується): вони перевіряються по-різному. Рухатися варто від того, що важливо користувачам, назад до індикаторів, а не від переліку метрик, які вміє віддавати моніторинг. Робочий каркас — GQM: спершу цілі, потім питання, відповіді на які покажуть, що цілей досягнуто, і лише потім метрики; межу методу канон називає сам — не кожна метрика виводиться з цілі, деякі показують стан системи й до цілей не привʼязані. Окрема заборона, про яку часто забувають: не виводьте ціль із поточної продуктивності — узявши сьогоднішні 300 мс без рефлексії, ви законсервуєте систему, яку вже зараз тримають героїчними зусиллями. Планку задають не конкуренти, а найкращі сервіси, якими користувач користується щодня.
Що таке профіль навантаження і чому він частина вимоги, а не її контекст?
(load profile) описує активність, якої система може зазнати на проді: скільки екземплярів (для користувачів кажуть «віртуальні користувачі»), які операції вони виконують і протягом якого періоду. Будують його з чотирьох складників — мета тесту, , відомі проблеми з пропускною здатністю й конкурентністю, кількість та її розподіл у часі; розподіл має канонічні форми: наростання, спадання, миттєві стрибки й заздалегідь задані криві, що повторюють денні чи сезонні цикли. Термінологічний нюанс, який плутають: агрегований набір операційних профілів і є те, що в командах називають «сценарієм». Для вимоги критично, щоб профіль був відтворюваним, тому патерни тримають простими — наростання, плато, спадання, — а «американські гірки» уникають, бо їхні результати ні з чим не порівняєш. Без названого профілю число часу відповіді не є вимогою: воно чинне лише для того навантаження, за якого його отримали.
Як коректно сформулювати вимогу до ємності?
Вимога до ємності відповідає на питання «скільки користувачів або транзакцій ми тримаємо», але сама по собі ця цифра не визначена, поки до неї не додано обмовку «і при цьому все ще виконуємо заявлені цілі продуктивності». Різниця не косметична: межа, за якою процес просто не падає, і межа, за якою він ще вкладається в обіцяні півсекунди, — це два різні числа, і зазвичай друге істотно менше. Тому формулювання виглядає так: «система обслуговує 5 000 одночасних користувачів профілю -peak, утримуючи p(95) транзакції оформлення нижче 500 мс і частку помилок нижче 1%». Саме така форма робить ємність вимірюваною й перевірною, а не риторичною. Побічно вона ж закриває типову підміну на демонстраціях, коли «ми витримали 10 тисяч» означає лише «процес не впав».
Що таке поріг (threshold) і чому поріг — це не SLO?
Поріг — це умова над метрикою прогону, яку обчислює в true або false і на основі якої оголошує тест пройденим чи проваленим. Форма проста: спосіб агрегації, оператор, значення — avg < 200, count >= 500, p(90) < 300; доступні агрегації залежать від (для Trend це avg, min, max, med і p(N), для Rate — rate). Вердикт віддається кодом виходу: усі пороги виконано — нуль, провалено хоч один — ненульовий, а за потреби прогін можна ще й обірвати на першому провалі. Призначення порогу — кодифікувати SLO мовою, яку розуміє інструмент, тобто це зліпок цілі на час тесту. Але тотожності немає: SLO живе на проді й міряється тижнями чи місяцями на реальному трафіку, а поріг рахується за короткою вибіркою на меншому стенді, тому його значення часто беруть суворішим. Плутати їх небезпечно в обидва боки: зелений прогін не доводить виконання SLO, а провалений поріг не означає, що SLO порушено.
Прогін зелений. Чи означає це, що вимогу виконано?
Спершу треба перевірити, чи взагалі було що перевіряти. Три типові причини «зеленого ні про що»: порогів не задано зовсім (тоді код виходу нуль за визначенням), пороги задано на дублікаті ключа обʼєкта — і всі, крім останнього, мовчки проігноровано, — або гейта немає, бо перевірки відповіді зроблені чеками. Останнє найпідступніше: невдалий чек не валить прогін, він лише накопичує свою частку в rate-метриці, і щоб чек став гейтом, на цю метрику треба поставити поріг. Кілька умов на одну метрику задають масивом, а не повторенням ключа — саме тому дубль ключа належить до дефектів конфігурації тесту, а не до стилю. І окремо: без чека на тіло відповіді прогін може чесно міряти швидкість, з якою сервер віддає помилки, бо код 200 теж буває з повідомленням про помилку всередині.
Вимога «сторінка відкривається за 2 секунди». Перевіримо навантажувальним прогоном?
Ні — протокольний інструмент виміряє іншу величину. У JMeter це видно вже на трьох окремих лічильниках: Elapsed time доводить відлік до останнього байта відповіді, Latency зупиняється на першому, а Connect Time, у який входить і TLS, сам собою з Latency не віднімається. Головне ж інше: такий прогін не виконує клієнтський JavaScript і не враховує час рендерингу, тобто все, що відбувається з моменту, коли байти вже прийшли, а користувач ще дивиться на порожній екран. Тому вимогу «сторінка відкривається за 2 секунди» треба або переписати на серверну метрику з чесною точкою виміру, або міряти клієнтськими інструментами. Відповідь рівня сеньйора додає: розрив між серверним часом і тим, що бачить користувач, — не похибка, а окремий предмет вимірювання, і замовчувати його у звіті означає обіцяти те, чого не перевіряли.
Чи можна жити без абсолютних цілей, звіряючи кожен реліз лише з попереднім?
Так, порівняльна форма — повноцінна третя форма вимоги, і питання «яких поліпшень ви очікуєте проти попередніх циклів» стоїть у каноні серед питань до стейкхолдерів. Точкою відліку працює (performance baseline) — зафіксований набір метрик, з яким порівнюють поточні. Ключова деталь, яку часто проґавлюють: baseline створюють спеціально, за потреби на знеособлених даних, — його не «беруть із проду», і саме тому його можна відтворити. Умова чинності жорстка: звіряти між собою дозволено тільки прогони, у яких не змінилися ні залізо стенда, ні набір даних; переїхали на іншу інфраструктуру — стара точка відліку більше нічого не доводить. І варто розрізняти три різні цілі регулярних прогонів: звірка з базовим виміром, спостереження за трендом у часі й виловлювання конкретного релізу — на pass/fail схоже тільки третє. Перед довгим прогоном варто витратити хвилину на перф- на кількох користувачах, інакше ризикуєте порівняти baseline із результатом зламаного скрипта.
Що таке бюджет помилок і навіщо він тестувальнику?
(error budget) — це заздалегідь погоджена міра того, наскільки ненадійним сервісу дозволено бути за період; арифметично він є доповненням цілі до сотні. Механіка складається з чотирьох кроків: продуктовий менеджмент фіксує SLO на квартал, фактичний показник міряє нейтральна сторона — система моніторингу, різниця між ними і є залишок бюджету, і поки залишок додатний, нові релізи викочують. Приклад арифметики: ціль «успішно обслужити 99,999% запитів за квартал» дає бюджет 0,001%, тож інцидент, який зʼїв 0,0002% очікуваних запитів, витратив пʼяту частину квартального бюджету. Сенс механізму — не в обліку, а в тому, що він дає розробці й експлуатації спільний вимірюваний стимул: одні відповідають за темп постачання, інші за надійність, а бюджет робить із цього конфлікту число, про яке можна домовитися. Для QA висновок прямий: коли ціль записана через затримку, повільна відповідь витрачає бюджет нарівні з недоступністю, а вичерпаний бюджет — заздалегідь погоджена підстава пригальмувати релізи, а не привід для чергової дискусії.
Чому ціль «100% успішних запитів» вважають шкідливою?
Тому що вона нереалістична й, що важливіше, небажана. Вимога ніколи не порушувати ціль зупиняє темп змін і штовхає до дорогих надмірно консервативних рішень, тобто платить швидкістю розвитку за надійність, якої ніхто не помітить. Ціна зростає нелінійно: кожен наступний крок у надійності може коштувати на два порядки більше за попередній. А з боку сприйняття межа настає ще раніше — користувач із 99%-надійним смартфоном різниці між 99,99% і 99,999% на боці сервісу не відчує. Тому ціль обирають достатньою, а не максимальною, і саме різниця між нею та сотнею стає бюджетом, яким свідомо розпоряджаються — витрачають на релізи й експерименти. Команда, якій постійно бракує бюджету, має легальний вихід: свідомо послабити ціль, а не тихо її порушувати.
Три поди віддали свої p(95). Чи можна усереднити їх, щоб отримати загальний p(95)?
Ні. Квантилі не агрегуються: середнє з готових перцентилів кількох інстансів статистично беззмістовне, бо перцентиль — властивість конкретного розподілу, а не число, яке можна складати. З тієї ж причини вже порахований квантиль не можна перерахувати під інше вікно — «p95 за хвилину» не перетворюється на «p95 за годину» жодною арифметикою. Правильний шлях — рахувати перцентиль із сирих спостережень усіх інстансів разом або зі структури, яка це вміє (наприклад, гістограми з ). Практичний наслідок для вимоги: у формулюванні мають стояти і вікно агрегації, і точка збору, інакше два звіти на одну систему дадуть різні числа й обидва будуть «правильні». На співбесіді це питання швидко відділяє тих, хто розуміє механіку метрик, від тих, хто читає дашборд як таблицю.
Три ситуації, у яких вимога вирішує долю релізу: розмова зі стейкхолдером, де фразу «має працювати швидко» доводять до перевірного твердження; сценарій k6, який світиться зеленим, хоча ціль порушено; і нарада, де перф- оцінюють , а не враженнями. Скрізь — що дивитися і чому саме це.
Кейс 1. Зі стендапу до перевірної вимоги
Продакт на планувальній каже: «Checkout має працювати швидко, зараз користувачі скаржаться». Це не вимога — це симптом. Перетворення на вимогу займає одну коротку розмову, якщо йти по полях, а не питати «а скільки саме мілісекунд?».
| Що сказано | Чого бракує | Питання до стейкхолдера |
|---|---|---|
| «Checkout» | одиниці виміру | Це вся операція оформлення чи один виклик? Де вона починається й де закінчується для користувача? |
| «швидко» | зрізу розподілу й числа | Скільки користувачів мають укластися — половина, 95 зі 100, 999 з 1000? І в який час? |
| «зараз скаржаться» | навантаження | Скарги в будь-який час чи в пікові години? Який трафік вважаємо піком? |
| — | точки виміру | Міряємо на бекенді, на балансувальнику чи в браузері користувача? |
| — | вікна агрегації | Число рахуємо за хвилину, за годину, за добу? |
| — | критерію відмов | Що робимо з невдалими запитами: рахуємо їхній час чи виключаємо з вибірки? |
Результат розмови вкладається в структуру, яку далі читає і людина, і :
type PerformanceRequirement = {
transaction: string; // "checkout: від кліку Оплатити до сторінки підтвердження"
aggregation: string; // "p(95)"
operator: '<' | '<=';
value: number; // 500
unit: 'ms' | 'ratio';
load: string; // "профіль checkout-peak, 200 запитів/с, будній вечір"
measuredAt: string; // "бекенд, час до останнього байта відповіді"
window: string; // "усереднення за 1 хвилину"
errorPolicy: string; // "часи рахуються лише для успішних транзакцій"
};
Прочитане вголос, це звучить так: 95 оформлень зі 100 укладаються в 500 мс на профілі checkout-peak, час знімається на бекенді, число рахується за хвилинним вікном, а невдалі у вибірку часу не потрапляють і покриваються окремою ціллю на .
Що дивитися і чому:
- Перше питання — про транзакцію, а не про число. Якщо не домовитися, де операція починається й де закінчується, усі наступні числа будуть про різні речі. Класична розбіжність: продакт має на увазі «від кліку до сторінки подяки», а бекенд міряє один
POSTіз середини флоу. - «Скільки користувачів мають укластися» — це і є вибір зрізу. Формулювання через частку користувачів зрозуміле нетехнічному стейкхолдеру й напряму перекладається в , тоді як питання «яке середнє вас влаштує» веде до числа, за яким ховається довгий хвіст.
- Політика щодо не косметична. Невдалі запити часто повертаються швидше за успішні, бо сервер не виконує роботи; змішавши їх у спільну вибірку, ви отримаєте штучно кращий час саме тоді, коли системі погано.
- Не виводьте ціль із поточних показників. Спокуса записати «як зараз, тільки трохи краще» велика, але так ви фіксуєте те, що вже сьогодні тримається на героїзмі. Орієнтир — чого потребує користувач, і планку йому задають найкращі сервіси, якими він користується щодня.
- Ця ж структура закриває питання «чому вимогу не можна взяти з чужого проєкту». Поля
load,measuredAtіwindowунікальні для вашої системи, тож 200 мс із чужої статті — число без умов чинності.
Кейс 2. k6: зелений прогін, який нічого не перевірив
Вимога з кейсу 1 є, сценарій написано, нічний прогін завершився з кодом 0. Але вимогу порушено. Ось конфігурація, яка до цього призвела:
import http from 'k6/http';
import { check } from 'k6';
export const options = {
scenarios: {
peak: {
executor: 'constant-arrival-rate',
rate: 200, timeUnit: '1s', duration: '15m',
preAllocatedVUs: 100, maxVUs: 400,
},
},
thresholds: {
http_req_duration: ['p(95)<500'], // ← цей рядок не діє
http_req_duration: ['p(95)<2000'], // ← ключ обʼєкта той самий, лишається тільки він
},
};
export default function () {
const res = http.post(
`${__ENV.BASE_URL}/api/checkout`,
JSON.stringify({ sku: 'A-1', qty: 1 }),
{ headers: { 'Content-Type': 'application/json' } },
);
check(res, {
'status is 200': (r) => r.status === 200,
'body has orderId': (r) => r.json('orderId') !== undefined,
});
}
І підсумок, який побачив ранок:
✗ status is 200
↳ 99% — ✓ 179244 / ✗ 756
✗ body has orderId
↳ 91% — ✓ 163872 / ✗ 16128
checks.........................: 95.31% ✓ 343116 ✗ 16884
http_req_duration..............: avg=186ms med=120ms p(90)=410ms p(95)=980ms
http_req_failed................: 0.42% ✓ 756 ✗ 179244
█ THRESHOLDS
http_req_duration
✓ 'p(95)<2000' p(95)=980ms
running (15m00.0s), 000/400 VUs, 180000 complete iterations
exit status 0
Що дивитися і чому:
- Дубль ключа зʼїв суворий поріг мовчки. Пороги живуть у звичайному JavaScript-обʼєкті, тож два однакові ключі співіснувати не можуть: лишається останній, а перший зникає без попередження. У блоці
THRESHOLDSце видно одразу — умова там рівно одна, і не та, яку писали. Кілька умов на одну метрику задають масивом:http_req_duration: ['p(95)<500', 'p(99)<1500']. p(95)=980msпроти вимоги 500 мс — прогін мав бути червоним. Замість вердикту ви отримали число у звіті, яке ніхто не звіряв із вимогою руками. Саме тому «зелений прогін» без переліку виконаних порогів нічого не доводить: перше, що варто прочитати у звіті, — не метрики, а список умов, які взагалі перевірялися.- Провалений чек не завалив тест. Приблизно кожна одинадцята відповідь приходила без
orderId— тобто замовлення не створювалося, а сервер чесно віддавав200. Але невдалий чек лише накопичує свою частку уrate-метриці й на код виходу не впливає; гейтом він стає лише з порогом на цю метрику —checks: ['rate>0.99']. http_req_failed0,42% нічого не спростовує. Ця метрика бачить транспортні збої й помилкові коди, а не змістовну помилку в тілі відповіді з кодом200. Без чека на тіло прогін виміряв би швидкість, з якою система віддає порожні замовлення.- Виправлена конфігурація виглядає так — три метрики трьома окремими ключами, а кілька умов на одну метрику стоять масивом:
thresholds: {
http_req_duration: ['p(95)<500', 'p(99)<1500'], // часова поведінка
http_req_failed: ['rate<0.01'], // частка відмов, не штуки
checks: ['rate>0.99'], // ось що робить чек гейтом
},
- І остання рамка: цей поріг — не SLO. Він рахувався за пʼятнадцять хвилин на стенді, тоді як ціль на проді міряють кварталом на реальному трафіку. Зелений прогін означає «вимогу не порушено на цій вибірці», а не «SLO виконується».
Кейс 3. Нарада: чи гальмувати реліз через регресію p(95)
Реліз викотили в понеділок. p(95) транзакції оформлення виріс з 380 до 620 мс при цілі 500 мс. Розробка каже «двісті мілісекунд — це дрібниця», підтримка каже «люди скаржаться». Замість вражень на стіл кладуть бюджет.
Спершу — скільки взагалі дозволено, залежно від цілі (квартал = 90 днів; праворуч — той самий бюджет у запитах, якщо їх за квартал 100 мільйонів):
| Ціль на квартал | Бюджет ненадійності | Еквівалент у часі | Еквівалент у запитах |
|---|---|---|---|
| 99% | 1% | ~21 год 36 хв | 1 000 000 |
| 99,9% | 0,1% | ~2 год 10 хв | 100 000 |
| 99,95% | 0,05% | ~65 хв | 50 000 |
| 99,99% | 0,01% | ~13 хв | 10 000 |
| 99,999% | 0,001% | ~78 с | 1 000 |
Тепер конкретна арифметика цієї команди. SLO сформульовано через : «99% запитів швидші за 500 мс за квартал», тобто бюджет — це 1% запитів, яким дозволено бути повільними. Трафік — близько 550 тисяч запитів на добу, отже ~49,5 млн за квартал і бюджет приблизно 495 тисяч повільних запитів, або в середньому 5,5 тисячі на добу.
| Показник | До релізу | Після релізу |
|---|---|---|
p(95) транзакції оформлення | 380 мс | 620 мс |
| Частка запитів, повільніших за 500 мс | 0,4% | 6,8% |
| Повільних запитів на добу | ~2 200 | ~37 400 |
| Витрата бюджету за добу | ~0,4 денної норми | ~6,8 денної норми |
| На скільки вистачить квартального бюджету | ~225 днів | ~13 днів |
Що дивитися і чому:
- Суперечка «двісті мілісекунд — це багато чи мало» отримала числову відповідь. Не «повільніше», а «квартальний бюджет вигорить за 13 днів замість 90» — це вже підстава для рішення, і саме заради таких розмов бюджет заводять. Зверніть увагу й на нелінійність: зростання
p(95)у 1,6 раза дало сімнадцятиразову витрату бюджету, бо за поріг 500 мс переїхала ціла ділянка розподілу. - Перф-регресія їсть той самий бюджет, що й падіння сервісу. Якщо ціль сформульована через затримку, повільна відповідь для бюджету нічим не краща за помилку — обидві потрапляють у «погані» події. Тому питання «це достатньо повільно, щоб гальмувати реліз» перестає бути питанням смаку.
- Реакція не обовʼязково «відкотити». Легальних ходів кілька: відкотити реліз, залишити його й вкластися в стійкість, або свідомо переглянути ціль, якщо команда постійно не вкладається й це визнано прийнятним. Заборонений лише один варіант — мовчки порушувати чинну ціль.
- Різницю з SLA варто проговорити на тій самій нараді. Якщо в контракті з клієнтом наслідків за немає, це внутрішня ціль, і рішення ухвалює продукт. Якщо ж наслідок описано — знижка, компенсація, — розмова переходить у площину грошей, і ціна затримки рахується інакше.
- Джерело чисел має бути нейтральним. Фактичний показник беруть із системи моніторингу проду, а не з результатів прогону на стенді: прогін дає ранній сигнал і pass/fail релізу, витрату бюджету рахують на реальному трафіку.
Що обіцяє вимога до продуктивності
- Знаю, що продуктивність (performance efficiency) — це не «швидкість», а парасолька над трьома підхарактеристиками (часова поведінка, , ємність), і можу пояснити на прикладі, чому вимога лише про час решту не покриває: сервіс, який тримає 200 мс, зʼївши майже весь процесор, формально виконує її без жодного запасу.
- Розрізняю ємність (capacity) і здатність масштабуватися (scalability): перше — сьогоднішня межа, друге — можливість цю межу підняти; обидві разом із часовою поведінкою впливають на те, чи витримає система зростання.
Звідки беруться числа
- Знаю, що цілі, термінологію й критерій «досягнуто чи ні» задають стейкхолдери, а критерії продуктивності мають потрапити до на старті проєкту, а не за тиждень до релізу.
- Памʼятаю три правила вибору цілі: йти від того, що важливо користувачам, а не від того, що вимірне; не виводити ціль із поточної продуктивності; тримати цілей якнайменше й починати радше з вільної, ніж із надто суворої.
- Можу описати каркас GQM (цілі → питання → метрики), назвати його межу (частина метрик описує здоровʼя системи й із цілями не повʼязана) і пояснити, чому надлишок вимірів шкодить двічі — ускладнює аналіз і сам впливає на продуктивність застосунку.
SLI, SLO, SLA
- Розводжу три артефакти за пів хвилини: SLI — метрика, SLO — цільове значення або діапазон на цій метриці, SLA — контракт із наслідком; знаю й форму запису цілі
SLI ≤ ціль. - Знаю питання-детектор «а що станеться, якщо ціль не виконано» і памʼятаю приклад сервісу без публічної SLA, у якого наслідки недоступності все одно цілком реальні.
- Можу назвати типові індикатори ( запиту, від усіх отриманих запитів, ), пояснити ситуацію з -метрикою (релевантніша клієнтська затримка, доступна серверна — це фіксують у формулюванні) і сказати, де SLA живе в тест-процесі: серед критеріїв приймання, а її дотримання чи частота порушень — окрема метрика прогону.
Анатомія перевірної вимоги
- Можу перелічити шість відповідей, без яких вимога лишається побажанням: яка , який , яке граничне число, під яким навантаженням, у якій точці знімають вимір і за яким вікном усереднюють; і памʼятаю, що транзакція — це закінчена операція користувача, під якою може ховатися десяток HTTP-запитів, а не сам запит.
- Можу пояснити, чому ціль пишуть на перцентиль, а не на середнє, і коли одного зрізу мало: щоб описати форму кривої, задають кілька цілей одразу.
- Розумію, чому «сторінка відкривається за 2 секунди» протокольним прогоном не перевіряється (рендеринг і клієнтський JavaScript у вимір не входять), і не плутаю три лічильники JMeter:
Elapsed timeдоводить відлік до останнього байта,Latencyзупиняється на першому, аConnect Timeразом із TLS сам собою зLatencyне віднімається.
Навантаження і ємність
- Можу пояснити, чому число без названого нічого не стверджує, знаю склад профілю (кількість , набір транзакцій, період) і канонічні форми розподілу в часі — наростання, спадання, миттєві стрибки, заздалегідь задані бізнес-цикли.
- Формулюю вимогу до ємності лише з обмовкою «і при цьому все ще виконуємо заявлені цілі»: максимум «не впало» й максимум «ще вкладаємось у 500 мс» — різні числа.
Поріг: pass/fail самого прогону
- Знаю, що поріг кодифікує SLO мовою (форма «агрегація — оператор — значення», вердикт кодом виходу), і можу пояснити, чому поріг усе одно не дорівнює SLO: інші стенд, вибірка й горизонт виміру, тому значення порогу часто беруть суворішим.
- Не плутаю чек із порогом: невдалий чек лише накопичує частку у власній
rate-метриці й гейтом стає тільки в парі з порогом; при цьому чек на тіло потрібен, бо код200теж буває з помилкою всередині. - Знаю пастку з дублем ключа обʼєкта (другий поріг на ту саму метрику мовчки затирає перший, тому кілька умов задають масивом) і те, що помилки міряють часткою від усіх виконаних запитів, а не штуками.
Baseline і бюджет помилок
- Знаю, що порівняльна вимога «не гірше, ніж було» легітимна, і називаю її умови: той самий стенд, ті самі дані, зафіксований , який спеціально створюють (за потреби на знеособлених даних), а не «беруть із проду».
- Не плутаю три цілі регулярних прогонів (звірка з базовим виміром, спостереження за трендом, виловлювання релізу) і памʼятаю про перф- перед довгим прогоном, щоб не порівняти baseline із результатом зламаного скрипта.
- Можу порахувати із цілі, показати на арифметиці, як один інцидент зʼїдає його відчутну частку, і назвати управлінський наслідок вичерпаного бюджету: тимчасова зупинка релізів на користь стійкості, причому повільна відповідь витрачає бюджет нарівні з недоступністю, якщо ціль записана через затримку.
- Розумію, чому 100% — хибна ціль: ціна надійності зростає нелінійно, а користувач із 99%-надійним пристроєм різниці між останніми девʼятками не помітить.
Квіз
Перед стартом
- Питань: 16
- Поріг «зараховано»: ≥70% правильних відповідей.
- Результат впливає на прогрес; завалені питання підуть у чергу повторення.
- Квіз впливає на компліт теми: тема стає «пройдено», лише коли прочитано теорію І квіз складено на ≥70%.
Питання
SLI (service level indicator) — що це фізично?