Sve počinje jednim pitanjem: što ti korisnici rade? Tisuću osoba prijavljenih u aplikaciju ne šalje tisuću zahtjeva u sekundi, a stranica poslužena iz predmemorije opterećuje poslužitelj sto puta manje od stranice izračunate pri svakom posjetu. Ovaj vodič pretvara korisnike u zahtjeve, zahtjeve u procesor i memoriju, a zatim pokazuje kako to provjeriti testom opterećenja.
„Istovremeni korisnici” označava tri različite veličine, ovisno o tome tko govori:
Od jedne do druge dolazi se Littleovim zakonom: broj zahtjeva u obradi jednak je protoku, u zahtjevima u sekundi, pomnoženom s prosječnim trajanjem zahtjeva.
Primjer. 600 korisnika aktivnih u isto vrijeme, od kojih svaki pokrene zahtjev svakih 20 sekundi, čini 30 zahtjeva u sekundi. Ako svaki zahtjev traje 100 ms, poslužitelj u prosjeku ima samo 3 zahtjeva u obradi. Pravi je izazov drugdje: u vrhovima opterećenja i u sporim zahtjevima.
Zahtjev zauzima procesor dok traje njegov izračun: izvršavanje koda, upit bazi, izrada odgovora. Jedan vCPU stoga obrađuje najviše 1 000 ÷ t zahtjeva u sekundi, gdje je t vrijeme izračuna zahtjeva u milisekundama. Vrijeme provedeno u čekanju (vanjski API, disk) ne zauzima procesor, ali zauzima worker.
| Vrsta zahtjeva | Tipično vrijeme izračuna | Po vCPU-u, red veličine |
|---|---|---|
| Statična datoteka ili stranica poslužena iz predmemorije | Manje od 1 ms | Nekoliko tisuća zahtjeva u sekundi |
| WordPress stranica poslužena iz predmemorije stranica | 1 do 5 ms | Nekoliko stotina u sekundi |
| JSON API (Node.js, Go, FastAPI) s indeksiranim SQL upitom | 5 do 20 ms | 50 do 200 u sekundi |
| WordPress ili Laravel stranica izračunata pri svakom posjetu | 100 do 300 ms | 3 do 10 u sekundi |
| Izvješće, izvoz, izrada PDF-a | 500 ms do nekoliko sekundi | Manje od 2 u sekundi |
Uz ove redove veličine, 30 API zahtjeva u sekundi uz 10 ms izračuna zauzima 30 % jednog jedinog vCPU-a. Istih 30 zahtjeva u sekundi na WordPress stranicama bez predmemorije traži 3 do 9 vCPU-a. Predmemorija stranica služi upravo tome da stranicu prebaci iz četvrtog retka tablice u drugi.
Svaki zahtjev u obradi preuzima worker, a workeri zauzimaju memoriju, radili ili ne. Često memorija, više nego procesor, određuje broj zahtjeva koji se obrađuju usporedno:
pm.max_children određuje gornju granicu: 20 procesa znači 800 MB do 1,6 GB.max_connections.Trajne veze (websocketi, obavijesti u stvarnom vremenu) broje se zasebno: stalno otvorene, zauzimaju malo procesora i po nekoliko desetaka kilobajta memorije. Node.js poslužitelj drži ih tisuće u nekoliko stotina MB.
U stvarnoj aplikaciji poslužitelj se rijetko zaguši ondje gdje se to očekuje. Najčešći uzroci, redom kojim ih treba tražiti:
pg_stat_statements na PostgreSQL-u ili zapis sporih upita u MySQL-u pokazuje ga.Redovi veličine daju prvu procjenu veličine; test opterećenja daje stvarnu. Načelo: simulirati sve veći broj korisnika na kopiji aplikacije i zabilježiti trenutak kada vrijeme odziva naglo poraste.
wrk -t2 -c50 -d30s --latency https://test.vasa-stranica.com/
Za cijeli put korisnika (prijava, pregledavanje, pretraživanje) k6 opisuje scenarij u JavaScriptu i povećava opterećenje u koracima:
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 100 },
{ duration: '2m', target: 300 },
{ duration: '5m', target: 300 },
{ duration: '2m', target: 0 },
],
thresholds: { http_req_duration: ['p(95)<500'] },
};
export default function () {
http.get('https://test.vasa-stranica.com/');
sleep(15);
}
htop za procesor, free -h za memoriju, zapise za pogreške.Redoslijed koji traži najmanje truda, a donosi najviše:
Prva tri koraka pokrivaju veliku većinu poslovnih aplikacija, stranica i API-ja: nekoliko stotina korisnika aktivnih u isto vrijeme radi na jednom dobro podešenom poslužitelju.
VPS Pro dostupan je u šest veličina, na procesorima Intel Xeon, ECC memoriji i zrcaljenim NVMe SSD-ovima, a na veću veličinu prelazi u svakom trenutku, bez ponovne instalacije. Cjelovita podrška je uključena: recite nam koliko korisnika očekujete pri pokretanju i za godinu dana, i savjetovat ćemo vam veličinu; a kada neka stranica uspori, postavljamo dijagnozu i kažemo vam što učiniti, od sustava do koda vaše aplikacije.
Za API ili aplikaciju čiji zahtjevi traže 10 do 20 ms izračuna, nekoliko stotina korisnika aktivnih u isto vrijeme. Za WordPress stranicu bez predmemorije stranica, otprilike stotinu. Razlika proizlazi iz vremena izračuna svakog zahtjeva i iz predmemorije, zato se test opterećenja isplati.
Broj posjetitelja dnevno malo govori: važan je vrh. Da biste od jednog došli do drugog, podijelite dnevne posjete s brojem aktivnih sati, pomnožite s brojem pregledanih stranica po posjetu, a zatim s faktorom vrha od 3 do 5. 10 000 posjeta tijekom 10 sati, po 4 stranice, daje u prosjeku oko 1 stranicu u sekundi, a u vrhu 3 do 5.
Tri znaka: vrijeme odziva raste s prometom, procesor u vršnim satima ostaje iznad 80 % ili dostupna memorija pada blizu nule. Zapisi web poslužitelja tada pokazuju pogreške 502 ili 504, a zahtjevi čekaju slobodan worker.
Da: websocket veza ostaje stalno otvorena. Troši malo procesora i nekoliko desetaka kilobajta memorije. Node.js poslužitelj drži ih tisuće; procesor opterećuju poslane poruke, više nego otvorene veze.
Simafri
Porazgovarajmo o Vašem projektu
Recite nam u nekoliko riječi što trebate: javljamo Vam se brzo.
Hvala! Vaš upit je poslan. Javit ćemo vam se uskoro.
Više volite e-mail? Pišite nam na support@simafri.com.