Minden egy kérdéssel kezdődik: mit csinálnak ezek a felhasználók? Egy alkalmazásba bejelentkezett ezer ember nem küld ezer kérést másodpercenként, és egy gyorsítótárból kiszolgált oldal százszor kevesebbe kerül, mint egy minden alkalommal újra előállított oldal. Ez az útmutató a felhasználókat kérésekre, a kéréseket processzorra és memóriára váltja át, majd megmutatja, hogyan ellenőrizze mindezt terheléses teszttel.
Az „egyidejű felhasználók” három különböző mennyiséget jelent attól függően, ki beszél:
Az egyikről a másikra Little törvénye segítségével lehet áttérni: a folyamatban lévő kérések száma egyenlő az átbocsátással (kérés másodpercenként) szorozva egy kérés átlagos időtartamával.
Példa. 600 egyszerre aktív felhasználó, akik mindegyike 20 másodpercenként indít egy kérést, másodpercenként 30 kérést jelent. Ha minden kérés 100 ms-ig tart, a szerveren átlagosan csak 3 kérés van folyamatban. A tét máshol van: a csúcsokban és a lassú kérésekben.
Egy kérés a számítás idejére foglalja a processzort: a kód futtatása, az adatbázis lekérdezése, a válasz összeállítása. Egy vCPU így legfeljebb 1000 ÷ t kérést dolgoz fel másodpercenként, ahol t egy kérés számítási ideje ezredmásodpercben. A várakozással töltött idő (egy külső API-ra, a lemezre) nem foglalja a processzort, de egy workert igen.
| A kérés típusa | Jellemző számítási idő | vCPU-nként, nagyságrendileg |
|---|---|---|
| Statikus fájl vagy gyorsítótárból kiszolgált oldal | Kevesebb mint 1 ms | Több ezer kérés másodpercenként |
| Oldalgyorsítótárból kiszolgált WordPress-oldal | 1 és 5 ms között | Több száz másodpercenként |
| JSON API (Node.js, Go, FastAPI) indexelt SQL-lekérdezéssel | 5 és 20 ms között | 50 és 200 között másodpercenként |
| Minden látogatáskor előállított WordPress- vagy Laravel-oldal | 100 és 300 ms között | 3 és 10 között másodpercenként |
| Jelentés, exportálás, PDF-generálás | 500 ms és több másodperc között | Kevesebb mint 2 másodpercenként |
Ezekkel a nagyságrendekkel másodpercenként 30 API-kérés 10 ms számítási idővel egyetlen vCPU 30%-át foglalja le. Ugyanez a másodpercenkénti 30 kérés gyorsítótár nélküli WordPress-oldalakon 3 és 9 közötti vCPU-t igényel. Az oldalgyorsítótár éppen arra szolgál, hogy egy oldalt a táblázat negyedik sorából a második sorába vigyen át.
Minden folyamatban lévő kérést egy worker kezel, a workerek pedig memóriát foglalnak, akár dolgoznak, akár nem. Gyakran a memória, és nem a processzor határozza meg a párhuzamosan feldolgozott kérések számát:
pm.max_children adja a plafont: 20 folyamat 800 MB és 1,6 GB között foglal.max_connections emelése.Az állandó kapcsolatokat (websocketek, valós idejű értesítések) külön kell számolni: folyamatosan nyitva vannak, kevés processzort és egyenként néhány tíz kilobájt memóriát foglalnak. Egy Node.js-szerver több ezret is elbír belőlük néhány száz MB-ban.
Egy valós alkalmazásban a szerver ritkán ott telítődik, ahol várnánk. A leggyakoribb okok, abban a sorrendben, ahogyan keresni érdemes őket:
pg_stat_statements, MySQL-en a lassú lekérdezések naplója mutat rá.A nagyságrendek egy első méretet adnak; a terheléses teszt a valódit. Az elv: egyre több felhasználót szimulálni az alkalmazás egy másolatán, és feljegyezni azt a pontot, ahol a válaszidő hirtelen megugrik.
wrk -t2 -c50 -d30s --latency https://staging.sajat-webhely.com/
Egy teljes felhasználói útvonalhoz (bejelentkezés, böngészés, keresés) a k6 JavaScriptben ír le egy forgatókönyvet, és fokozatosan emeli a terhelést:
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://staging.sajat-webhely.com/');
sleep(15);
}
htop a processzorhoz, free -h a memóriához, a naplók a hibákhoz.A sorrend, amely a legkevesebbe kerül és a legtöbbet hozza:
Az első három lépés lefedi az ügyviteli alkalmazások, weboldalak és API-k túlnyomó többségét: több száz egyszerre aktív felhasználó elfér egyetlen jól hangolt szerveren.
A VPS Pro hat méretben érhető el, Intel Xeon processzorokon, ECC memóriával és tükrözött NVMe SSD-kkel, és bármikor nagyobb méretre válthat, újratelepítés nélkül. A Teljes körű támogatás a csomag része: mondja el, hány felhasználót vár induláskor és egy év múlva, mi javasoljuk a méretet; és amikor egy oldal lelassul, diagnosztizálunk, és megmondjuk, mit tegyen, a rendszertől egészen az alkalmazása kódjáig.
Egy olyan API vagy alkalmazás esetén, amelynek kérései 10 és 20 ms közötti számítási időt igényelnek, több száz egyszerre aktív felhasználót. Egy oldalgyorsítótár nélküli WordPress-oldal esetén nagyjából százat. A különbség az egyes kérések számítási idejéből és a gyorsítótárból adódik, ezért érdemes terheléses tesztet végezni.
A napi látogatók száma önmagában keveset mond: a csúcs számít. Az átváltáshoz ossza el a napi látogatásokat az aktív órák számával, szorozza meg a látogatásonkénti oldalmegtekintésekkel, majd egy 3 és 5 közötti csúcstényezővel. 10 000 látogatás 10 óra alatt, egyenként 4 oldallal, átlagosan nagyjából 1 oldalt jelent másodpercenként, a csúcsban pedig 3 és 5 között.
Három jel: a válaszidő a forgalommal együtt nő, a processzor csúcsidőben 80% felett marad, vagy a rendelkezésre álló memória nulla közelébe esik. A webszerver naplói ilyenkor 502-es vagy 504-es hibákat mutatnak, a kérések pedig szabad workerre várnak.
Igen: egy websocket-kapcsolat folyamatosan nyitva marad. Kevés processzort és néhány tíz kilobájt memóriát fogyaszt. Egy Node.js-szerver több ezret is elbír belőlük; a processzort inkább az elküldött üzenetek terhelik, mint a nyitott kapcsolatok.
Simafri
Beszéljünk a weboldaláról
Meséljen néhány szóban a projektjéről: hamarosan jelentkezünk.
Köszönjük! Kérését elküldtük. Hamarosan válaszolunk.
Inkább e-mailben? Írjon nekünk ide: support@simafri.com.