Vse se začne z vprašanjem: kaj ti uporabniki počnejo? Tisoč ljudi, prijavljenih v aplikacijo, ne pošlje tisoč zahtev na sekundo, stran, postrežena iz predpomnilnika, pa stane stokrat manj kot izračunana stran. Ta vodnik uporabnike prevede v zahteve, zahteve v procesor in pomnilnik, nato pa pokaže, kako to preverite z obremenitvenim testom.
„Sočasni uporabniki“ pomenijo tri različne količine, odvisno od tega, kdo govori:
Od ene do druge pridemo z Littlovim zakonom: število zahtev v obdelavi je enako pretoku, v zahtevah na sekundo, pomnoženemu s povprečnim trajanjem zahteve.
Primer. 600 hkrati aktivnih uporabnikov, od katerih vsak sproži zahtevo vsakih 20 sekund, ustvari 30 zahtev na sekundo. Če vsaka zahteva traja 100 ms, ima strežnik v povprečju le 3 zahteve v obdelavi. Izziv je drugje: v konicah in v počasnih zahtevah.
Zahteva zaseda procesor toliko časa, kolikor traja njeno računanje: izvajanje kode, poizvedba v podatkovni zbirki, sestavljanje odgovora. En vCPU tako obdela največ 1000 ÷ t zahtev na sekundo, kjer je t čas računanja ene zahteve v milisekundah. Čas čakanja (zunanji API, disk) procesorja ne zaseda, zaseda pa delovni proces.
| Vrsta zahteve | Običajen čas računanja | Na vCPU, red velikosti |
|---|---|---|
| Statična datoteka ali stran iz predpomnilnika | Manj kot 1 ms | Več tisoč zahtev na sekundo |
| Stran WordPress iz predpomnilnika strani | 1 do 5 ms | Več sto na sekundo |
| API JSON (Node.js, Go, FastAPI) z indeksirano poizvedbo SQL | 5 do 20 ms | 50 do 200 na sekundo |
| Stran WordPress ali Laravel, izračunana ob vsakem obisku | 100 do 300 ms | 3 do 10 na sekundo |
| Poročilo, izvoz, ustvarjanje PDF | 500 ms do več sekund | Manj kot 2 na sekundo |
Po teh redih velikosti 30 zahtev API na sekundo z 10 ms računanja zasede 30 % enega samega vCPU. Enakih 30 zahtev na sekundo na straneh WordPress brez predpomnilnika zahteva od 3 do 9 vCPU. Predpomnilnik strani je namenjen prav temu, da stran iz četrte vrstice preglednice premakne v drugo.
Vsako zahtevo v obdelavi prevzame delovni proces (worker), delovni procesi pa zasedajo pomnilnik, ne glede na to, ali delajo ali ne. Število vzporedno obdelanih zahtev pogosto bolj kot procesor določi prav pomnilnik:
pm.max_children določi zgornjo mejo: 20 procesov pomeni od 800 MB do 1,6 GB.max_connections.Trajne povezave (websocketi, obvestila v realnem času) se štejejo posebej: ker so stalno odprte, porabijo malo procesorja in vsaka nekaj deset kilobajtov pomnilnika. Strežnik Node.js jih zdrži na tisoče v nekaj sto MB.
V resnični aplikaciji se strežnik le redko zasiti tam, kjer to pričakujemo. Najpogostejši vzroki, v vrstnem redu, v katerem jih iščete:
pg_stat_statements v PostgreSQL ali dnevnik počasnih poizvedb v MySQL jo pokaže.Redi velikosti dajo prvo velikost; obremenitveni test da pravo. Načelo: na kopiji aplikacije simulirate vse več uporabnikov in zabeležite trenutek, ko se odzivni čas poslabša.
wrk -t2 -c50 -d30s --latency https://test.vasa-stran.com/
Za celoten potek (prijava, brskanje, iskanje) k6 opiše scenarij v JavaScriptu in obremenitev povečuje postopoma:
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-stran.com/');
sleep(15);
}
htop za procesor, free -h za pomnilnik, dnevnike za napake.Vrstni red, ki stane najmanj in prinese največ:
Prvi trije koraki pokrijejo veliko večino poslovnih aplikacij, spletnih strani in API-jev: več sto hkrati aktivnih uporabnikov zdrži en sam dobro nastavljen strežnik.
VPS Pro je na voljo v šestih velikostih, na procesorjih Intel Xeon, pomnilniku ECC in zrcaljenih NVMe SSD, na večjo velikost pa preide kadar koli, brez ponovne namestitve. Celovita podpora je vključena: povejte nam, koliko uporabnikov pričakujete ob zagonu in čez eno leto, in svetujemo vam velikost; ko se stran upočasni, pa postavimo diagnozo in vam povemo, kaj storiti, od sistema do kode vaše aplikacije.
Pri API-ju ali aplikaciji, katere zahteve porabijo od 10 do 20 ms računanja, več sto hkrati aktivnih uporabnikov. Pri spletni strani WordPress brez predpomnilnika strani približno sto. Razlika izhaja iz časa računanja vsake zahteve in iz predpomnilnika, zato je obremenitveni test tako koristen.
Število obiskovalcev na dan pove malo: šteje konica. Za prehod od enega do drugega obiske v dnevu delite z urami dejavnosti, pomnožite s številom ogledanih strani na obisk, nato pa še s faktorjem konice od 3 do 5. 10.000 obiskov v 10 urah, po 4 strani vsak, pomeni v povprečju približno 1 stran na sekundo, v konici pa od 3 do 5.
Trije znaki: odzivni čas narašča s prometom, procesor ob konicah ostaja nad 80 % ali razpoložljivi pomnilnik pade skoraj na nič. Dnevniki spletnega strežnika tedaj kažejo napake 502 ali 504, zahteve pa čakajo na prost delovni proces.
Da: povezava websocket ostane stalno odprta. Porabi malo procesorja in nekaj deset kilobajtov pomnilnika. Strežnik Node.js jih zdrži na tisoče; procesor bolj kot odprte povezave obremenjujejo poslana sporočila.
Simafri
Pogovorimo se o vašem projektu
Povejte nam v nekaj besedah, kaj potrebujete: hitro se vam oglasimo.
Hvala! Vaše povpraševanje je bilo poslano. Kmalu vam bomo odgovorili.
Imate raje e-pošto? Pišite nam na support@simafri.com.