Vše začíná otázkou: co tito uživatelé dělají? Tisíc lidí přihlášených do aplikace neposílá tisíc požadavků za sekundu a stránka obsloužená z cache stojí stokrát méně než stránka, kterou server pokaždé počítá. Tento průvodce převádí uživatele na požadavky, požadavky na procesor a paměť a pak ukazuje, jak vše ověřit zátěžovým testem.
„Souběžní uživatelé“ označují podle toho, kdo mluví, tři různé veličiny:
Mezi nimi se přechází pomocí Littleova zákona: počet rozpracovaných požadavků se rovná propustnosti v požadavcích za sekundu vynásobené průměrnou dobou trvání požadavku.
Příklad. 600 uživatelů aktivních ve stejnou chvíli, z nichž každý vyvolá požadavek jednou za 20 sekund, dává 30 požadavků za sekundu. Pokud každý požadavek trvá 100 ms, má server v průměru rozpracované jen 3 požadavky. To podstatné leží jinde: ve špičkách a v pomalých požadavcích.
Požadavek zaměstnává procesor po dobu svého výpočtu: provedení kódu, dotaz do databáze, sestavení odpovědi. Jeden vCPU tedy zpracuje nanejvýš 1 000 ÷ t požadavků za sekundu, kde t je doba výpočtu jednoho požadavku v milisekundách. Čas strávený čekáním (na externí API, na disk) procesor nezaměstnává, ale zaměstnává worker.
| Typ požadavku | Typická doba výpočtu | Na jeden vCPU, řádově |
|---|---|---|
| Statický soubor nebo stránka obsloužená z cache | Méně než 1 ms | Několik tisíc požadavků za sekundu |
| Stránka WordPressu obsloužená z cache stránek | 1 až 5 ms | Několik stovek za sekundu |
| JSON API (Node.js, Go, FastAPI) s indexovaným dotazem SQL | 5 až 20 ms | 50 až 200 za sekundu |
| Stránka WordPressu nebo Laravelu počítaná při každé návštěvě | 100 až 300 ms | 3 až 10 za sekundu |
| Report, export, generování PDF | 500 ms až několik sekund | Méně než 2 za sekundu |
S těmito řády zaberou 30 požadavků API za sekundu s 10 ms výpočtu 30 % jediného vCPU. Stejných 30 požadavků za sekundu na stránky WordPressu bez cache vyžaduje 3 až 9 vCPU. Cache stránek slouží právě k tomu, aby se stránka přesunula ze čtvrtého řádku tabulky na druhý.
Každý rozpracovaný požadavek obsluhuje worker a workery zabírají paměť, ať pracují, nebo ne. Počet paralelně zpracovávaných požadavků často určuje spíše paměť než procesor:
pm.max_children určuje strop: 20 procesů znamená 800 MB až 1,6 GB.max_connections.Trvalá připojení (websockety, notifikace v reálném čase) se počítají zvlášť: jsou otevřená nepřetržitě, spotřebují málo procesoru a každé několik desítek kilobajtů paměti. Server Node.js jich udrží tisíce v několika stovkách MB.
V reálné aplikaci se server málokdy zahltí tam, kde to čekáte. Nejčastější příčiny, v pořadí, v jakém je hledat:
pg_stat_statements, na MySQL log pomalých dotazů.Řády dávají první odhad velikosti; zátěžový test dává tu skutečnou. Princip: simulovat stále více uživatelů na kopii aplikace a zaznamenat okamžik, kdy doba odezvy prudce vzroste.
wrk -t2 -c50 -d30s --latency https://preprod.vas-web.com/
Pro celý průchod aplikací (přihlášení, procházení, vyhledávání) popíše k6 scénář v JavaScriptu a zátěž zvyšuje po stupních:
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://preprod.vas-web.com/');
sleep(15);
}
htop pro procesor, free -h pro paměť, logy pro chyby.Pořadí, které stojí nejméně a přináší nejvíc:
První tři kroky pokryjí velkou většinu firemních aplikací, webů a API: několik stovek uživatelů aktivních ve stejnou chvíli zvládne jediný dobře nastavený server.
VPS Pro nabízí šest velikostí na procesorech Intel Xeon, paměti ECC a zrcadlených SSD NVMe a na vyšší velikost přejde kdykoli, bez reinstalace. Komplexní podpora je v ceně: řekněte nám, kolik uživatelů očekáváte při spuštění a za rok, a doporučíme vám velikost; a když se některá stránka zpomalí, stanovíme diagnózu a řekneme vám, co udělat, od systému až po kód vaší aplikace.
U API nebo aplikace, jejíž požadavky potřebují 10 až 20 ms výpočtu, několik stovek uživatelů aktivních ve stejnou chvíli. U webu na WordPressu bez cache stránek zhruba stovku. Rozdíl dělá doba výpočtu každého požadavku a cache, a proto má smysl zátěžový test.
Počet návštěvníků za den mnoho neřekne: rozhoduje špička. Pro převod vydělte denní návštěvy počtem hodin provozu, vynásobte počtem zobrazených stránek na návštěvu a pak koeficientem špičky 3 až 5. 10 000 návštěv za 10 hodin, každá se 4 stránkami, dává v průměru zhruba 1 stránku za sekundu a ve špičce 3 až 5.
Tři příznaky: doba odezvy roste s provozem, procesor zůstává ve špičce nad 80 % nebo dostupná paměť klesá téměř k nule. Logy webového serveru pak ukazují chyby 502 nebo 504 a požadavky čekají na volný worker.
Ano: připojení přes websocket zůstává otevřené nepřetržitě. Spotřebuje málo procesoru a několik desítek kilobajtů paměti. Server Node.js jich udrží tisíce; procesor zatěžují spíše odesílané zprávy než otevřená připojení.
Simafri
Promluvme si o vašem záměru
Řekněte nám v pár slovech, co potřebujete: rychle se vám ozveme.
Děkujeme! Vaše zpráva byla odeslána. Brzy se vám ozveme.
Máte raději e-mail? Napište nám na support@simafri.com.