...

CPU-regulator på hosting-servere: Korrekt styring af ydeevnen

Hvis man ønsker, at hosting-serverne skal svare hurtigt og pålideligt, skal man indstille CPU-regulator bevidst og tester taktadfærden under reel belastning. Jeg prioriterer klar ydeevne, kontrollerer latenstiderne og tilpasser Frekvensskalering således, at web, database og PHP reagerer uden forsinkelse.

Centrale punkter

Inden jeg foretager konkrete indstillinger, opsummerer jeg kort de vigtigste justeringsmuligheder og rangordner dem efter deres nytteværdi i den daglige hostingdrift. På den måde får jeg et klart billede af, hvordan jeg kan afbalancere taktfrekvens, latenstid og effektivitet. Disse punkter giver mig en hurtig beslutningsstøtte til at opnå produktive servere. Jeg vurderer både de konkrete fakta og serverens adfærd under reelle adgangstoppe. Det sikrer konsekvent Gør arbejdsgangene mere effektive og sparer penge på lang sigt Tid.

  • ydeevne: Højeste klokfrekvens, meget lav latenstid ved belastningsspidser.
  • strømbesparelse: Lav frekvens, lavere strømforbrug ved sjælden belastning.
  • ondemand/schedutil: Dynamisk, skaleres alt efter belastningen.
  • Måling: Før-og-efter-sammenligning for reel indsigtsværdi.
  • Vedholdenhed: Sikre indstillingen via systemd eller startindstillingerne.

Jeg bruger denne liste som udgangspunkt og træffer derefter målrettede beslutninger for hver enkelt arbejdsopgave. På den måde øger jeg Reaktionshastighed og undgå omskifteligt Taktadfærd.

Hvad en CPU-regulator styrer på hosting-servere

En guvernør bestemmer, hvordan systemet skal CPU-frekvens afhænger af udnyttelsesgraden og af, hvor hurtigt kernerne øger klokfrekvensen. Jeg fokuserer her på tiden indtil den første klokfrekvensforøgelse, fordi den direkte påvirker Forsinkelse ved webforespørgsler. Ved mange korte forespørgsler giver hurtige frekvensskift konkrete fordele, mens sparsommelige strategier er mere velegnede til perioder med lav belastning. Linux styrer dette via CPU-frekvensskalering, der reagerer aggressivt eller forsigtigt afhængigt af governor. I sidste ende er det afgørende, at serveren starter hurtigt og konsekvent under reel belastning.

Forskelle mellem drivere og platforme: intel_pstate, amd_pstate, acpi_cpufreq

Valget af og virkningen af en governor afhænger i høj grad af den aktive driver. Moderne Intel-servere bruger ofte intel_pstate (HWP), de nyeste AMD-generationer amd_pstate; det klassiske forbliver acpi_cpufreq.

  • intel_pstate: Tilbyder som regel kun ydeevne og strømbesparelse. Finjusteringen foregår via Præference for energimæssig ydeevne (EPP). Værdier som ydeevne, balance_performance, balance_power og kraft påvirker, hvor aggressivt der boostes.
  • amd_pstate: En lignende logik som ved EPP/Energy-Policy, afhængigt af kerneversionen som vejledt eller aktiv Driftstilstand. Reagerer i praksis meget hurtigt på belastningsspidser.
  • acpi_cpufreq: Klassisk model med et bredt udvalg af regulatorer (f.eks. ondemand, konservativ, schedutil). Her påvirker Governor-effekten skalaen særligt direkte.

Derfor tjekker jeg først, hvilken driver der er indlæst (cpupower-frekvensoplysninger), og tilpasser forventningen til platformen. Hvor EPP finder anvendelse, angiver jeg desuden en “balance_performance”-præference for ydelsesmålet, hvis jeg ønsker et minimalt forbrug ved næsten identisk latenstid.

Hvilke tilstande der findes, og hvornår de er passende

