Loterie du silicium : pourquoi des CPU identiques performent différemment

Cet article vous a aidé ?

Vous avez acheté deux fois la même SKU. Même stepping (supposé). Même modèle de carte mère. Même mémoire. Même image OS. Et pourtant un nœud est toujours « le rapide » et l’autre est celui que tout le monde évite. Vous le constatez dans les benchmarks, la latence de queue, le temps de compactage, la durée des CI, les tickets « pourquoi ce pod est toujours lent ».

Ceci est la loterie du silicium en tenue de production : la dure réalité que « CPU identique » est une étiquette d’achat, pas une promesse. L’astuce consiste à apprendre quelles différences sont normales, lesquelles sont configurables, et lesquelles signifient que vous êtes sur le point de perdre un incident à cause de la physique.

Ce que signifie vraiment la « loterie du silicium » (et ce que ce n’est pas)

« Loterie du silicium » est le terme informel pour la variance de fabrication qui se traduit par des comportements d’exploitation différents entre des puces qui partagent le même nom de modèle. Ce n’est pas de la magie. C’est la somme de différences microscopiques : fuite de transistor, tensions de seuil, résistance des couches métalliques, et la façon dont cela interagit avec les algorithmes de boost, les limites de puissance et le refroidissement.

Dans les milieux d’overclocking grand public, la loterie est souvent présentée comme : « Jusqu’à quelle fréquence cette puce peut monter ? » En opérations, la version plus coûteuse est : « Pourquoi le nœud A soutient-il un débit plus élevé et une latence tail plus faible à charge identique ? »

Ce que c’est

  • Différents courbes tension/fréquence : Une puce nécessite plus de tension pour tenir une fréquence donnée ; une autre en nécessite moins. Cela change la résidence en boost sous les limites de puissance/thermiques.
  • Différente dissipation thermique à charge identique : La fuite et l’efficacité varient. La puce « chaude » atteint plus tôt les limites thermiques, baisse les clocks, et vos SLO le remarquent.
  • Comportement différent sous charges vectorielles : Les offsets de fréquence AVX2/AVX-512 et les limites de courant peuvent modifier drastiquement la performance soutenue.
  • Tolérance différente à l’undervolt/overclock : Dans les datacenters, vous évitez (devriez éviter) généralement cela, mais vous héritez de comportements via les valeurs par défaut du BIOS du vendeur.

Ce que ce n’est pas

  • Ce n’est pas la preuve que votre fournisseur « vous a vendu un mauvais CPU » sauf si vous observez des instabilités, des tempêtes WHEA/MCE, ou des chutes de performance hors de la famille.
  • Ce n’est pas une excuse pour ignorer la gestion de l’énergie. La plupart des plaintes « loterie » sont en réalité des PL1/PL2 mal réglés, des C-states trop agressifs, ou une mise à jour BIOS qui a changé les règles en cours de saison.
  • Ce n’est pas seulement une question de GHz. La rétention en cache, la fréquence uncore, le comportement du contrôleur mémoire et la topologie NUMA comptent souvent plus que les fréquences annoncées pour les services réels.

Pourquoi les performances varient : les mécanismes réels

1) Binning et rendements : « même modèle » est déjà un regroupement

Les fabricants de CPU ne produisent pas « un i9 » ou « un Xeon ». Ils fabriquent des wafers puis testent et trient les dies en SKUs selon ce que chaque die peut faire en toute sécurité dans une enveloppe puissance/thermique. Le binning explique pourquoi deux dies du même wafer peuvent devenir des produits différents — et pourquoi deux dies dans le même produit peuvent quand même varier.

Même au sein d’une SKU, il y a une tolérance. Une puce qui atteint juste la spécification et une puce qui la dépasse confortablement peuvent toutes deux porter le même badge. Les algorithmes de boost amplifient alors cette différence : la puce efficace peut booster plus longtemps avant d’atteindre les limites.

2) Le boost est conditionnel, et les conditions ne sont jamais identiques

Les CPU modernes n’ont pas « une vitesse d’horloge ». Ils ont des politiques. Les fréquences Turbo/Boost dépendent de :

  • Nombre de cœurs actifs
  • Température
  • Limites de puissance du package (PL1/PL2/Tau sur de nombreuses plateformes Intel ; PPT/TDC/EDC sur de nombreuses plateformes AMD)
  • Limites de courant (VRM et contraintes du socket)
  • Classe de charge de travail (scalaire vs vectorielle)
  • Comportement du planificateur OS (core parking, empaquetage SMT, localité NUMA)

Si vous pensez avoir acheté « 3.2 GHz », vous avez acheté un CPU qui parfois fonctionnera à 3.2 GHz tout en négociant avec la physique, le firmware et la politique d’aération de votre datacenter.

3) Distribution d’énergie : VRM, firmware et « defaults » qui ne sont pas cohérents

