A Noyau sans tick réduit les réveils inutiles du CPU et diminue ainsi activement la consommation d'énergie de ton serveur, sans perdre sa réactivité en charge. Je vais te montrer étape par étape comment Noyau configurer, lire les mesures et planifier les charges de travail de manière à ce que les performances et les coûts d'énergie soient sensiblement équilibrés.
Points centraux
Les points suivants esquissent les principaux gestes et contextes.
- Tickless Timer : Interruptions à la demande au lieu de ticks périodiques
- Énergie économiser de l'argent : Maintenir plus longtemps les C-States profonds, réduire les wakeups
- NO_HZ Options : Utiliser CONFIG_NO_HZ_IDLE et CONFIG_NO_HZ_FULL
- planificateur Peaufiner : regrouper la charge, définir l'affinité d'interruption
- Suivi d'abord : mesure avant/après pour des effets clairs
Le mode sans tickless en bref
Un système d'exploitation Linux classiqueNoyau réveille chaque CPU à intervalles fixes, souvent 100 à 1000 fois par seconde. Cela coûte de manière mesurable Énergie, même si aucune tâche n'est en cours. Le Tickless Mode remplace cette périodicité par des interruptions à la demande du timer. Le CPU reste ainsi plus longtemps dans un état de sommeil profond jusqu'à ce qu'un événement se produise réellement. Selon [1], c'est précisément ce comportement qui augmente l'efficacité, car les réveils inutiles sont supprimés et la thermique diminue. J'utilise Tickless lorsque les systèmes sont soumis à de fortes variations de charge et qu'ils doivent passer proprement de l'activité au repos.
Pourquoi Tickless augmente l'efficacité énergétique
Lorsqu'une unité centrale reste inactive, les ticks rigides empêchaient auparavant les basses fréquences. États C et réveillaient constamment les noyaux. Cela a généré plus de Chaleur résiduelle et forçait les ventilateurs à tourner plus vite. Tickless élimine ce réveil permanent et prolonge les phases de repos. J'observe une diminution de la consommation d'énergie au repos et des courbes de température plus lisses sur les hôtes web et API dont la charge est fluctuante. Dans les grandes fermes de serveurs, de petites économies par nœud s'ajoutent à des montants en euros sensibles sur la facture d'électricité. La plateforme reste plus calme et les pics de charge peuvent être amortis de manière plus fiable.
Aperçu des modes et des options du noyau
Je distingue deux approches principales : Tickless Idle et Tickless Full. Tickless Idle met en pause la périodicité tant qu'il n'y a pas de tâches à effectuer et joue ses Force en particulier pendant les phases d'inactivité. Tickless Full (NO_HZ_FULL) réduit les ticks pour des noyaux sélectionnés, même en fonctionnement, ce qui peut comprimer les latences et réduire les changements de contexte. Les distributions modernes activent souvent NO_HZ_IDLE par défaut, alors que NO_HZ_FULL nécessite un réglage ciblé. Notez que les modes avancés nécessitent un réglage fin de l'affinité avec les interruptions et de l'isolation pour que les Avantages ne s'évaporent pas à cause de réveils aléatoires.
| Mode/option | Effet | Convient pour | Remarques |
|---|---|---|---|
| CONFIG_NO_HZ_IDLE | Suspendre les ticks en mode inactif | Charge générale du serveur avec des phases d'inactivité | Souvent activée par défaut, faible Risques |
| CONFIG_NO_HZ_FULL | Minimiser les ticks par noyau en fonctionnement | Low-Latency, HPC, noyaux sélectionnés | Isolation du noyau et affinité IRQ propres planifier |
| isolcpus, rcu_nocbs | Noyaux à faible interférence, moins de réveils RCU | Charges de travail en temps réel | Seuls quelques noyaux isolent, le reste porte charge du système |
| Noyau ≥ LTS actuel | Nouvelles voies d'économie d'énergie, corrections | Tous les systèmes productifs | Fixes et gains d'efficacité selon [1] utiliser |
Étape par étape : Définir les paramètres du noyau et de démarrage
Je commence par faire l'inventaire des capacités du noyau. Tu peux savoir si le noyau supporte Tickless en regardant les drapeaux de configuration :
grep NO_HZ /boot/config-$(uname -r)
grep HIGH_RES_TIMERS /boot/config-$(uname -r)
grep -E 'CPU_IDLE|INTEL_IDLE' /boot/config-$(uname -r)
Pour NO_HZ_IDLE, le noyau de distribution est généralement suffisant. Pour NO_HZ_FULL, je définis de manière ciblée des CPU housekeeping qui se chargent des tâches système, des IRQ et des callbacks RCU. Typiquement, je laisse le CPU 0-1 comme housekeeping et je place les autres noyaux en mode DyTick :
# Exemple de GRUB-CMDLINE (à adapter au matériel) :
GRUB_CMDLINE_LINUX="nohz_full=2-15 isolcpus=2-15 rcu_nocbs=2-15 irqaffinity=0-1 nmi_watchdog=0"
Important : au moins un noyau doit rester housekeeping, sinon il y a un risque de RCU stall. Après la mise à jour de la config GRUB et le redémarrage, je vérifie les paramètres actifs :
cat /sys/devices/system/cpu/nohz_full # liste les CPU NO_HZ_FULL
cat /sys/devices/system/cpu/isolated # liste les CPUs isolés
cat /proc/cmdline # vérifie les paramètres de démarrage
En outre, j'active les minuteries haute résolution et les pilotes spécifiques à idle (par exemple intel_idle). Ces deux éléments améliorent la finesse des timers et la profondeur des états de sommeil. Ceux qui utilisent irqbalance configurent des cœurs bloqués pour que l'affinité ne se déplace pas à nouveau sur des CPU isolés :
# Exemple : IRQBALANCE_BANNED_CPUS dans /etc/irqbalance/irqbalance.env
IRQBALANCE_BANNED_CPUS=0x0003 # CPUs 0-1 autorisés, le reste bloqué (format de masque par système)
Je vérifie ensuite que les ticks sont effectivement absents en regardant les prochains wakeups par CPU :
sudo cat /proc/timer_list | grep -A2 'next event' | sed -n '1,60p'
Dans les phases de repos, les prochains événements devraient se situer nettement dans le futur ou être complètement absents s'il n'y a pas de minuterie en cours.
Discipline de mesure : outils et indicateurs
Sans mesure, toute optimisation reste aveugle. J'enregistre des valeurs de base et les compare après chaque modification. Ce qui a fait ses preuves
- powertop: Wakeups-from-idle/s, Top-Pollueur, C-State-Residency
- turbostat: Fréquences, états de paquet et de cœur C, performance RAPL
- statistique parfaiteChangement de contexte, interruptions du timer, cycles, instructions
- /proc/interrupts: répartition des IRQ par CPU
- pidstat/iostat: caractéristiques du processus et des E/S
# Capture de 10 minutes de baseline au repos
sudo turbostat --Summary --intervalle 5 --quiet --show PkgWatt,BUS,CPU,CPU,CPU,MHz
sudo powertop --time=600 --html=/tmp/powertop_baseline.html
# Heatmap d'interruption
watch -n2 'cat /proc/interrupts | sed -n "1,30p
# Changement de contexte & événements du timer
perf stat -a --delay 5000 --timeout 60000 -e cs,task-clock,cpu-clock,irq_vectors:local_timer
Je documente à chaque fois : Consommation d'énergie au repos (PkgWatt), parts de C-State, wakeups/s et métriques de latence (p95/p99) de ma charge de travail pertinente. Même de petites différences sont perceptibles pendant des semaines.
Virtualisation, conteneurs et Tickless dans la pile
L'hyperviseur et les invités génèrent ensemble de nombreux Minuteur et les réveils, par exemple par Cron, la journalisation et les agents. Je réduis cette chaîne en activant Tickless dans l'hyperviseur et dans les systèmes invités. Ainsi, les doubles réveils disparaissent et les processeurs virtuels restent tranquilles plus longtemps. Dans les environnements Kubernetes ou Microservices, le niveau de bruit de fond baisse de manière mesurable. Je règle en outre les temps de pod et de batch de telle sorte que des fenêtres de repos plus longues apparaissent et que les Économies monter.
Dans les environnements KVM, je planifie le pinning vCPU et l'affinité IRQ ensemble : je lie les IRQ vNIC ou vBlock bruyants à des CPU de housekeeping, les charges de travail calmes à des cœurs isolés. Côté invité, je désactive les sources de temporisation superflues, je réduis les fréquences Cron et j'utilise des temporisateurs systemd d'une précision généreuse (AccuracySec), afin que les événements soient regroupés plus naturellement. Les phases d'inactivité sont ainsi plus longues - l'hyperviseur en profite doublement, car il y a moins de sorties et d'entrées de VM.
Configuration de la pratique : Profils d'alimentation, gouverneur, interruptions
Pour les réactions rapides, j'utilise généralement le gouverneur schedutil parce qu'il absorbe les sauts de charge de manière dynamique. Je laisse les C-States actifs, sauf si des latences extrêmement courtes ont la priorité. Je lie les IRQ bruyantes à des noyaux sélectionnés et laisse les autres noyaux libres pour qu'ils puissent dormir profondément. Je planifie les tâches par lots, les sauvegardes et les mises à jour en blocs afin de regrouper les phases calmes. Ceux qui souhaitent approfondir ce sujet trouveront des informations sur le Mise à l'échelle de la fréquence du CPU, J'ai également utilisé des outils d'aide à la décision, que je coordonne étroitement avec Tickless, afin d'utiliser les pointes avec parcimonie.
De plus, j'ajuste le biais de préférence énergétique (EPP/EPB) des CPU modernes pour que les boosts ne tirent qu'en cas de besoin et que les résidences au repos restent élevées. Les services à latence tolérante reçoivent de plus grandes valeurs de Timer-Slack (systemd : TimerSlackNSec=), je contrôle les tâches périodiques via des timers systemd avec AccuracySec et RandomizedDelaySec, ce qui réduit les charges de bord et crée des fenêtres de repos plus longues et contiguës.
# Exemple de commande : Attribuer un IRQ de manière ciblée (attention : vérifier le numéro d'IRQ)
echo 0-1 | sudo tee /proc/irq/XX/smp_affinity_list # lier IRQ au housekeeping
# Régler les temporisateurs systemd en coopération (extrait d'une unité .timer)
AccuracySec=5min
RandomizedDelaySec=30min
Persistent=true
Utiliser judicieusement la NUMA et le regroupement de la charge
Dans les hôtes multi-core et NUMA, j'augmente la Efficacité, Je peux ainsi réduire la charge sur quelques noyaux. Les noyaux libres tombent ainsi plus bas et plus longtemps dans les C-States. Je veille à ce que les accès à la mémoire restent locaux au NUMA afin d'éviter les déplacements inutiles. Le planificateur Linux aide, mais l'épinglage manuel pour les threads chauds représente souvent la dernière touche. Avec Tickless, ce regroupement a plus d'effet, car les noyaux isolés ne sont pas réveillés par la périodicité, ce qui permet de créer de véritables Silence ont.
Dans la pratique, j'attribue de préférence les threads chargés d'E/S au même nœud NUMA et j'isole les services gourmands en CPU sur quelques cœurs de ce nœud. Les Cgroups (cpuset, cpu) aident à tracer proprement les limites. J'examine les Transparent Huge Pages et AutoNUMA en fonction de la charge de travail : ils peuvent aider, mais contrecarrer en cas de gigue de latence. Il est important qu'au moins un nœud conserve suffisamment de capacité de housekeeping pour que les tâches système n'empiètent pas sur les cœurs critiques.
Équilibrer et mesurer les exigences de latence
Certaines charges de travail en temps réel ou de trading exigent des délais très courts. Temps de réponse. Je fais donc des tests avec des échantillons proches de la production et je compare les percentiles de latence avant et après les changements de tickless. NO_HZ_FULL peut réduire les changements de contexte et le bruit du timer, mais les C-States bas allongent parfois les chemins de réveil. Avec la télémétrie pour les C-States, la fréquence, les latences des paquets et la gigue, je prends des décisions éclairées. De plus, celui qui entretient le noyau en profite plusieurs fois - le réglage des performances et les corrections de sécurité s'interpénètrent, comme le montre la pratique ; à ce sujet, ma référence à Optimisation du noyau, J'intègre systématiquement ces informations dans les fenêtres de maintenance.
Je teste de manière ciblée des scénarios de burst (phases courtes et intenses) et je corrèle les pics de latence avec des tracés de fréquence et de C-state. Les mesures avec un EPP fixe ou un test court avec des C-States limités sont utiles pour mettre en évidence la part de latence de réveil. Si des noyaux NO_HZ_FULL sont utilisés, je m'assure que les unités centrales de maintenance ne sont pas sous-alimentées, sinon des avertissements RCU ou des gigues sporadiques risquent de se produire.
Sécurité : les noyaux actuels paient deux fois
Je considère les systèmes actuel, car les nouveaux noyaux ne se contentent pas d'affiner les chemins d'économie d'énergie, ils comblent également des lacunes. Les rapports sur les vulnérabilités du noyau montrent que les attaquants ont parfois réussi à étendre les droits avec peu d'efforts. Avec les mises à jour, je réduis ce risque tout en assurant les gains d'efficacité des mécanismes modernes [2]. Au total, la sécurité de fonctionnement augmente et les pannes non planifiées ne pèsent ni sur les nerfs ni sur le budget. C'est précisément cette combinaison de sécurité et de Efficacité fait des mises à jour régulières une décision facile à prendre.
Effet centre de données : PUE, ventilateurs, blocs d'alimentation
Moins de wakeups réduisent la Dernier sur le refroidissement et la distribution électrique. Les pics de CPU sont plus lisses, les ventilateurs fonctionnent moins souvent à leur limite et les blocs d'alimentation sont plus efficaces. Cet effet domino a un impact direct sur le PUE d'un site. Si vous souhaitez vous informer plus largement, consultez le sujet suivant centre de données vert et utilise Tickless comme élément constitutif d'une gestion énergétique globale. Je planifie toujours les mesures ensemble, car le matériel, le système d'exploitation et la charge de travail contribuent ensemble à l'efficacité énergétique. Économie chez
Ajuster WordPress, PHP et les bases de données de manière pratique
Sur les piles CMS avec de nombreux courts Demandes je profite fortement des couches de cache et d'un réglage propre de PHP-FPM. Je garde opcache au chaud, je scelle les plugins Chatty et je minimise le bruit cron en empilant les fenêtres de tâches. Les bases de données reçoivent des périodes de maintenance claires afin de ne pas pousser les pics d'E/S dans la charge journalière. Avec Tickless, le bruit de fond diminue et le serveur se met plus rapidement en veille. Ainsi, la plateforme combine la performance par watt sans que les utilisateurs ne ressentent de différence. Pertes voir
Concrètement, je réduis les déclencheurs Cron de WordPress, je déplace les tâches répétitives dans des timers systemd avec coalescence et je garde les workers PHP-FPM dimensionnés de manière à pouvoir répondre à de courtes vagues de charge sans maintenir un socle élevé de workers ouverts en permanence. Les bases de données bénéficient de fenêtres d'autovacuum claires (ralentir/déplacer si nécessaire) et de "blocs de maintenance" cohérents. Je préfère regrouper chaque tâche régulière, mais non critique en termes de temps, de manière grossière et granulaire plutôt que de les laisser tirer à la seconde.
BIOS/UEFI et chemins d'accès au matériel
Je pose déjà les bases dans le BIOS/UEFI : activer les C-States profonds du paquet, utiliser les substrats ASPM/PCIe-L1 et ne pas désactiver globalement les fonctions d'économie d'énergie. Je ne limite la profondeur des C-States à titre d'essai que si des objectifs de latence spécifiques l'imposent. Les cartes réseau et les contrôleurs NVMe profitent des modes d'économie d'énergie ; je vérifie néanmoins si une gestion agressive de l'énergie génère des pics de latence. Il vaut la peine de procéder à un équilibrage délicat : une vitesse de moins lors d'un effort maximal d'économie d'énergie peut avoir un grand effet dans la zone de latence de 99p.
Réseau et stockage : continuer à pousser les wakeups
La pile réseau déclenche souvent de nombreuses IRQ. J'augmente prudemment les paramètres de coalescence pour lisser les tempêtes d'interruptions sans dégrader inutilement la latence :
# Exemple (ajuster les valeurs en fonction de la charge de travail !)
sudo ethtool -C eth0 rx-usecs 16 rx-frames 16 tx-usecs 16 tx-frames 16
Je mets à l'échelle GRO/LRO et RSS en fonction de la topologie du CPU, afin que peu de cœurs supportent la majeure partie du bruit d'interruption. Du côté du stockage, je vérifie si les propriétés des appareils (par ex. NVMe-APST) sont déjà définies de manière optimale et si les pics de charge n'empiètent pas sur les pics de la journée en raison de tâches d'arrière-plan (scrubs, rebuilds). L'objectif est de pousser les rafales d'E/S planifiables dans des fenêtres définies.
Problèmes courants et dépannage
Les configurations Tickless échouent rarement au niveau de la mécanique de base, plus souvent au niveau de la finition :
- Étables RCUNO_HZ_FULL : les problèmes survenant après NO_HZ_FULL sont généralement dus à un nombre insuffisant d'unités centrales de housekeeping ou à une charge IRQ trop importante sur des noyaux isolés. Prévoir plus de capacité de housekeeping.
- Des réveils inattendus: Powertop indique les coupables. Les sources les plus fréquentes sont les agents de télémétrie, les intervalles courts des timers ou les chatty-logs.
- Distribution inégale de l'IRQ: vérifier /proc/interrupts et réajuster les affinités ; configurer correctement irqbalance.
- Gigue de latence: faire varier progressivement la profondeur de l'état C, l'EPP et le coalesçage et observer p99 ; de petits ajustements suffisent souvent.
Pour obtenir des résultats reproductibles, je travaille avec des fenêtres de changement, des points de retour en arrière clairs et des paramètres documentés avec précision. Chaque modification fait l'objet d'un tour de mesure - ce n'est qu'ensuite que l'on passe à l'étape suivante.
Des étapes concrètes pour ton démarrage
Je commence par une actualité Noyau et je vérifie si NO_HZ_IDLE est actif. Ensuite, je mesure les baselines : consommation d'énergie au repos, température, C-States, taux d'IRQ et latence. Ensuite, j'active les options de tickless et je répète les mesures. Si je trouve des économies, je sauvegarde la configuration dans des rapports de code et de documentation. Si nécessaire, je teste NO_HZ_FULL pour des noyaux sélectionnés et je les isole avec un mappage IRQ soigneux pour que les Effet reste visible.
Ma démarche pragmatique :
- Relever la baseline (10-15 minutes au repos + bref test de charge, sauvegarder les métriques)
- Vérifier NO_HZ_IDLE, valider le temporisateur High-Res et le pilote Idle
- Ajuster l'affinité IRQ et l'irqbalance, IRQ bruyants sur housekeeping
- Augmenter la coalescence des timers (timer systemd, TimerSlack, intervalles Cron)
- Facultatif : NO_HZ_FULL sur les cœurs sélectionnés + rcu_nocbs, laisser au moins 1-2 CPUs housekeeping libres
- Tracer le pinning NUMA et CPU, les limites de Cgroup et les fenêtres de batch
- Comparer l'avant et l'après, documenter les décisions
Mon bref résumé
Tickless apporte des résultats mesurables Énergie- et des avantages thermiques, notamment pour les charges de travail flexibles avec de longues phases d'inactivité. Je mise d'abord sur NO_HZ_IDLE et je le combine avec des profils de puissance judicieux. Ensuite, j'affine les affinités IRQ, le regroupement des charges et la discipline de mesure. Pour les scénarios particulièrement critiques en termes de latence, j'utilise NO_HZ_FULL de manière dosée et j'évalue le trade-off avec des tests réalistes [1]. Celui qui réunit la technologie, la conception de la charge de travail et le monitoring exploite la Potentiels de cette fonction du noyau de manière permanente.


