Totul începe cu o întrebare: ce fac acești utilizatori? O mie de persoane conectate la o aplicație nu fac o mie de cereri pe secundă, iar o pagină servită din cache costă de o sută de ori mai puțin decât o pagină calculată. Acest ghid transformă utilizatorii în cereri, cererile în procesor și memorie, apoi arată cum verificați totul printr-un test de încărcare.
„Utilizatori simultani” desemnează trei mărimi diferite, după cine vorbește:
Se trece de la una la alta prin legea lui Little: numărul de cereri în curs este egal cu debitul, în cereri pe secundă, înmulțit cu durata medie a unei cereri.
Exemplu. 600 de utilizatori activi în același timp, care declanșează fiecare câte o cerere la fiecare 20 de secunde, produc 30 de cereri pe secundă. Dacă fiecare cerere durează 100 ms, serverul are în medie doar 3 cereri în curs. Miza este în altă parte: în vârfuri și în cererile lente.
O cerere ocupă procesorul pe durata calculului său: executarea codului, interogarea bazei de date, construirea răspunsului. Un vCPU procesează deci cel mult 1.000 ÷ t cereri pe secundă, unde t este timpul de calcul al unei cereri, în milisecunde. Timpul petrecut în așteptare (un API extern, un disc) nu ocupă procesorul, dar ocupă un worker.
| Tipul cererii | Timp de calcul tipic | Pe vCPU, ordin de mărime |
|---|---|---|
| Fișier static sau pagină servită din cache | Sub 1 ms | Câteva mii de cereri pe secundă |
| Pagină WordPress servită de un cache de pagini | Între 1 și 5 ms | Câteva sute pe secundă |
| API JSON (Node.js, Go, FastAPI) cu o interogare SQL indexată | Între 5 și 20 ms | Între 50 și 200 pe secundă |
| Pagină WordPress sau Laravel calculată la fiecare vizită | Între 100 și 300 ms | Între 3 și 10 pe secundă |
| Raport, export, generare de PDF | De la 500 ms la câteva secunde | Sub 2 pe secundă |
Cu aceste ordine de mărime, 30 de cereri API pe secundă la 10 ms de calcul ocupă 30% dintr-un singur vCPU. Aceleași 30 de cereri pe secundă pe pagini WordPress fără cache cer între 3 și 9 vCPU. Cache-ul de pagini servește tocmai la mutarea unei pagini de pe al patrulea rând al tabelului pe al doilea.
Fiecare cerere în curs este preluată de un worker, iar workerii ocupă memorie, fie că lucrează, fie că nu. Adesea memoria, mai mult decât procesorul, stabilește numărul de cereri procesate în paralel:
pm.max_children stabilește plafonul: 20 de procese înseamnă între 800 MB și 1,6 GB.max_connections.Conexiunile persistente (websocketuri, notificări în timp real) se socotesc separat: deschise permanent, ele ocupă puțin procesor și câteva zeci de kiloocteți de memorie fiecare. Un server Node.js ține mii de astfel de conexiuni în câteva sute de MB.
Într-o aplicație reală, serverul se saturează rareori acolo unde vă așteptați. Cauzele cele mai frecvente, în ordinea în care merită căutate:
pg_stat_statements pe PostgreSQL sau jurnalul interogărilor lente din MySQL o identifică.Ordinele de mărime dau o primă dimensiune; un test de încărcare o dă pe cea reală. Principiul: simulați tot mai mulți utilizatori pe o copie a aplicației și notați momentul în care timpul de răspuns se degradează brusc.
wrk -t2 -c50 -d30s --latency https://preprod.site-ul-dumneavoastra.com/
Pentru un parcurs complet (autentificare, navigare, căutare), k6 descrie un scenariu în JavaScript și crește încărcarea pe trepte:
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.site-ul-dumneavoastra.com/');
sleep(15);
}
htop pentru procesor, free -h pentru memorie, jurnalele pentru erori.Ordinea care costă cel mai puțin și aduce cel mai mult:
Primele trei etape acoperă marea majoritate a aplicațiilor de gestiune, a site-urilor și a API-urilor: câteva sute de utilizatori activi în același timp încap pe un singur server bine reglat.
VPS Pro este disponibil în șase dimensiuni, pe procesoare Intel Xeon, memorie ECC și SSD NVMe în oglindă, și trece la dimensiunea superioară oricând, fără reinstalare. Asistența integrală este inclusă: spuneți-ne câți utilizatori așteptați la lansare și peste un an, și vă recomandăm dimensiunea; iar când o pagină încetinește, punem diagnosticul și vă indicăm ce aveți de făcut, de la sistem până la codul aplicației dumneavoastră.
Pentru un API sau o aplicație ale cărei cereri iau între 10 și 20 ms de calcul, câteva sute de utilizatori activi în același timp. Pentru un site WordPress fără cache de pagini, în jur de o sută. Diferența ține de timpul de calcul al fiecărei cereri și de cache, de unde utilitatea unui test de încărcare.
Numărul de vizitatori pe zi spune puțin: ceea ce contează este vârful. Pentru a trece de la unul la celălalt, împărțiți vizitele zilei la orele de activitate, înmulțiți cu numărul de pagini vizualizate pe vizită, apoi cu un factor de vârf între 3 și 5. 10.000 de vizite în 10 ore, cu câte 4 pagini fiecare, dau aproximativ 1 pagină pe secundă în medie și între 3 și 5 la vârf.
Trei semne: timpul de răspuns crește odată cu traficul, procesorul rămâne peste 80% la orele de vârf sau memoria disponibilă scade aproape de zero. Jurnalele serverului web arată atunci erori 502 sau 504, iar cererile așteaptă un worker liber.
Da: o conexiune websocket rămâne deschisă permanent. Ea consumă puțin procesor și câteva zeci de kiloocteți de memorie. Un server Node.js ține mii de astfel de conexiuni; mesajele trimise, mai mult decât conexiunile deschise, încarcă procesorul.
Simafri
Să discutăm despre site-ul dumneavoastră
Povestiți-ne despre proiectul dumneavoastră în câteva cuvinte: vă vom răspunde rapid.
Mulțumim! Cererea dumneavoastră a fost trimisă. Vă vom răspunde în curând.
Preferați e-mailul? Scrieți-ne la support@simafri.com.