Sur les serveurs, le CPU n’est qu’une partie du système. Les VRM de la carte mère, les révisions de firmware et les valeurs par défaut du vendeur décident de ce que signifie « limite de puissance ». Deux cartes identiques peuvent toutefois se comporter différemment parce que :

  • L’une a un BIOS plus récent avec des tables de puissance différentes.
  • L’une a une configuration BMC différente (courbes de ventilateurs, politiques thermiques).
  • L’une a une pression de contact ou une application de TIM légèrement moins bonne (oui, vraiment).
  • L’une est dans une position de rack qui reçoit « mauvais air » près d’un point chaud d’évacuation.

La variance qui ressemble à la « loterie du CPU » est souvent une « loterie de la plateforme ». Les opérations devraient traiter la dérive de configuration de la plateforme comme une cause d’incident de première classe.

4) Thermiques : le CPU le plus rapide est celui qui reste frais

Le boost fonctionne jusqu’à ce qu’il cesse. Une fois qu’on atteint un plafond thermique, le CPU se protège en réduisant fréquence et/ou tension. Cela se manifeste par :

  • Débit soutenu plus faible (évident)
  • Latence tail plus élevée (le plus pénible)
  • Résultats de benchmark qui dérivent dans le temps (effets de chauffe)

Les thermiques ne sont pas que des dissipateurs. Ce sont des boucles de contrôle de ventilateur, l’impédance du châssis, la poussière, le vieillissement de la pâte, et si le voisin de rack a décidé de faire tourner un radiateur déguisé en serveur GPU.

5) Offsets AVX/Vectoriels : « même CPU » mais fréquence effective différente selon le code réel

Les instructions vectorielles peuvent tirer beaucoup plus de courant. Beaucoup de plateformes appliquent un offset AVX (réduction de fréquence sous AVX2/AVX-512) pour maintenir la puissance et le thermique. Deux nœuds exécutant le même job peuvent diverger parce que :

  • L’un a AVX-512 activé, l’autre désactivé (option BIOS ou comportement du microcode).
  • Différentes révisions de microcode appliquent des limites différentes.
  • Des bibliothèques différentes (ou des flags de compilation différents) choisissent des chemins d’instruction différents.

Traduction : votre « performance CPU » pourrait en fait être un incident de « choix de bibliothèque mathématique ».

6) Uncore et mémoire : la moitié invisible des performances CPU

Beaucoup de charges sont limitées par la bande passante mémoire, la latence ou le comportement du cache. Des « CPU identiques » peuvent néanmoins différer en performance mémoire effective à cause de :

  • Population DIMM (1DPC vs 2DPC), rangs, modules mixtes
  • Vitesse mémoire négociée à la baisse selon les règles de population
  • Différences de topologie NUMA (mono vs double socket, ou vitesse d’interconnexion socket)
  • Paramètres BIOS affectant le scaling de la fréquence uncore

Dans les systèmes orientés stockage (bases de données, object stores, recherche), la variance CPU apparaît souvent comme « IO lent » parce que le CPU passe du temps en compression, checksums, chiffrement et gestion d’interruptions. Le CPU fait partie de votre pipeline de stockage que cela vous plaise ou non.

7) Microcode et mitigations : la taxe de performance peut varier

Les mises à jour microcode et les mitigations de l’exécution spéculative ont changé la donne après 2018. L’impact varie selon la charge et la configuration. Deux nœuds « identiques » peuvent diverger si :

  • Ils sont sur des microcodes différents (packages OS, BIOS ou fournis par l’OS).
  • Les paramètres de boot du kernel diffèrent (mitigations activées/désactivées).
  • Les réglages de l’hyperviseur diffèrent (en environnements virtualisés).

Les équipes sécurité et performance peuvent coexister, mais seulement si vous mesurez et standardisez. Les bascules surprises sont là où naît la fatigue des pagers.

8) Ordonnanceur et topologie : l’OS peut saboter votre matériel « identique »

Linux est bon pour l’ordonnancement général, pas pour la télépathie. Des différences de performance apparaissent lorsque :

  • Les charges rebondissent entre les nœuds NUMA.
  • Les interruptions se concentrent sur les mauvais cœurs.
  • Le gouverneur de fréquence CPU est incohérent entre nœuds.
  • Le comportement SMT (Hyper-Threading) interagit avec votre charge.

Si vous ne pinnez rien, Linux fera quand même des choix. Ces choix ne sont pas toujours ceux que vous auriez faits sobrement.

Blague #1 : La loterie du silicium, c’est comme engager des jumeaux et découvrir que l’un d’eux répond encore aux e-mails.

