Viskas prasideda nuo klausimo: ką daro tie vartotojai? Tūkstantis prie programos prisijungusių žmonių nesiunčia tūkstančio užklausų per sekundę, o iš podėlio pateiktas puslapis pareikalauja šimtą kartų mažiau išteklių nei sugeneruotas. Šis gidas vartotojus paverčia užklausomis, užklausas procesoriumi ir atmintimi, tada parodo, kaip tai patikrinti apkrovos testu.
„Vienu metu prisijungę vartotojai“ reiškia tris skirtingus dydžius, priklausomai nuo to, kas kalba:
Iš vieno dydžio į kitą pereinama pagal Little dėsnį: vykdomų užklausų skaičius lygus srautui, išreikštam užklausomis per sekundę, padaugintam iš vidutinės užklausos trukmės.
Pavyzdys. 600 vienu metu aktyvių vartotojų, kurių kiekvienas užklausą siunčia kas 20 sekundžių, sudaro 30 užklausų per sekundę. Jei kiekviena užklausa trunka 100 ms, serveris vidutiniškai vienu metu apdoroja tik 3 užklausas. Tikrasis iššūkis slypi kitur: pikuose ir lėtose užklausose.
Užklausa užima procesorių tol, kol skaičiuojama: vykdomas kodas, užklausiama duomenų bazė, kuriamas atsakymas. Todėl vienas vCPU apdoroja ne daugiau kaip 1 000 ÷ t užklausų per sekundę, kur t yra vienos užklausos skaičiavimo laikas milisekundėmis. Laukimo laikas (išorinė API, diskas) procesoriaus neužima, bet užima darbinį procesą.
| Užklausos tipas | Tipinis skaičiavimo laikas | Vienam vCPU, orientaciškai |
|---|---|---|
| Statinis failas arba iš podėlio pateiktas puslapis | Mažiau nei 1 ms | Keli tūkstančiai užklausų per sekundę |
| WordPress puslapis, pateiktas iš puslapių podėlio | nuo 1 iki 5 ms | Keli šimtai per sekundę |
| JSON API (Node.js, Go, FastAPI) su indeksuota SQL užklausa | nuo 5 iki 20 ms | nuo 50 iki 200 per sekundę |
| WordPress ar Laravel puslapis, generuojamas per kiekvieną apsilankymą | nuo 100 iki 300 ms | nuo 3 iki 10 per sekundę |
| Ataskaita, eksportas, PDF generavimas | nuo 500 ms iki kelių sekundžių | Mažiau nei 2 per sekundę |
Pagal šiuos dydžius 30 API užklausų per sekundę po 10 ms skaičiavimo užima 30 % vieno vCPU. Tos pačios 30 užklausų per sekundę WordPress puslapiams be podėlio reikalauja nuo 3 iki 9 vCPU. Puslapių podėlis kaip tik ir skirtas tam, kad puslapis iš ketvirtos lentelės eilutės pereitų į antrą.
Kiekvieną vykdomą užklausą apdoroja darbinis procesas, o darbiniai procesai užima atmintį, nesvarbu, dirba jie ar ne. Dažnai būtent atmintis, labiau nei procesorius, lemia, kiek užklausų apdorojama lygiagrečiai:
pm.max_children nustato viršutinę ribą: 20 procesų reiškia nuo 800 MB iki 1,6 GB.max_connections didinimas.Nuolatinės jungtys (websockets, realiojo laiko pranešimai) skaičiuojamos atskirai: nuolat atviros, jos užima mažai procesoriaus ir po kelias dešimtis kilobaitų atminties. Node.js serveris jų išlaiko tūkstančius per kelis šimtus MB.
Realioje programoje serveris retai perkraunamas ten, kur to tikimasi. Dažniausios priežastys, ta tvarka, kuria verta jų ieškoti:
pg_stat_statements arba MySQL lėtų užklausų žurnalas ją parodo.Orientaciniai dydžiai duoda pirmąjį dydį; apkrovos testas duoda tikrąjį. Principas: programos kopijoje imituoti vis daugiau vartotojų ir užfiksuoti momentą, kai atsako laikas staiga pablogėja.
wrk -t2 -c50 -d30s --latency https://testavimas.jusu-svetaine.com/
Visam naudojimo scenarijui (prisijungimas, naršymas, paieška) k6 aprašo scenarijų JavaScript kalba ir didina apkrovą pakopomis:
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://testavimas.jusu-svetaine.com/');
sleep(15);
}
htop procesoriui, free -h atminčiai, žurnalus klaidoms.Tvarka, kuri reikalauja mažiausiai pastangų ir duoda daugiausia naudos:
Pirmieji trys žingsniai tinka didžiajai daugumai verslo valdymo programų, svetainių ir API: keli šimtai vienu metu aktyvių vartotojų telpa viename gerai sureguliuotame serveryje.
VPS Pro siūlomas šešių dydžių, su Intel Xeon procesoriais, ECC atmintimi ir veidrodiniais NVMe SSD, ir bet kada pereina prie didesnio dydžio, be pakartotinio diegimo. Visapusiška pagalba įskaičiuota: pasakykite, kiek vartotojų tikitės paleidimo metu ir po metų, ir mes patarsime dydį; o kai puslapis sulėtėja, diagnozuojame ir nurodome, ką daryti, nuo sistemos iki jūsų programos kodo.
API ar programai, kurios užklausoms reikia nuo 10 iki 20 ms skaičiavimo, keli šimtai vienu metu aktyvių vartotojų. WordPress svetainei be puslapių podėlio apie šimtą. Skirtumą lemia kiekvienos užklausos skaičiavimo laikas ir podėlis, todėl verta atlikti apkrovos testą.
Lankytojų per dieną skaičius mažai ką pasako: svarbus pikas. Norėdami pereiti nuo vieno prie kito, dienos apsilankymus padalykite iš aktyvių valandų, padauginkite iš per apsilankymą peržiūrėtų puslapių, tada iš piko koeficiento nuo 3 iki 5. 10 000 apsilankymų per 10 valandų, po 4 puslapius kiekvienas, vidutiniškai duoda apie 1 puslapį per sekundę, o piko metu nuo 3 iki 5.
Trys ženklai: atsako laikas ilgėja didėjant srautui, procesorius piko valandomis išlieka virš 80 % arba prieinama atmintis nukrenta beveik iki nulio. Tada žiniatinklio serverio žurnaluose matyti klaidos 502 ar 504, o užklausos laukia laisvo darbinio proceso.
Taip: websocket jungtis lieka nuolat atvira. Ji vartoja mažai procesoriaus ir kelias dešimtis kilobaitų atminties. Node.js serveris jų išlaiko tūkstančius; procesorių labiau apkrauna siunčiami pranešimai nei atviros jungtys.
Simafri
Pakalbėkime apie jūsų sumanymą
Pasakykite mums keliais žodžiais, ko jums reikia: greitai jums atsakome.
Ačiū! Jūsų užklausa išsiųsta. Netrukus su jumis susisieksime.
Labiau mėgstate el. paštą? Rašykite mums adresu support@simafri.com.