Alles begint met één vraag: wat doen die gebruikers? Duizend mensen die zijn ingelogd op een applicatie doen geen duizend verzoeken per seconde, en een pagina uit een cache kost honderd keer minder dan een pagina die telkens opnieuw wordt berekend. Deze gids vertaalt gebruikers naar verzoeken, verzoeken naar processor en geheugen, en laat daarna zien hoe u het controleert met een loadtest.
“Gelijktijdige gebruikers” staat voor drie verschillende grootheden, afhankelijk van wie het zegt:
Van de ene naar de andere gaat u met de wet van Little: het aantal lopende verzoeken is gelijk aan de doorvoer, in verzoeken per seconde, vermenigvuldigd met de gemiddelde duur van een verzoek.
Voorbeeld. 600 gebruikers die tegelijk actief zijn en elk om de 20 seconden een verzoek doen, geven 30 verzoeken per seconde. Duurt elk verzoek 100 ms, dan heeft de server gemiddeld maar 3 lopende verzoeken. De uitdaging ligt elders: in de pieken en in de trage verzoeken.
Een verzoek bezet de processor zolang het rekent: de code uitvoeren, de database bevragen, het antwoord opbouwen. Een vCPU verwerkt dus hooguit 1.000 ÷ t verzoeken per seconde, waarbij t de rekentijd van een verzoek in milliseconden is. De tijd die aan wachten opgaat (op een externe API, op een schijf) bezet de processor niet, maar wel een worker.
| Soort verzoek | Typische rekentijd | Per vCPU, orde van grootte |
|---|---|---|
| Statisch bestand, of pagina uit een cache | Minder dan 1 ms | Enkele duizenden verzoeken per seconde |
| WordPress-pagina geleverd door een paginacache | 1 tot 5 ms | Enkele honderden per seconde |
| JSON-API (Node.js, Go, FastAPI) met een geïndexeerde SQL-query | 5 tot 20 ms | 50 tot 200 per seconde |
| WordPress- of Laravel-pagina die bij elk bezoek wordt berekend | 100 tot 300 ms | 3 tot 10 per seconde |
| Rapport, export, pdf-generatie | 500 ms tot enkele seconden | Minder dan 2 per seconde |
Met deze ordes van grootte bezetten 30 API-verzoeken per seconde met 10 ms rekentijd 30% van één vCPU. Dezelfde 30 verzoeken per seconde op WordPress-pagina’s zonder cache vragen 3 tot 9 vCPU. Een paginacache dient precies om een pagina van de vierde regel van de tabel naar de tweede te brengen.
Elk lopend verzoek wordt afgehandeld door een worker, en workers nemen geheugen in, of ze nu werken of niet. Vaak is het eerder het geheugen dan de processor dat bepaalt hoeveel verzoeken parallel worden verwerkt:
pm.max_children legt het plafond vast: 20 processen, dat is 800 MB tot 1,6 GB.max_connections te verhogen.Persistente verbindingen (websockets, realtime meldingen) tellen apart: ze staan permanent open en gebruiken elk weinig processor en enkele tientallen kilobytes geheugen. Een Node.js-server houdt er duizenden vast in enkele honderden MB.
Bij een echte applicatie raakt de server zelden verzadigd waar u het verwacht. De meest voorkomende oorzaken, in de volgorde waarin u ze opspoort:
pg_stat_statements op PostgreSQL, of de slow query log van MySQL, wijst hem aan.De ordes van grootte geven een eerste formaat; een loadtest geeft het echte. Het principe: steeds meer gebruikers simuleren op een kopie van de applicatie, en het moment noteren waarop de responstijd wegloopt.
wrk -t2 -c50 -d30s --latency https://staging.uw-site.com/
Voor een volledig traject (inloggen, navigeren, zoeken) beschrijft k6 een scenario in JavaScript en voert het de belasting stap voor stap op:
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.uw-site.com/');
sleep(15);
}
htop voor de processor, free -h voor het geheugen, de logs voor de fouten.De volgorde die het minst kost en het meest oplevert:
De eerste drie stappen dekken de overgrote meerderheid van bedrijfsapplicaties, websites en API’s: enkele honderden gebruikers die tegelijk actief zijn, passen op één goed afgestelde server.
VPS Pro is er in zes formaten, op Intel Xeon-processors, ECC-geheugen en gespiegelde NVMe-SSD’s, en stapt op elk moment over naar een groter formaat, zonder herinstallatie. Full-Stack Support is inbegrepen: vertel ons hoeveel gebruikers u bij de lancering en over een jaar verwacht, en wij adviseren u over het formaat; en wanneer een pagina trager wordt, stellen wij de diagnose en vertellen u wat u moet doen, van het systeem tot de code van uw applicatie.
Voor een API of een applicatie waarvan de verzoeken 10 tot 20 ms rekentijd vragen, enkele honderden gebruikers die tegelijk actief zijn. Voor een WordPress-website zonder paginacache ongeveer honderd. Het verschil zit in de rekentijd van elk verzoek en in de cache, vandaar het nut van een loadtest.
Het aantal bezoekers per dag zegt weinig: wat telt, is de piek. Om van het ene naar het andere te gaan, deelt u de bezoeken van de dag door de actieve uren, vermenigvuldigt u met het aantal paginaweergaven per bezoek, en daarna met een piekfactor van 3 tot 5. 10.000 bezoeken over 10 uur, met elk 4 pagina’s, geven gemiddeld ongeveer 1 pagina per seconde, en 3 tot 5 op de piek.
Drie signalen: de responstijd stijgt met het verkeer, de processor blijft tijdens piekuren boven 80%, of het beschikbare geheugen zakt tot bijna nul. De logs van de webserver tonen dan 502- of 504-fouten, en de verzoeken wachten op een vrije worker.
Ja: een websocketverbinding blijft permanent open. Ze verbruikt weinig processor en enkele tientallen kilobytes geheugen. Een Node.js-server houdt er duizenden vast; het zijn de verzonden berichten, meer dan de open verbindingen, die de processor belasten.
Simafri
Laten we het over uw website hebben
Vertel ons in een paar woorden over uw project: wij nemen snel contact met u op.
Bedankt! Uw aanvraag is verzonden. We nemen spoedig contact met u op.
Liever per e-mail? Schrijf ons op support@simafri.com.