Faits et historique : comment on en est arrivé là

  • Fait 1 : Le « binning » des puces est une pratique standard depuis des décennies ; les vendeurs testent les dies et les trient selon la fréquence stable, la tension et la tolérance aux défauts.
  • Fait 2 : Le passage d’horloges fixes à des turbo boosts agressifs a transformé de petites différences électriques en différences de performance visibles — car le boost est opportuniste.
  • Fait 3 : Le Dennard scaling (l’ancienne époque où la puissance restait gérable quand les transistors rétrécissaient) a effectivement pris fin au milieu des années 2000, poussant les vendeurs vers la gestion dynamique de la puissance et les designs multi-cœurs.
  • Fait 4 : Les règles de turbo multicœur dépendent souvent du « nombre de cœurs actifs », ce qui signifie que le même CPU peut se comporter comme plusieurs CPU différents selon l’ordonnancement.
  • Fait 5 : AVX-512 (lorsqu’il est présent) déclenche souvent des fréquences soutenues plus basses ; certains opérateurs le désactivent lorsqu’il nuit aux charges mixtes plutôt que de les aider.
  • Fait 6 : Le microcode peut changer matériellement les caractéristiques de performance : pas seulement les mitigations de sécurité, mais aussi le comportement de boost et les garde-fous de stabilité.
  • Fait 7 : Les vendeurs de serveurs expédient fréquemment des valeurs BIOS par défaut optimisées pour des thermiques et une acoustique « sûres », pas pour une performance basse-latence cohérente.
  • Fait 8 : Les règles de population mémoire (nombre de DIMM, rangs) peuvent forcer une fréquence mémoire plus basse ; deux systèmes « même CPU » peuvent avoir des bandes passantes différentes rien que par configuration.
  • Fait 9 : Le scaling cpufreq de Linux et les C-states peuvent créer de la gigue mesurable ; un nœud avec des états d’inactivité profonds activés peut sembler « plus lent » sous charge en rafales.

Une citation, parce que c’est une bonne posture opérationnelle. De Gene Kranz : « Failure is not an option. » Ce n’est pas littéralement vrai en ops, mais c’est un bon rappel que vos systèmes ont besoin de marges, pas d’actions héroïques.

Plan de diagnostic rapide : trouver le goulot en quelques minutes

Première étape : prouvez que c’est la variance CPU, pas la variance de charge

  1. Comparez des requêtes identiques (même taille d’entrée, même chemin de code). Si vous ne pouvez pas, arrêtez et instrumentez.
  2. Vérifiez l’utilisation CPU vs la run queue : forte utilisation avec run queue élevée suggère saturation CPU ; faible utilisation avec latence suggère des blocages ailleurs.
  3. Cherchez du throttling : thermique, puissance ou plafonnement de fréquence.

Deuxième étape : vérifiez les trois « tueurs silencieux »

  1. Limites de puissance (PL1/PL2/PPT) réglées différemment entre nœuds.
  2. Thermiques/ventilateurs (un serveur est plus chaud, ou les ventilateurs sont limités).
  3. Dérive microcode/BIOS (même SKU, comportement différent).

Troisième étape : confirmez la topologie et la politique

  1. NUMA : les threads et la mémoire sont-ils locaux ?
  2. Gouverneur et C-states : échangez-vous latence contre une petit économie d’énergie ?
  3. Affinité IRQ : les interruptions réseau/stockage sont-elles assignées aux pires cœurs possibles ?

Quatrième étape : validez avec un microbenchmark reproductible

Pas un benchmark de vanité. Quelque chose lié à votre charge : débit de compression, débit crypto, taux de checksum stockage, temps d’exécution de requête avec cache chaud, etc. Exécutez-le pinné, réchauffé, et dans les mêmes conditions environnementales.

Tâches pratiques : commandes, sorties et décisions (12+)

Voici les vérifications que je lancerais réellement quand arrive une plainte « même CPU, performance différente ». Chaque item inclut : la commande, ce qu’une sortie typique implique, et la décision à prendre.

Task 1: Confirm CPU model, stepping, and microcode

cr0x@server:~$ lscpu | egrep 'Model name|Stepping|Vendor ID|CPU\(s\)|Thread|Core|Socket'
Vendor ID:                           GenuineIntel
Model name:                          Intel(R) Xeon(R) Gold 6338 CPU @ 2.00GHz
CPU(s):                              64
Thread(s) per core:                  2
Core(s) per socket:                  32
Socket(s):                           1
Stepping:                            6
cr0x@server:~$ grep -m1 microcode /proc/cpuinfo
microcode	: 0xd0003a2

Ce que cela signifie : Si le stepping ou le microcode diffère entre des nœuds « identiques », attendez-vous à des différences de boost et de mitigations.

Décision : Standardisez BIOS + microcode sur toute la flotte avant de poursuivre la chasse aux fantômes dans le code applicatif.

Task 2: Check kernel mitigation state (performance tax differences)