De almindelige tilstande hedder ydeevne, strømbesparelse, ondemand, conservative og schedutil; Ubuntu, Red Hat og kerne-dokumentationen har beskrevet disse varianter i årevis. Ifølge Ubuntu Server Docs opretholder performance den højeste klokfrekvens og er klart rettet mod hastighed, mens Red Hat klassificerer powersave som en tilstand med maksimal energibesparelse og lavest ydeevne. Jeg bruger »performance« til webservere, stærkt belastede WordPress-instanser og API-tjenester, der kræver hurtige svartider. På maskiner, der sjældent bruges og har lang tomgangstid, er »powersave« en mulighed, hvis energiforbruget har høj prioritet. Dynamiske tilstande som »schedutil« udgør en mellemvej, men reagerer forskelligt hurtigt afhængigt af kernen og hardwaren.

Turbo, min./maks.-frekvenser og boost-grænser

Ud over guvernøren er turbomekanismer og frekvensbegrænsninger centrale justeringsparametre. Jeg fastsætter bevidst nedre og øvre grænser, så kernerne straks skifter op under belastning og ikke forbliver i for lave P-tilstande.

  • Min./maks. frekvenser: Hæv nedre grænse, så korte spidsbelastninger ikke opstår ved koldstart; kontroller den øvre grænse for at udelukke begrænsning.
  • Turbo/Boost: Aktiver normalt for lav latenstid; hold dog øje med de termiske og elektriske grænseværdier (PL1/PL2/EDP hos Intel, PPT/TDC/EDC hos AMD).

Typiske kommandoer til test (kan variere alt efter distribution):

# Vis aktuelt område og driver
cpupower frequency-info

Indstil #-regulatoren til ydeevne
cpupower frequency-set -g performance

Indstil min./maks. frekvens (eksempelværdier) for #
cpupower frequency-set -d 3,0 GHz
cpupower frequency-set -u 4,8 GHz

# Deaktiver/aktiver Intel Turbo (intel_pstate) midlertidigt
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo    # 1 = slået fra, 0 = slået til

# AMD Boost (afhængigt af kerne/platform)
echo 1 > /sys/devices/system/cpu/cpufreq/boost

Jeg ændrer disse parametre kun for at afprøve dem og måler straks derefter, om latenstiden og stabiliteten rent faktisk forbedres.

Praktisk vejledning: Kontrol og omskiftning af regulator

Jeg starter enhver optimering med at se på den aktuelt indstillede guvernør. Det kan gøres ved hjælp af cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor eller med cpupower-frekvensoplysninger, som desuden viser frekvensbånd og drivere. Til produktive webservere skifter jeg ofte til cpupower frequency-set -g performance til højtydende tilstand. Derefter kontrollerer jeg resultatet igen for at udelukke fejlkonfigurationer. Uden denne kontrol risikerer jeg inkonsekvenser Svartider, som kan undgås.

Automatiserede røgtests og regressionstests

Efter skiftet kører jeg korte, reproducerbare tests for hurtigt at opdage afvigelser. Jeg kombinerer mikrobenchmarks (enkelt slutpunkt, varm/kold cache) med korte stresstests og måler p50/p95/p99 for svarstiderne. Det er vigtigt, at testdataene og -ruterne er realistiske (f.eks. kasse i webshop, søgning, cache-miss ved startstien). Jeg gentager testkørslerne flere gange og udvælger resultaterne målrettet for at filtrere jitter fra netværk og lagring ud.

Målbart hurtigere: latenstid, taktshastighed og belastningsspidser

