Allt börjar med en fråga: vad gör de här användarna? Tusen personer som är inloggade i en applikation gör inte tusen förfrågningar per sekund, och en sida som levereras från en cache kostar hundra gånger mindre än en sida som beräknas. Den här guiden översätter användare till förfrågningar, förfrågningar till processor och minne, och visar sedan hur du kontrollerar resultatet med ett belastningstest.
”Samtidiga användare” betyder tre olika storheter beroende på vem som talar:
Man går från den ena till den andra med Littles lag: antalet pågående förfrågningar är lika med genomströmningen, i förfrågningar per sekund, multiplicerad med en förfrågans genomsnittliga längd.
Exempel. 600 användare som är aktiva samtidigt, och som var och en utlöser en förfrågan var 20:e sekund, ger 30 förfrågningar per sekund. Om varje förfrågan tar 100 ms har servern i genomsnitt bara 3 pågående förfrågningar. Utmaningen ligger någon annanstans: i topparna och i de långsamma förfrågningarna.
En förfrågan upptar processorn under sin beräkning: köra koden, fråga databasen, bygga svaret. En vCPU hanterar därför högst 1 000 ÷ t förfrågningar per sekund, där t är en förfrågans beräkningstid i millisekunder. Tid som går åt till att vänta (på ett externt API, på en disk) upptar inte processorn, men den upptar en worker.
| Typ av förfrågan | Typisk beräkningstid | Per vCPU, storleksordning |
|---|---|---|
| Statisk fil, eller sida från en cache | Under 1 ms | Flera tusen förfrågningar per sekund |
| WordPress-sida från en sidcache | 1 till 5 ms | Flera hundra per sekund |
| JSON-API (Node.js, Go, FastAPI) med en indexerad SQL-fråga | 5 till 20 ms | 50 till 200 per sekund |
| WordPress- eller Laravel-sida som beräknas vid varje besök | 100 till 300 ms | 3 till 10 per sekund |
| Rapport, export, generering av PDF | 500 ms till flera sekunder | Färre än 2 per sekund |
Med de här storleksordningarna upptar 30 API-förfrågningar per sekund med 10 ms beräkning 30 % av en enda vCPU. Samma 30 förfrågningar per sekund mot WordPress-sidor utan cache kräver 3 till 9 vCPU. Sidcachen finns just för att flytta en sida från tabellens fjärde rad till den andra.
Varje pågående förfrågan hanteras av en worker, och workers tar minne, oavsett om de arbetar eller inte. Det är ofta minnet, mer än processorn, som bestämmer hur många förfrågningar som hanteras parallellt:
pm.max_children sätter taket: 20 processer blir 800 MB till 1,6 GB.max_connections.Beständiga anslutningar (websockets, aviseringar i realtid) räknas för sig: de är öppna hela tiden, tar lite processor och några tiotals kilobyte minne var. En Node.js-server håller tusentals av dem inom några hundra MB.
I en verklig applikation blir servern sällan överbelastad där man väntar sig. De vanligaste orsakerna, i den ordning du bör leta efter dem:
pg_stat_statements i PostgreSQL, eller MySQL:s logg över långsamma frågor, pekar ut den.Storleksordningarna ger en första storlek; ett belastningstest ger den verkliga. Principen: simulera allt fler användare mot en kopia av applikationen och notera när svarstiden rusar iväg.
wrk -t2 -c50 -d30s --latency https://test.din-webbplats.com/
För ett helt flöde (inloggning, navigering, sökning) beskriver k6 ett scenario i JavaScript och ökar belastningen i steg:
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://test.din-webbplats.com/');
sleep(15);
}
htop för processorn, free -h för minnet, loggarna för felen.Den ordning som kostar minst och ger mest:
De tre första stegen räcker för det stora flertalet affärsapplikationer, webbplatser och API:er: flera hundra användare som är aktiva samtidigt ryms på en enda välinställd server.
VPS Pro finns i sex storlekar, på Intel Xeon-processorer, ECC-minne och speglade NVMe-SSD, och byter till en större storlek när som helst, utan ominstallation. Heltäckande support ingår: berätta hur många användare du väntar dig vid lanseringen och om ett år, så rekommenderar vi storleken; och när en sida blir långsam ställer vi diagnosen och talar om vad du ska göra, från systemet ända in i koden i din applikation.
För ett API eller en applikation vars förfrågningar tar 10 till 20 ms beräkning, flera hundra användare som är aktiva samtidigt. För en WordPress-webbplats utan sidcache, ungefär hundra. Skillnaden beror på varje förfrågans beräkningstid och på cachen, därav värdet av ett belastningstest.
Antalet besökare per dag säger inte mycket: det som räknas är toppen. För att gå från det ena till det andra delar du dagens besök med antalet aktiva timmar, multiplicerar med antalet sidvisningar per besök och sedan med en toppfaktor på 3 till 5. 10 000 besök under 10 timmar, med 4 sidor vardera, ger omkring 1 sida per sekund i genomsnitt, och 3 till 5 vid toppen.
Tre tecken: svarstiden stiger med trafiken, processorn ligger över 80 % vid rusningstid, eller det tillgängliga minnet sjunker nära noll. Webbserverns loggar visar då 502- eller 504-fel, och förfrågningarna väntar på en ledig worker.
Ja: en websocket-anslutning är öppen hela tiden. Den förbrukar lite processor och några tiotals kilobyte minne. En Node.js-server håller tusentals av dem; det är meddelandena som skickas, mer än de öppna anslutningarna, som belastar processorn.
Simafri
Låt oss prata om din webbplats
Berätta om ditt projekt med några ord: vi återkommer snabbt.
Tack! Din förfrågan har skickats. Vi återkommer till dig inom kort.
Föredrar du e-post? Skriv till oss på support@simafri.com.