Уроци от търкаляне на (средноголеми уеб) приложения в продукция
* Какво (и как) да мерим
* Кога да мерим изобщо 🙈
* За какво да внимаваме в продукция
* Infrastructure-friendly apps
* Cost-saving & друга мешана скара
За какво да внимаваме в продукция Infrastructure-friendly apps Cost-saving & друга мешана скара Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
Tracing APM Unified view / single pane of glass Сервирано с дресинг от маркетинг сосове Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
ще изисква. За хоби проекти и тепърва прохождащи неща, няма голямо значение. За по-големи проекти, всяка минута downtime, или дори забавяне в заявките, са от значение. Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
160 в секунда. 10-15к уникални потребителя, цъкащи из сайта в рамките на 30 минути през "деня". 2 TB основна база (PostgreSQL), иначе няколкостотин TB данни из S3 кофи. Деплойват се промени по няколко пъти на ден (zero-downtime). Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
web app Контейнеризирани Търкалят се в home-grown Kubernetes cluster В AWS Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
има 2. App server (puma, passenger, ...) 3. App code (Rails) + deployment модела ви (процеси, нишки, ...) 4. Обикновено има и още. Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
Nginx като L7 per-request LB (работещ на група от няколко машини) 3. Nginx вътре във всеки app pod 4. Puma или Passenger 5. Rails + app code Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
как, какво и кога буферира Кое как се чупи и какви грешки генерира Всяко звено продуцира метрики и логове, които може да ви интересуват Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
Релсата пристига "готов" request Понякога яде повече памет (разумните буфериращи неща пазят във файл от един размер нагоре) Искам ли го изобщо? Обикновено да. Пази ви от т.нар. "slow clients" Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
1. Multi-process 2. Multi-threaded ← Rails is stuck here 3. Event-based ← Falcon #хубавоенонееготово Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
multi- threaded (други по-малки апове) Разгледахме Falcon (async/evented сървър), но на практика не ни огря Отскоро имаме и event-based неща, ама са на nodejs Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
tracking (по имейл, или някоя услуга – Sentry, Bugsnag, HoneyBadger, ...) 3. Логове на всяко от звената по пътя 4. Метрики от (повечето) звена по пътя ← ние сме тук 5. APM 6. Tracing 7. Ad-hoc/realtime profiling/troubleshooting Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
Х минути и ви известява, ако не успее да получи желаният резултат Добре е да пази история и статистика, поне за вътрешна употреба Бонус: да може да покаже публичен uptime/status page Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
имейл ...до момента, в който ви избухне пощенската кутия от някой хахо, който ви бомби сайта с глупости Error tracking services имат смислена употреба Внимавайте за квотата им и какво става, когато я достигнете Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
с логове APM и tracing си имат цена (за нея – след малко) Важно: от всяко звено! Poor-man's-APM, ако логвате и неща като CPU & mem usage per request Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
calls Идентификатори и параметри на request/response-а Брой алокации GC.stat[:total_allocated_objects] Diff на паметта: /proc/#{Process.pid}/status CPU burn: Process.clock_gettime с Process::CLOCK_THREAD_CPUTIME_ID Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
max, 90th, 95th, 99th) Beware of averages! Брой responses per status code (може и агрегирани) Наличен и "зает" капацитет (полезно за autoscaling) Системни ресурси на вашите звена (CPU, memory, traffic, ...) Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
(възраст на най-стария job) Време на обработка Наличен и "зает" капацитет Системни ресурси на вашите звена (CPU, memory, traffic, ...) Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
...) "Какво искам да виждам?" Ако ще го правите, търсете tail-based sampling (сигурно искате да виждате с приоритет най- бавните си заявки) И умната Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
) (не е толкова лесно, колкото звучи) async > sync Внимавайте за паметта Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
приятел (streaming) JSON parsing Lots of AR objects vs сурови DB resultsets и POROs Винаги с лимит и/или обработвайте на бачове "Рестартирай и ще се оправи" (process recycling) Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
early errors Autoscaling, spot машини и подобни Use the ARM, Luke! Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext
S3...) 2. render.com > heroku.com, но и Heroku става. 3. Any VPS (AWS Lightsail anyone?) или на домашния Raspberry Pi 4. AWS/GCP/whatever-floats-your-boat 5. Bare metal? 6. Psst: no Ruby Banitsa Ruby Banitsa 2023-03-06 – by 2023-03-06 – by @mitio @mitio от от Dext Dext