Inden overgangen registrerer jeg udgangsværdier for Forsinkelse, CPU-belastning, fejlprocent og energiforbrug, f.eks. ved hjælp af isolerede benchmarks og reelle adgangsprofiler. Derefter gentager jeg de samme tests med den samme datamængde, så jeg kan sammenligne ændringerne på en præcis måde. Jeg lægger særlig vægt på Spikes ved kortvarig, høj parallelitet, som den, der opstår ved kasseprocesser i webshops eller cache-fejl. Hvis der opstår begrænsninger i den forbindelse, undersøger jeg omgivelserne, for eksempel mulige CPU-drosling i delte miljøer. Først når målingen viser en klar fordel, tager jeg konfigurationen i brug på permanent basis.

Værktøjer og måleparametre: hvordan jeg gør effekter synlige

  • turbostat: Viser taktshastighed, C-tilstande, turbo-andel og energiforbrug pr. pakke/kerne. Ideelt til at kontrollere boost-reaktionstid og residency.
  • perf stat: Måler instruktioner pr. cyklus (IPC), kontekstskift og branch-miss – nyttigt til at identificere CPU-flaskehalse.
  • pidstat/iostat/vmstat: Tilføjer indsigt i processer, I/O-ventetider og systembelastning.
  • PSI (information om trykstop): Vurderer, om CPU-/IO-/hukommelsesbelastning forårsager forsinkelse – nyttigt som supplement til den rene betragtning af klokfrekvensen.
  • Server-målinger: p50/p95/p99-latenser pr. endpoint, fejlprocent, hastighed, mætning. Uden disse nøgletal forbliver ændringer af regulatorerne anekdotiske.

Jeg sammenholder taktkurver med latenstider på samme tidsakse. Hvis takten først stiger efter 20–50 ms, kan man som regel se det i p95. Målet er, at den første relevante worker-tråd allerede starter i en høj P-tilstand.

Sammenligningstabel: Governors i hosting-sammenhæng

Den følgende oversigt inddeler de gængse modes efter taktadfærd og egnethed til hosting. Jeg bruger den som en hurtig Beslutningsstøtte, men det erstatter ikke egne test under reelle Belastning.

guvernør Taktadfærd Egnethed til hosting Fordel Ulempe
ydeevne Maksimal, statisk højde Web, webshop, API, database Meget lav latenstid Højere forbrug
strømbesparelse Minimal, tøvende stigning Sjælden belastning, udvikling/test Mindre energi Nedsat ydeevne
ondemand Dynamisk, belastningsstyret Blandede arbejdsbelastninger Godt kompromis Reaktionstiden varierer
schedutil Baseret på en planlægningsfunktion Aktuelle kerner Finjustering Afhænger af hardwaren
konservativ Stiger langsomt Langrendsløber, Batch Jævn skalering Træg ved spidser

Klassificeringen afspejler erfaringer fra produktive miljøer og stemmer overens med beskrivelserne i kerne- og distributionsdokumenter. Konkret hardware kan ændre adfærden, derfor tester jeg altid på stedet under typiske brugsforhold.

Arbejdsbelastningstyper: Web, webshop, database, API

Når det gælder WordPress, WooCommerce og headless-API’er, tæller hver eneste Millisekund indtil det første svar, og derfor giver en høj taktfrekvens som regel bedre ydeevne. Databaser drager fordel af, at single-thread-faser behandles hurtigt; de Taktfrekvens vigtigere end kerner kommer ofte tydeligere til udtryk end det rene antal kerner. Til batch- eller rapporteringsopgaver kan en dynamisk governor være tilstrækkelig, så længe ingen brugere venter. Kritiske er blandede arbejdsbelastninger med mange korte spidsbelastninger, f.eks. Cron, PHP-FPM og cache-fejl på samme tid. I sådanne scenarier giver en konsekvent ydeevnemodus mig den mest konstante responstid.

