Wer Hosting-Server zügig und verlässlich antworten lassen will, steuert den CPU Governor bewusst und prüft das Taktverhalten unter realer Last. Ich priorisiere klare Leistung, kontrolliere Latenzen und passe die Frequenzskalierung so an, dass Web, Datenbank und PHP ohne Verzögerung reagieren.
Zentrale Punkte
Bevor ich konkrete Einstellungen setze, fasse ich die wichtigsten Stellhebel kurz zusammen und ordne sie nach Nutzen im Hosting-Alltag ein. So entsteht ein klares Bild, wie ich Takt, Latenz und Effizienz zusammenführe. Diese Punkte geben mir eine schnelle Entscheidungshilfe für produktive Server. Ich bewerte dabei sowohl harte Fakten als auch das Verhalten bei echten Zugriffsspitzen. Das sorgt für konsistente Abläufe und spart langfristig Zeit.
- performance: Höchster Takt, sehr geringe Latenz bei Lastspitzen.
- powersave: Niedriger Takt, geringerer Verbrauch bei seltener Last.
- ondemand/schedutil: Dynamisch, skaliert je nach Auslastung.
- Messung: Vorher/Nachher-Vergleich für echte Aussagekraft.
- Persistenz: Setzung per systemd oder Boot-Optionen sichern.
Ich nutze diese Liste als Startpunkt und entscheide danach gezielt pro Workload. So erhöhe ich die Reaktionsgeschwindigkeit und vermeide wechselhaftes Taktverhalten.
Was ein CPU Governor auf Hosting-Servern steuert
Ein Governor bestimmt, wie das System die CPU-Frequenz an die Auslastung koppelt und wie schnell Kerne hochtakten. Ich fokussiere mich dabei auf die Zeit bis zum ersten Taktboost, weil sie direkt die Latenz bei Webrequests prägt. Bei vielen kurzen Requests bringen schnelle Taktwechsel handfeste Vorteile, während sparsame Strategien eher für Leerlaufphasen taugen. Linux regelt das über die CPU-Frequenzskalierung, die je nach Governor aggressiv oder vorsichtig reagiert. Entscheidend ist am Ende, dass der Server unter realer Last konsistent schnell anspringt.
Treiber und Plattformunterschiede: intel_pstate, amd_pstate, acpi_cpufreq
Die Wahl und Wirkung eines Governors hängt stark vom aktiven Treiber ab. Moderne Intel-Server nutzen häufig intel_pstate (HWP), aktuelle AMD-Generationen amd_pstate; klassisch bleibt acpi_cpufreq.
- intel_pstate: Bietet meist nur performance und powersave. Feintuning läuft über die Energy Performance Preference (EPP). Werte wie performance, balance_performance, balance_power und power beeinflussen, wie aggressiv geboostet wird.
- amd_pstate: Vergleichbare Logik mit EPP/Energy-Policy, je nach Kernel-Version als guided oder active Modus. Reagiert in der Praxis sehr flott auf Lastspitzen.
- acpi_cpufreq: Klassisches Modell mit breiter Governor-Auswahl (z. B. ondemand, conservative, schedutil). Hier wirkt der Governor besonders direkt auf die Skala.
Ich prüfe daher zuerst, welcher Treiber geladen ist (cpupower frequency-info), und passe die Erwartung an die Plattform an. Wo EPP greift, setze ich beim Performance-Ziel zusätzlich eine “balance_performance”-Präferenz, wenn ich minimalen Verbrauch bei nahezu identischer Latenz möchte.
Welche Modi es gibt und wann sie passen
Die gängigen Modi heißen performance, powersave, ondemand, conservative und schedutil; Ubuntu, Red Hat und die Kernel-Dokumentation beschreiben diese Varianten seit Jahren. Laut Ubuntu Server Docs hält performance den höchsten Takt und zielt klar auf Geschwindigkeit, während Red Hat powersave als Modus mit maximaler Energieersparnis und geringster Leistung einordnet. Ich setze performance für Webserver, stark frequentierte WordPress-Instanzen und API-Dienste, die schnelle Antwortzeiten fordern. Bei selten genutzten Maschinen mit hohem Leerlauf ist powersave eine Option, wenn Energie Priorität hat. Dynamische Modi wie schedutil liefern einen Mittelweg, reagieren aber je nach Kernel und Hardware unterschiedlich flink.
Turbo, Min-/Max-Frequenzen und Boost-Grenzen
Neben dem Governor sind Turbo-Mechanismen und Frequenzlimits zentrale Stellschrauben. Ich definiere bewusst Unter- und Obergrenzen, damit Kerne unter Last sofort hochschalten und nicht in zu niedrigen P-States verharren.
- Min-/Max-Frequenzen: Untergrenze anheben, damit Short-Bursts nicht vom Kaltstart kommen; Obergrenze prüfen, um Drosselung auszuschließen.
- Turbo/Boost: Für niedrige Latenz in der Regel aktivieren; dabei thermische und elektrische Limits im Blick behalten (PL1/PL2/EDP bei Intel, PPT/TDC/EDC bei AMD).
Typische Kommandos für Tests (Distributionen können abweichen):
# aktuellen Bereich und Treiber anzeigen
cpupower frequency-info
# Governor auf Performance
cpupower frequency-set -g performance
# Min-/Max-Frequenz (Beispielwerte) setzen
cpupower frequency-set -d 3.0GHz
cpupower frequency-set -u 4.8GHz
# Intel Turbo (intel_pstate) temporär deaktivieren/aktivieren
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo # 1 = aus, 0 = an
# AMD Boost (je nach Kernel/Plattform)
echo 1 > /sys/devices/system/cpu/cpufreq/boost
Ich ändere diese Parameter nur testweise und messe unmittelbar danach, ob sich Latenz und Stabilität tatsächlich verbessern.
Praxisleitfaden: Governor prüfen und umschalten
Ich starte jede Optimierung mit einem Blick auf den aktuell gesetzten Governor. Das gelingt per cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor oder mit cpupower frequency-info, das zusätzlich Frequenzspannen und Treiber zeigt. Für produktive Webserver schalte ich häufig mit cpupower frequency-set -g performance auf den Hochleistungsmodus. Anschließend verifiziere ich das Ergebnis erneut, um Fehlkonfigurationen auszuschließen. Ohne diese Kontrolle riskiere ich inkonsistente Antwortzeiten, die vermeidbar sind.
Automatisierte Smoke- und Regressions-Tests
Nach dem Umschalten lasse ich kurze, reproduzierbare Tests laufen, um Ausreißer schnell zu erkennen. Ich kombiniere Microbenchmarks (einzelner Endpunkt, warmer/kalter Cache) mit kurzen Stresstests und messe p50/p95/p99 der Antwortzeiten. Wichtig ist, dass die Testdaten und -routen realitätsnah sind (z. B. Shop-Checkout, Suche, Cache-Miss beim Startpfad). Ich wiederhole die Läufe mehrfach und mitt(e)le gezielt, um Jitter von Netz und Storage auszufiltern.
Messbar schneller: Latenz, Takt und Lastspitzen
Vor der Umstellung erfasse ich Ausgangswerte für Latenz, CPU-Last, Fehlerquote und Energieaufnahme, etwa mit abgetrennten Benchmarks und echten Zugriffsprofilen. Danach wiederhole ich dieselben Tests mit identischer Datenbasis, damit ich Veränderungen sauber vergleichen kann. Ein besonderes Augenmerk lege ich auf Spikes bei kurzer, hoher Parallelität, wie sie bei Shop-Checkouts oder Cache-Misses auftreten. Tritt dabei Drosselung auf, prüfe ich das Umfeld, beispielsweise mögliches CPU Throttling in geteilten Umgebungen. Erst wenn die Messung klaren Nutzen zeigt, übernehme ich die Konfiguration dauerhaft.
Werkzeuge und Metriken: wie ich Effekte sichtbar mache
- turbostat: Zeigt pro Paket/Kern Takt, C-States, Turbo-Anteil und Energie. Ideal, um Boost-Reaktionszeit und Residency zu prüfen.
- perf stat: Misst Instruktionen/Zyklus (IPC), Kontextwechsel und Branch-Miss – gut, um CPU-Bottlenecks einzuordnen.
- pidstat/iostat/vmstat: Ergänzen Sicht auf Prozesse, I/O-Wartezeiten und Systemdruck.
- PSI (Pressure Stall Information): Bewertet, ob CPU/IO/Memory-Pressure Latenz erzeugt – hilfreich neben der reinen Taktbetrachtung.
- Server-Metriken: p50/p95/p99 Latenzen je Endpoint, Fehlerquote, Rate, Sättigung. Ohne diese Kenngrößen bleiben Governor-Änderungen anekdotisch.
Ich korreliere Taktkurven mit Latenzen in derselben Zeitachse. Springt der Takt erst nach 20–50 ms hoch, sieht man das meist in der p95. Ziel ist, dass der erste relevante Worker-Thread bereits im hohen P-State startet.
Vergleichstabelle: Governors im Hosting-Einsatz
Die folgende Übersicht ordnet die gängigen Modi nach Taktverhalten und Hosting-Eignung ein. Ich nutze sie als schnelle Entscheidungshilfe, ersetze damit aber keine eigenen Tests unter realer Last.
| Governor | Taktverhalten | Eignung Hosting | Vorteil | Nachteil |
|---|---|---|---|---|
| performance | Maximal, statisch hoch | Web, Shop, API, DB | Sehr geringe Latenz | Höherer Verbrauch |
| powersave | Minimal, zögerlich hoch | Seltene Last, Dev/Test | Weniger Energie | Reduzierte Performance |
| ondemand | Dynamisch, lastgesteuert | Gemischte Workloads | Guter Kompromiss | Reaktionszeit variiert |
| schedutil | Scheduler-basiert | Aktuelle Kernel | Feinkörnige Regelung | Hardwareabhängig |
| conservative | Langsam steigend | Langläufer, Batch | Sanfte Skalierung | Träge bei Spikes |
Die Einordnung spiegelt Erfahrungen aus produktiven Setups wider und deckt sich mit Beschreibungen in Kernel- und Distributionsdokumenten. Konkrete Hardware kann das Verhalten verändern, daher prüfe ich stets vor Ort unter typischer Nutzung.
Workload-Typen: Web, Shop, Datenbank, API
Bei WordPress, WooCommerce und Headless-APIs zählt jede Millisekunde bis zur ersten Antwort, daher performt ein hoher Takt meist besser. Datenbanken profitieren, wenn Single-Thread-Phasen schnell abgearbeitet werden; die Taktrate wichtiger als Kerne zeigt sich oft deutlicher als reine Kernanzahl. Für Batch- oder Reporting-Jobs kann ein dynamischer Governor reichen, solange keine Nutzer warten. Kritisch sind gemischte Workloads mit vielen kurzen Spitzen, etwa Cron, PHP-FPM und Cache-Misses zeitgleich. In solchen Szenarien verschafft mir ein konsequenter performance-Modus die konstanteste Reaktionszeit.
Details je Workload: PHP-FPM, NGINX, DB-Server
- PHP-FPM: Viele kurze, CPU-gebundene Bursts. Ich stelle sicher, dass pm.max_children und Prozessanzahl zur Kernzahl passen und die ersten Worker nicht im Low-P-State starten. Reuseport bei NGINX hilft, Last gleichmäßig über Kerne zu verteilen.
- NGINX/Apache: Accept-Threads sollten auf wenig ausgelastete Kerne pinnen; IRQ-Balancing und Affinity verhindern Staus auf einzelnen Cores. Ein hoher Grundtakt verkürzt TLS-Handshakes und Header-Verarbeitung.
- Datenbanken: Kurze Single-Thread-Phasen (Parse/Plan/Index-Hits) profitieren stark vom Boost. Längere, parallele Scans hängen stärker an I/O und Speicher, hier ist Konsistenz wichtiger als Maximalfrequenz.
Ich teste sowohl Warm- als auch Kaltpfade: Cache-Warmup darf nicht zum “Schneckengang” verkommen, nur weil die CPU in einem Sparzustand verharrt.
NUMA, IRQs und Thread-Affinität
Neben dem Governor bestimmen Topologie und Interrupt-Verteilung die Latenz. Ich strebe kurze Wege an: Web- und PHP-Prozesse sollen Speicher und IRQs aus demselben NUMA-Knoten nutzen, in dem sie rechnen. IRQ-Balancing prüfe ich regelmäßig, insbesondere nach Kernel-Updates.
- cpuset/affinity: Kritische Dienste auf Kerngruppen pinnen, die nicht vom Storage- oder Netz-IRQ überfahren werden.
- Scheduler-Isolation: Auf besonders latenzkritischen Systemen einzelne Kerne isolieren (isolcpus/rcu_nocbs) und dort Hot-Path-Worker anheften.
- Transparenz: Mit htop oder ps -eo pid,psr,comm sehe ich, ob Threads über Kerne “springen” und Cache-Lokalität verlieren.
Virtualisierung und Provider-Stack
Auf VMs und Containern hängt das Taktverhalten zusätzlich von Hypervisor- und Host-Settings ab, weshalb ich die Umgebung immer mitprüfe. Manche Provider pinnen Frequenzen, andere erlauben flexible Boosts oder priorisieren bestimmte Instanzen. Wenn Taktwechsel im Gast kaum Wirkung zeigen, verlagere ich die Analyse auf Host-Seite oder frage gezielt nach Limits. Bei dedizierten Servern erhalte ich mehr Kontrolle, muss aber BIOS/UEFI- und Kernel-Treiber sauber konfigurieren. Klare Transparenz über diese Kette verhindert Fehlinterpretationen bei der Messung.
Container, Cgroups v2 und Kubernetes
In Containern bestimmt Cgroups v2 maßgeblich, wie die CPU skaliert. Ich achte auf:
- CPU.max/Quota: Zu enge Quoten verursachen Throttling und Jitter – erkennbar über erhöhte p99 und nr_throttled-Zähler.
- CPU.shares: Definiert relative Priorität. Kritische Services erhalten höhere Shares, damit sie bei Contention bevorzugt werden.
- cpuset: Für stabile Latenz pinne ich Container auf zusammenhängende Kerne desselben NUMA-Nodes.
- Scheduler-Interaktion: schedutil kann in Kombination mit stark schwankender Container-Last träge wirken; auf Hostebene “performance” stabilisiert den Unterbau.
Ich teste immer zuerst auf dem Host die Wirkung des Governors. Wenn der Container dennoch schwankt, liegt die Ursache oft in Quotas oder Oversubscription, nicht im Governor.
BIOS/UEFI, C-States und Energiepräferenzen
Der Unterbau entscheidet, wie flink Boosts gezündet werden. Ich prüfe BIOS-/UEFI-Optionen:
- C-States: Zu tiefe Schlafzustände erhöhen die Aufwachlatenz. Auf Latenzsystemen begrenze ich tiefe C-States oder aktiviere Latency Tolerance-Optionen, wenn verfügbar.
- Turbo/Boost: Muss erlaubt sein, sonst verpufft jede Governor-Optimierung.
- Power Limits: PL1/PL2 (Intel) bzw. PPT/TDC/EDC (AMD) realistisch setzen, damit kurze Bursts nicht sofort am Limit anstehen.
- SMT/Hyper-Threading: Bringt Durchsatz, kann aber Latenz-Pfade teilen. Für streng deterministische Services trenne ich kritische Threads auf echte Kerne.
Ich beobachte die Wechselwirkung mit EPP/Energy-Policy: Auch bei “performance” kann eine zu konservative EPP die Aggressivität mindern. Der Sweet Spot ist häufig “balance_performance” bei aktivem Turbo und begrenzten Tiefschlafzuständen.
Leistung und Effizienz ausbalancieren
Ich betrachte Leistung und Energie gemeinsam, statt sie gegeneinander auszuspielen, und passe die Strategie an das Lastprofil an. Steht Reaktionszeit an erster Stelle, wähle ich performance und gleiche den Verbrauch über Nachtjobs oder Caching aus. Liegt der Fokus stärker auf Ökonomie, dokumentiere ich das Delta und prüfe, wie ich den Stromverbrauch effizient senke, ohne Antwortzeiten zu verschlechtern. Zu aggressive Sparmodi verursachen häufig schwankende Zeitleisten, was Nutzer spüren und Umsätze kosten kann. Eine saubere, datenbasierte Abwägung bringt die bessere Gesamtwirkung.
Rollout, Persistenz und Rückfallplan
Ich rolle Änderungen stufenweise aus: erst Einzelserver mit Telemetrie, dann eine kleine Gruppe, erst danach breit. So erkenne ich früh Seiteneffekte. Neben systemd sorge ich für schnelle Rücknahme, falls Jitter oder Hitzeprobleme auftreten.
- Staged Rollout: Canary-Hosts markieren und eng überwachen (Latenz, Fehlerquote, CPU-Temperatur, Turbo-Anteil).
- Konfigurationsmanagement: Einheitliche Templates für Governor, Min-/Max-Frequenz, EPP und ggf. C-States; Änderungen versionieren.
- Rollback: Ein Kommando oder Playbook, das den vorherigen Zustand sofort wiederherstellt.
Persistente Konfiguration mit systemd
Nach dem Test stabilisiere ich die Einstellung für Neustarts, sonst fällt das System zurück auf Standard. Das erledige ich etwa über eine systemd-Unit, die beim Boot cpupower frequency-set -g performance setzt, oder über geeignete Kernel-/UEFI-Optionen. Zusätzlich dokumentiere ich das Vorgehen im Konfigurationsmanagement, damit Änderungen nachvollziehbar bleiben. Je nach Distribution existieren eigene Profile, die ich prüfe und bei Bedarf anpasse. So bleibt das Taktprofil konsistent und Überraschungen nach Reboots bleiben aus.
[Unit]
Description=CPU Governor setzen
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
Die EPP-Zeile greift nur, wenn die Plattform sie unterstützt. Ich halte die Unit bewusst idempotent und logge Änderungen, damit Audits später klar nachvollziehbar sind.
Kurz zusammengefasst
Ich steuere die CPU-Frequenz aktiv, weil geringe Latenz und vorhersehbares Verhalten im Hosting entscheidend sind. Performance liefert die schnellste Antwort und zahlt sich bei Web, Shop und APIs aus, während sparsame Modi bei selten genutzten Systemen taugen. Die Wahl des Governors trifft erst mit Messdaten ins Schwarze, daher teste ich vor und nach jeder Änderung. Persistente Setups über systemd sichern die Wirkung und verhindern Rückfälle. So wird der CPU Governor zu einer kleinen, aber wirkungsvollen Schraube für konstante Performance im Tagesbetrieb.