cr0x@server:~$ grep . /sys/devices/system/cpu/vulnerabilities/*
/sys/devices/system/cpu/vulnerabilities/meltdown: Mitigation: PTI
/sys/devices/system/cpu/vulnerabilities/spectre_v2: Mitigation: Retpolines; IBPB: conditional; STIBP: disabled; RSB filling; PBRSB-eIBRS: Not affected

Ce que cela signifie : Différents modes de mitigation peuvent changer les performances des charges syscall-heavy, VM-heavy et riches en context-switch.

Décision : Alignez les paramètres de boot et les versions du kernel ; mesurez avant de modifier la posture de sécurité.

Task 3: Check CPU frequency governor consistency

cr0x@server:~$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance

Ce que cela signifie : « powersave » (sur certains systèmes) peut encore booster, mais la politique et la latence diffèrent. Des gouverneurs incohérents causent une latence tail incohérente.

Décision : Pour les services sensibles à la latence, utilisez performance sauf si vous avez une raison mesurée de ne pas le faire.

Task 4: Read effective frequency and throttling signals with turbostat

cr0x@server:~$ sudo turbostat --Summary --interval 2 --quiet
     PkgTmp  PkgWatt  CorWatt   GFXWatt Avg_MHz  Busy%  Bzy_MHz  IPC
      71      178.3     160.2     0.0    3120    92.4    3375   1.15
      83      205.7     187.9     0.0    2480    96.1    2580   1.08

Ce que cela signifie : Si Avg_MHz et Bzy_MHz baissent quand PkgTmp monte, vous êtes en throttling thermique. Si PkgWatt atteint un plafond et que MHz baisse, vous êtes limité par la puissance.

Décision : Améliorez le refroidissement ou ajustez les limites de puissance (dans les recommandations du fournisseur). N’« optimisez pas l’appli » pour compenser un châssis chaud.

Task 5: Check for thermal throttle flags in kernel logs

cr0x@server:~$ sudo dmesg -T | egrep -i 'thrott|thermal|PROCHOT|Package temperature' | tail -n 20
[Mon Jan 12 09:41:08 2026] CPU0: Package temperature above threshold, cpu clock throttled
[Mon Jan 12 09:41:12 2026] CPU0: Package temperature/speed normal

Ce que cela signifie : Le CPU admet qu’il a ralenti. Traitez cela d’abord comme un problème matériel/environnemental.

Décision : Inspectez les profils de ventilateur, le flux d’air, la poussière, le montage du dissipateur ; envisagez de déplacer le nœud dans le rack pour tester l’hypothèse de point chaud.

Task 6: Compare BIOS/firmware versions (drift detector)

cr0x@server:~$ sudo dmidecode -t bios | egrep 'Vendor|Version|Release Date'
Vendor: American Megatrends International, LLC.
Version: 2.3.7
Release Date: 08/14/2025

Ce que cela signifie : Des versions BIOS différentes signifient souvent des tables de boost, des bundles microcode et des valeurs par défaut de puissance différentes.

Décision : Mettre à jour/standardiser le BIOS de façon intentionnelle, pas « quand quelqu’un a le temps ». Traitez-le comme un changement en production.

Task 7: Verify power cap framework (RAPL) and detect caps

cr0x@server:~$ sudo powercap-info -p intel-rapl
Zone intel-rapl:0 (package-0)
  power limit 0: 180.00 W (enabled)  time window: 28.00 s
  power limit 1: 220.00 W (enabled)  time window: 0.00 s

Ce que cela signifie : Ces plafonds peuvent différer entre nœuds. De plus, certaines plateformes les exposent différemment ; l’absence d’affichage n’implique pas l’absence de plafonds.

Décision : Si un nœud est plafonné plus bas, corrigez la politique ou le réglage BIOS. N’acceptez pas « nœud mystérieusement lent » comme fatalité.

Task 8: Check C-states and idle state policy (latency jitter)

cr0x@server:~$ cat /sys/module/intel_idle/parameters/max_cstate
9
cr0x@server:~$ sudo cpupower idle-info | sed -n '1,25p'
CPUidle driver: intel_idle
CPUidle governor: menu
analyzing CPU 0:
  Number of idle states: 10
  state0: POLL
  state1: C1
  state2: C1E
  state3: C3

Ce que cela signifie : Les C-states profonds économisent de l’énergie mais ajoutent de la latence de réveil. Sur des services en rafales, cela se traduit par de la latence tail.

Décision : Pour des SLOs stricts, limitez le C-state max ou utilisez des profils tuned — après avoir mesuré l’impact sur la consommation.

Task 9: Verify NUMA layout and ensure it matches expectations

cr0x@server:~$ numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
node 0 size: 128768 MB
node 0 free: 120112 MB
node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
node 1 size: 129024 MB
node 1 free: 121004 MB

Ce que cela signifie : Deux nœuds peuvent différer parce que l’un est mal configuré (NUMA désactivé, interleaving mémoire forcé) ou parce qu’une charge traverse involontairement le NUMA.

Décision : Pinner mémoire et CPU pour les jobs critiques ; évitez le trafic cross-NUMA sauf si votre charge est explicitement conçue pour cela.

Task 10: Detect memory speed and population-related downclocking

cr0x@server:~$ sudo dmidecode -t memory | egrep -i 'Locator:|Speed:|Configured Memory Speed' | head -n 20
Locator: DIMM_A1
Speed: 3200 MT/s
Configured Memory Speed: 2933 MT/s
Locator: DIMM_B1
Speed: 3200 MT/s
Configured Memory Speed: 2933 MT/s

Ce que cela signifie : Vos DIMM peuvent annoncer 3200 mais tourner à 2933 à cause des règles de population. Un autre nœud peut être à 3200, lui donnant un avantage réel en bande passante.

Décision : Standardisez la disposition DIMM ; ne mélangez pas les kits mémoires à la légère en production si vous tenez à la prévisibilité.

Task 11: Check for CPU error corrections or machine checks (bad silicon vs bad platform)

cr0x@server:~$ sudo journalctl -k | egrep -i 'mce|machine check|whea|edac' | tail -n 20
Jan 12 09:12:10 server kernel: mce: [Hardware Error]: CPU 0: Machine Check: 0 Bank 7: b200000000070005
Jan 12 09:12:10 server kernel: mce: [Hardware Error]: TSC 0 ADDR fef1c140 MISC d012000100000000

Ce que cela signifie : Les erreurs corrigées peuvent être corrélées à l’instabilité, à la baisse de fréquence ou aux garde-fous du fournisseur. Les MCE persistants ne sont pas « normaux ».

Décision : Escaladez auprès du support matériel. Remplacez la CPU ou la carte. Ne laissez pas un nœud défaillant pourrir dans la flotte.

Task 12: Inspect interrupt distribution (network/storage bottlenecks that look like CPU variance)

cr0x@server:~$ cat /proc/interrupts | head -n 15
           CPU0       CPU1       CPU2       CPU3
  24:   9182736          0          0          0  IR-PCI-MSI  524288-edge      nvme0q0
  25:         12          0          0          0  IR-PCI-MSI  524289-edge      eth0-TxRx-0
  26:         10          0          0          0  IR-PCI-MSI  524290-edge      eth0-TxRx-1

Ce que cela signifie : Si la plupart des interruptions atterrissent sur CPU0, vous obtenez du hotspotting, de la contention de cache, et « ce nœud est plus lent ». Ce n’est pas le CPU ; c’est votre plomberie IRQ.

Décision : Configurez irqbalance correctement ou pinnez manuellement les IRQ pour les chemins NIC/NVMe à haut débit.

Task 13: Check scheduler pressure: run queue and context switching

cr0x@server:~$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 120112  10132 500112    0    0     1     3 1200 2800 22  7 71  0  0
 9  0      0 119980  10132 500200    0    0     0     0 5100 9800 74 14 12  0  0

Ce que cela signifie : Un r élevé (run queue) avec un id bas signifie contention CPU. Un cs élevé peut indiquer un excès de context switching (mauvais pinning, trop de threads, ou voisins bruyants).

Décision : Dimensionnez correctement les pools de threads ; pinnez les threads critiques ; réduisez le bruit de fond sur les nœuds sensibles à la latence.

Task 14: Check actual per-core frequency behavior under load

cr0x@server:~$ sudo mpstat -P ALL 1 3
Linux 6.5.0 (server)  01/12/2026  _x86_64_  (64 CPU)

11:02:14 AM  CPU   %usr  %sys  %iowait  %irq  %soft  %idle
11:02:15 AM  all  62.10  11.22     0.12  0.00   0.55  25.99
11:02:15 AM    0  92.00   6.00     0.00  0.00   2.00   0.00

Ce que cela signifie : Un cœur saturé (souvent CPU0) indique une concentration d’IRQ ou un goulot mono-thread. Les plaintes « CPU lent » cachent souvent un seul cœur chaud.

Décision : Corrigez l’affinité IRQ et le parallélisme de l’appli avant de blâmer le silicium.

Task 15: Validate that your workload isn’t silently using different instruction sets

cr0x@server:~$ lscpu | grep -i flags | tr ' ' '\n' | egrep 'avx|avx2|avx512' | head
avx
avx2
avx512f
avx512dq

Ce que cela signifie : Si un nœud n’a pas un flag (ou s’il est masqué par la virtualisation), le même binaire peut choisir un chemin plus lent.

Décision : Standardisez l’exposition des fonctionnalités CPU dans votre hyperviseur/environnement conteneur ; ciblez les builds si nécessaire.

Trois micro-histoires d’entreprise depuis le terrain

Mini-histoire 1 : L’incident causé par une mauvaise supposition

Une entreprise SaaS de taille moyenne a déployé un nouveau lot de nœuds de calcul « identiques » pour une API sensible à la latence. Même modèle de CPU, même RAM, même NIC. Ils les ont mis dans le même pool Kubernetes en espérant des gains de capacité linéaires.

En une semaine, la rotation on-call a remarqué un schéma : le p95 était correct, mais le p99.9 montait à chaque fois que l’HPA schedulait des pods sur un sous-ensemble des nouveaux nœuds. Les graphes ressemblaient à un mauvais ECG. La suspicion immédiate fut « voisin bruyant ». La seconde fut « régression GC ». Ils ont passé deux jours sur la danse habituelle : profils heap, flame graphs, rollbacks prudents.

La mauvaise supposition était simple : « CPU identique implique comportement de boost identique. » En réalité, la moitié des nouveaux nœuds étaient livrés avec un BIOS plus récent qui activait une politique de puissance différente : une limite de puissance soutenue conservatrice avec une courte fenêtre turbo. Sous charge soutenue, ces nœuds semblaient disposer de moins de cœurs.

Ils l’ont confirmé en comparant turbostat sous un générateur de charge identique pinné au même nombre de threads. Les nœuds « lents » atteignaient un plafond de puissance package, puis la fréquence chutait. Pas de crash. Pas d’erreurs évidentes. Juste plus lents en silence.

La correction a été ennuyeuse mais efficace : standardiser BIOS et politique de puissance. La capacité est revenue, la latence tail s’est stabilisée, et l’équipe a écrit un postmortem : « Les vérifications de dérive de flotte sont requises avant d’ajouter des nœuds aux pools latence. » Le meilleur : cela a évité la même erreur au prochain renouvellement matériel.

Mini-histoire 2 : L’optimisation qui s’est retournée contre eux

Une équipe plateforme de données exploitait un service lourd en stockage qui faisait compression, checksums et chiffrement sur le chemin IO. Ils chassaient le coût par requête. Les factures d’énergie montaient, et quelqu’un a proposé d’activer des C-states plus profonds et de passer le gouverneur en mode plus « efficace ». Le changement semblait sûr : l’utilisation CPU moyenne n’était que de 35 %, et le service avait de la marge.

En quelques heures, les tickets support sont arrivés : « les uploads se bloquent parfois », « les téléchargements laguent occasionnellement », et le pire, « le système est lent à réagir ». Les dashboards montraient une légère augmentation du p50, mais p99 et p99.9 ont pris de la vigueur. Pas de limites évidentes. Réseau et disque étaient sains. Le CPU n’était pas saturé.

Le retour de bâton venait de la rafale. Le service avait un travail CPU par requête en rafales (crypto/compress), et il comptait sur le réveil rapide du CPU pour tenir la latence tail. Les états d’inactivité profonds ont fait roupiller le CPU comme s’il était en vacances. La « moyenne » restait correcte tandis que le « pire cas » les trahissait.

Pour rendre la chose plus épicée, la loterie du silicium a amplifié la douleur : les puces avec plus de fuite tournaient plus chaudes, atteignaient plus vite les seuils thermiques après le réveil, et redescendaient en fréquence lors des rafales. L’équipe avait accidentellement créé un système qui récompensait les CPUs plus frais et punissait les plus chauds.

Ils ont roll-backé le gouverneur et limité les C-states pour le pool latence. La consommation a augmenté un peu. Les incidents ont fortement diminué. Ils ont plus tard introduit un pool split : nœuds économes pour le batch, nœuds optimisés latence pour le trafic interactif. Voilà comment calmer Finance et On-call.

Mini-histoire 3 : La pratique ennuyeuse mais correcte qui a sauvé la journée

Une grande entreprise faisait tourner des charges mixtes : bases de données, recherche, systèmes de build internes. Les renouvellements matériels étaient fréquents, et la variance était attendue. Ce qui n’était pas attendu, c’était une chute soudaine de 15–20 % de débit sur un sous-ensemble de réplicas de bases après une fenêtre de maintenance routinière.

L’équipe n’a pas paniqué. Ils avaient une pratique ennuyeuse : chaque nœud avait un enregistrement « empreinte » capturé lors du provisioning — version BIOS, microcode, état des mitigations, gouverneur, cap C-state, vitesse mémoire configurée, topologie NUMA. Cela vivait à côté de l’entrée CMDB. Ce n’était pas glamour, mais c’était interrogeable.

Ils ont comparé les empreintes entre réplicas « bons » et « mauvais » et trouvé une unique dérive : une mise à jour BIOS avait changé l’entrainement mémoire et négocié une vitesse mémoire configurée plus basse sur les systèmes avec une population DIMM particulière. Les clocks CPU étaient corrects. Le stockage était correct. La base n’était pas « lente » ; elle attendait plus souvent la mémoire.

La remédiation fut tout aussi ennuyeuse : ajuster la population DIMM pour correspondre aux recommandations fournisseur pour la vitesse désirée, et standardiser le profil BIOS sur cette famille matérielle. Le lag de réplication est revenu à la normale.

Rien dans cette histoire ne deviendra viral. Mais cela a sauvé la journée parce qu’ils ont traité la performance comme de la configuration, pas comme des impressions.

Blague #2 : Rien ne dit « entreprise » comme résoudre un problème de performance en mettant à jour un tableur et en ayant raison.

Erreurs courantes : symptôme → cause racine → correction

1) Symptom: One node is consistently 10–20% slower under sustained load

Root cause: Different power limits (PL1/PL2/PPT) or turbo window (Tau), often due to BIOS differences.

Fix: Compare BIOS versions and powercap settings; align firmware and power profiles; verify with turbostat under the same load generator.

2) Symptom: Performance starts strong then degrades after 2–5 minutes

Root cause: Thermal saturation and throttling; fan curves too conservative; clogged filters; poor rack airflow.

Fix: Inspect thermal logs and dmesg; check BMC fan policy; validate airflow; re-seat heatsink if needed; re-run benchmark after warm-up.

3) Symptom: p50 looks fine, p99 is awful, CPU utilization isn’t high

Root cause: Deep C-states, frequency scaling latency, or bursty workload waking cores repeatedly; sometimes combined with IRQ concentration.

Fix: Use performance governor; cap C-states in latency pools; distribute interrupts; verify with tail-latency focused load tests.

4) Symptom: One “identical” VM is slower than another on the same host type

Root cause: CPU feature masking, inconsistent vCPU pinning, or different host microcode/mitigations.

Fix: Standardize host kernel and microcode; enforce consistent CPU model exposure; pin vCPUs for critical workloads.

5) Symptom: Compression/encryption throughput differs wildly between nodes

Root cause: Different instruction paths (AVX/AVX2/AVX-512), different library builds, or AVX frequency offsets triggered on one node more than another.

Fix: Confirm CPU flags; standardize libraries and build flags; consider disabling AVX-512 for mixed workloads if it hurts more than it helps.

6) Symptom: “CPU is slow” but perf counters show low IPC

Root cause: Memory stalls, NUMA remote accesses, or uncore frequency scaling too aggressive.

Fix: Check NUMA locality; pin memory; validate memory speed; tune uncore policy if platform supports it; measure again.

7) Symptom: Random slowdowns correlated with storage/network activity

Root cause: Interrupt storms or IRQs pinned to a single core; CPU0 becomes the dumping ground.

Fix: Balance interrupts; validate RSS/RPS settings; consider dedicated cores for IRQ handling on high-throughput boxes.

8) Symptom: Two nodes differ only after a security patch window

Root cause: Different mitigation states, kernel versions, or microcode packages.

Fix: Confirm vulnerability status across nodes; standardize kernel and microcode rollout; benchmark critical paths pre/post change.

Listes de contrôle / plan étape par étape

Checklist A: Before you declare “silicon lottery” in production

  1. Confirm you’re comparing the same workload phase (warm cache vs cold cache matters).
  2. Validate OS image parity: kernel, microcode, boot params.
  3. Check BIOS/firmware drift: version and settings profile.
  4. Confirm governor and C-state policy match the service class.
  5. Measure thermals and throttling under sustained load.
  6. Verify power limits (RAPL / vendor tools / BIOS).
  7. Confirm memory configured speed and population symmetry.
  8. Check NUMA topology and whether the workload is NUMA-aware.
  9. Inspect IRQ distribution for NIC/NVMe hotspots.
  10. Run a repeatable microbenchmark pinned to cores and NUMA nodes.

Checklist B: Standardize for predictable performance (fleet hygiene)

  1. Create a hardware+firmware baseline per platform generation (BIOS version, key settings, microcode).
  2. Automate drift detection (daily or weekly) and alert on differences that matter: microcode, governor, mitigations, memory speed.
  3. Split node pools by intent: batch/efficient vs latency/consistent.
  4. Establish an acceptance test: sustained load, thermal soak, and tail latency measurements.
  5. Track rack position and inlet temperature as first-class metadata for performance anomalies.

Checklist C: When you truly have silicon variance and can’t eliminate it

  1. Identify “fast” and “slow” bins via your own fleet benchmarks (same test, same conditions).
  2. Schedule workloads accordingly: latency-sensitive services to the most consistent/coolest nodes.
  3. Use resource-based routing: steer heavy vector workloads away from nodes that downclock under AVX.
  4. Increase headroom: don’t run at 85–90% CPU if you care about tail latency.
  5. Keep spares and rotate suspect nodes out before they become incident magnets.

FAQ

1) Is the silicon lottery real, or just benchmarking noise?

C’est réel, mais souvent exagéré. De petites différences électriques deviennent visibles parce que le boost est conditionnel. Le bruit de benchmarking existe aussi, surtout avec des runs courts, des caches froids et des thermiques variables. Si vous ne pouvez pas reproduire la différence avec un test pinné et réchauffé, supposez du bruit ou une variance environnementale.

2) How much variance is “normal” between same-model CPUs?

Quelques pourcents sont courants dans des conditions faiblement contrôlées. Sous charge soutenue avec de bons contrôles, vous pouvez souvent vous rapprocher davantage. Des différences à deux chiffres indiquent généralement des mismatches de configuration, puissance, thermiques ou vitesse mémoire — pas seulement « mauvaise chance ».

3) Does this matter more for servers than desktops?

Oui, parce que les serveurs exécutent des charges soutenues, se soucient de la latence tail, et vivent dans des environnements thermiquement complexes. Aussi parce que vous opérez des flottes : une différence de 5 % répétée sur des centaines de nœuds se transforme en capacité réelle et en coûts réels.

4) Can microcode updates change performance even if the CPU is the same?

Oui. Le microcode peut modifier le comportement des mitigations, les garde-fous de stabilité, et parfois le comportement de boost. Traitez le microcode comme un changement impactant la performance et mesurez les chemins critiques avant/après.

5) Is thermal throttling always obvious?

Non. Parfois c’est subtil : pas de ventilateurs qui hurlent, pas d’alarme évidente, juste une fréquence soutenue plus basse après un soak thermique. C’est pourquoi vous vérifiez les tendances turbostat et les logs kernel, pas seulement la température instantanée.

6) Should we disable C-states and frequency scaling everywhere?

Non. Faites-le là où c’est justifié : pools latence, systèmes de trading haute fréquence, tout ce qui a des SLOs tail brutaux. Pour le batch et le throughput, laisser la gestion d’énergie activée peut être raisonnable. Scindez les pools plutôt que d’imposer une politique unique à des charges incompatibles.

7) How can storage performance issues be caused by CPU variance?

Compression, checksums, chiffrement, erasure coding, déduplication, et même le traitement de paquets réseau sont du travail CPU. Un CPU qui soutient des clocks plus basses sous charge peut rendre le « disk IO » lent parce que le pipeline est CPU-bound.

8) What’s the quickest way to tell if I’m power-limited vs thermally limited?

Utilisez turbostat : si la puissance package atteint un plafond stable et que la fréquence baisse, vous êtes limité par la puissance. Si la température monte vers un seuil et que la fréquence baisse pendant que la puissance diminue aussi, vous êtes probablement limité thermiquement.

9) Do “identical” CPUs differ more with AVX workloads?

Ils peuvent, car AVX augmente la densité de puissance et déclenche offsets et limites de courant. De petites différences d’efficacité et des politiques firmware différentes peuvent produire des écarts de fréquence soutenue plus importants sous code AVX-heavy.

10) Is it worth “binning” servers internally (labeling fast vs slow)?

Parfois. Si vous exécutez des charges mixtes avec des sensibilités différentes à la latence et aux offsets vectoriels, le binning interne peut améliorer la prévisibilité. Mais faites-le après avoir éliminé la dérive de configuration ; sinon vous triez juste vos propres erreurs en catégories.

Conclusion : prochaines étapes qui réduisent vraiment la variance

Si vous voulez moins de mystères « pourquoi ce nœud est plus lent », arrêtez de traiter la performance CPU comme un nombre unique. Traitez-la comme un comportement système façonné par la politique firmware, la distribution d’alimentation, le refroidissement et l’ordonnancement OS.

  1. Standardisez le firmware et le microcode sur les nœuds du même pool. La dérive est l’ennemie de la prévisibilité.
  2. Mesurez le throttling explicitement (turbostat + logs) au lieu de faire confiance aux specs en titre.
  3. Séparez les pools de nœuds par intention : latency-tuned vs efficiency-tuned. Une taille unique ne convient à personne.
  4. Validez la configuration mémoire (vitesse configurée, symétrie de population, localité NUMA). C’est là que les problèmes « CPU » aiment se cacher.
  5. Automatisez les empreintes et les alertes de dérive pour attraper la lente érosion avant qu’elle ne devienne une pluie de tickets.

La loterie du silicium ne disparaît pas. Mais vous pouvez arrêter de la laisser piloter votre plan de capacité et vos pagers.

← Précédent
ZFS sur Proxmox vs VMFS sur ESXi : instantanés, performances, récupération et pièges concrets
Suivant →
ZFS offline/online : Mode maintenance sans compromettre la redondance

Laisser un commentaire