Detaljer pr. arbejdsbelastning: PHP-FPM, NGINX, DB-server

  • PHP-FPM: Mange korte, CPU-afhængige bursts. Jeg sørger for, at pm.max_børn og at antallet af processer passer til antallet af kerner, og at de første worker-processer ikke starter i Low-P-tilstand. Reuseport i NGINX hjælper med at fordele belastningen jævnt mellem kernerne.
  • NGINX/Apache: Accept-tråde bør fastgøres til kerner med lav udnyttelse; IRQ-balancering og affinitet forhindrer flaskehalse på de enkelte kerner. En høj grundfrekvens forkorter TLS-håndtryk og behandling af headere.
  • Databaser: Korte single-thread-faser (parse/plan/indeks-hits) drager stor fordel af boostet. Længere, parallelle scanninger er i højere grad afhængige af I/O og hukommelse; her er konsistens vigtigere end maksimal frekvens.

Jeg tester både varme og kolde stier: Cache-opvarmningen må ikke ende med at gå i “sneglefart”, blot fordi CPU’en forbliver i en strømbesparende tilstand.

NUMA, IRQ’er og trådaffinitet

Ud over governor-indstillingen er det topologien og fordelingen af interrupts, der bestemmer latenstiden. Jeg tilstræber korte veje: Web- og PHP-processer skal bruge hukommelse og IRQ’er fra den samme NUMA-node, som de kører i. Jeg kontrollerer IRQ-balanceringen regelmæssigt, især efter kernelopdateringer.

  • cpuset/affinity: Fastgør kritiske tjenester til kerngrupper, der ikke overskrives af storage- eller netværks-IRQ.
  • Isolering af planlæggeren: På systemer, hvor latenstiden er særligt kritisk, skal man isolere enkelte kerner (isolcpus/rcu_nocbs) og knytte hot-path-workere til dem.
  • GennemsigtighedMed htop eller ps -eo pid,psr,comm kan jeg se, om tråde “springer” over kerner og mister cache-lokalitet.

Virtualisering og udbyderstak

På virtuelle maskiner og containere afhænger taktadfærden desuden af hypervisor- og værtsindstillingerne, hvorfor jeg har Omgivelser tjekker altid med. Nogle udbydere låser frekvenserne fast, andre tillader fleksible boost eller prioriterer bestemte instanser. Hvis frekvensændringer i gæsten næsten ikke har nogen effekt, flytter jeg analysen over på værtsiden eller spørger specifikt om begrænsninger. På dedikerede servere har jeg større kontrol, men jeg skal konfigurere BIOS/UEFI- og kerne-drivere korrekt. Tydelig gennemsigtighed i denne kæde forhindrer fejltolkninger ved Måling.

Containere, Cgroups v2 og Kubernetes

I containere er det især Cgroups v2, der bestemmer, hvordan CPU'en skaleres. Jeg lægger mærke til:

  • CPU.max/Quota: For snævre båndbreddeallokeringer forårsager begrænsninger og jitter – hvilket kan ses ved forhøjede p99-værdier og nr_throttled-tæller.
  • CPU.shares: Definerer relativ prioritet. Kritiske tjenester tildeles højere andele, så de prioriteres i tilfælde af konkurrence om båndbredden.
  • cpuset: For at opnå stabil latenstid tildeler jeg containere til sammenhængende kerner på samme NUMA-node.
  • Interaktion med planlægningsprogrammet: schedutil kan i kombination med stærkt svingende containerbelastning virke træg; på værtsniveau stabiliserer “performance” infrastrukturen.

Jeg tester altid først, hvordan regulatoren virker på værten. Hvis containeren alligevel svinger, ligger årsagen ofte i kvoter eller oversubscription, ikke i regulatoren.

BIOS/UEFI, C-tilstande og strømindstillinger

Grundindstillingerne bestemmer, hvor hurtigt boosts aktiveres. Jeg tjekker BIOS-/UEFI-indstillingerne:

  • C-tilstande: For dybe søvntilstande øger opvågningslatensen. På latenssystemer begrænser jeg dybe C-tilstande eller aktiverer Latens-tolerance-Indstillinger, hvis de er tilgængelige.
  • Turbo/Boost: Det skal være tilladt, ellers går enhver optimering af guvernøren til spilde.
  • Effektbegrænsninger: Indstil PL1/PL2 (Intel) henholdsvis PPT/TDC/EDC (AMD) realistisk, så korte bursts ikke straks når grænsen.
  • SMT/Hyper-Threading: Øger gennemstrømningen, men kan opdele latenstier. For strengt deterministiske tjenester fordeler jeg kritiske tråde på fysiske kerner.

Jeg observerer samspillet med EPP/Energy-Policy: Også når det gælder “performance”, kan en for konservativ EPP mindske aggressiviteten. Det optimale punkt er ofte “balance_performance” med aktiv turbo og begrænsede dyb søvntilstande.

At finde den rette balance mellem ydeevne og effektivitet

Jeg betragter ydelse og energi som en helhed i stedet for at sætte dem op mod hinanden, og tilpasser Strategi til belastningsprofilen. Hvis reaktionstiden er det vigtigste, vælger jeg »performance« og udligner forbruget ved hjælp af natlige opgaver eller caching. Hvis fokus i højere grad ligger på økonomi, dokumenterer jeg forskellen og undersøger, hvordan jeg kan Effektivt strømforbrug sænke, uden at forringe responstiderne. For aggressive strømbesparelsestilstande medfører ofte svingende tidslinjer, hvilket brugerne mærker, og som kan koste omsætning. En velovervejet, datadrevet afvejning giver den bedste samlede effekt.

Implementering, vedvarende virkning og plan for tilbagefald

Jeg implementerer ændringer trinvist: først på enkelte servere med telemetri, derefter på en lille gruppe og først derefter bredt. På den måde kan jeg tidligt opdage bivirkninger. Ud over systemd sørger jeg for, at ændringerne hurtigt kan rulles tilbage, hvis der opstår jitter eller varmeproblemer.

  • Trinvis implementering: Marker Canary-hosts og overvåg dem nøje (latens, fejlprocent, CPU-temperatur, turbo-andel).
  • Konfigurationsstyring: Ensartede skabeloner til Governor, min./maks. frekvens, EPP og eventuelt C-tilstande; ændringer skal versioneres.
  • Rollback: En kommando eller et playbook, der straks gendanner den tidligere tilstand.

Permanent konfiguration med systemd

Efter testen stabiliserer jeg Indstilling ved genstart, ellers vender systemet tilbage til standardindstillingerne. Det gør jeg f.eks. via en systemd-enhed, der ved opstart cpupower frequency-set -g performance eller via passende kernel-/UEFI-indstillinger. Derudover dokumenterer jeg fremgangsmåden i konfigurationsstyringen, så ændringerne forbliver sporbare. Afhængigt af distributionen findes der egne profiler, som jeg tjekker og tilpasser efter behov. På den måde forbliver klokfrekvensprofilen konsistent, og der undgås uventede problemer efter genstart.

[Unit]
Description=Indstilling af CPU-regulator
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower frequency-set -g performance
ExecStart=/usr/bin/sh -c 'echo balance_performance > /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference || true'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

EPP-linjen virker kun, hvis platformen understøtter den. Jeg har bevidst valgt at gøre enheden idempotent og logger ændringer, så revisioner senere kan spores tydeligt.

Kort opsummeret

Jeg kontrollerer CPU-frekvensen er aktiv, fordi lav latenstid og forudsigelig adfærd er afgørende inden for hosting. Performance-tilstanden giver det hurtigste svar og betaler sig i forbindelse med web, webshop og API’er, mens strømbesparende tilstande er velegnede til systemer, der kun bruges sjældent. Valget af governor rammer først plet med måledata, derfor tester jeg før og efter hver ændring. Permanente opsætninger via systemd sikrer effekten og forhindrer tilbagefald. Således bliver CPU-governoren en lille, men effektiv skrue til konstant Ydeevne i den daglige drift.

Aktuelle artikler