Il y a quelque temps, je me suis procuré deux serveurs Supermicro usagés que nous utilisons pour construire notre laboratoire avec Proxmox. Les deux serveurs de modèles Supermicro SuperServer 6016T-MTLF équipés d’une carte mère X8DTL-if. Ces serveurs sont stables, mais un peu vieux. Cependant, pour nos besoins actuels, les serveurs répondent à nos attentes en termes de performance. Avec 24 Go de RAM chacun, cela suffit pour notre installation Proxmox.

Cela dit, ces deux serveurs sont très bruyants et ce n’est même pas l’alimentation qui produit ce bruit, mais les 5 ventilateurs qui fonctionnent à la vitesse maximale chaque fois que le CPU est un peu sollicité. Sous une très faible charge, les ventilateurs démarrent à pleine vitesse et dans les 30 secondes suivantes, ils reviennent à la normale.

En ce qui concerne les paramètres du BIOS, les options pour contrôler les ventilateurs sont minimes:

  • Full Speed/FS

  • Performance/PF

  • Balanced/BL

  • Energy Saving/ES.

La meilleure option pour notre besoin est «Energy Saving / ES», mais cette option a ce comportement étrange de faire fonctionner soudainement toutes les ventilateurs à 100%.

Après avoir creusé un peu, j’ai découvert que les ventilateurs étaient contrôlés par un “chipset” Winbond W83627DHG-P. Cette information est aussi confirmé par le manuel d’utilisation de Supermicro. La fiche technique du “chipset” révèle qu’il est capable de fournir beaucoup plus d’options. Il existe de nombreuses options pour contrôler la vitesse des ventilateurs en fonction de la température du système. Celles-ci devraient suffire à modifier la vitesse des ventilateurs selon nos attentes, mais le BIOS Supermicro ne présente pas ces options à l’utilisateur.

Le noyau Linux fournit un pilote pour gérer ce “chipset” et cela nous permet de le reconfigurer avec des valeurs saines. Après avoir expérimenté le fonctionnement du pilote, ce n’est pas une solution viable, car il interroge le “chipset” à intervalles réguliers. Après une période de temps, ce comportement entre en conflit avec l’interrogation effectué par BCM (IPMI) et provoque une impasse rompant la communication avec le “chipset”. Ceci est donc une mauvaise solution, car nous perdons le contrôle des ventilateurs et perdons les données des capteurs récupérées par BCM (IPMI).

Après quelques expérimentations, j’ai découvert qu’il est possible de reconfigurer ce “chipset” manuellement à l’aide d’i2c de manière très similaire à celle du pilote. Le résultat de mon travail est disponible gratuitement sur github: https://gist.github.com/ikus060/26a33ce1e82092b4d2dbdf18c3610fde

Installation

Pour l’installer sur votre système, vous devez installer quelques dépendances.

sudo apt-get install python-smbus

Vous devez également activer le pilote i2c-dev en éditant le fichier /etc/modules:

i2c-dev

Enfin, télécharger le script:

sudo wget -O /usr/local/bin/smx8fancontrol https://gist.github.com/ikus060/26a33ce1e82092b4d2dbdf18c3610fde/raw/2b12bff6d880c9dec69c0b74e0fb9025b2be559c/smx8fancontrol
sudo chmod +x /usr/local/bin/smx8fancontrol

Usage

Une fois installé, vous devriez être en mesure d’exécuter le script à partir d’une ligne de commande. Par défaut, le script affichera la configuration du “chipset”.

$ sudo smx8fancontrol

------
Temp1
Mode: Smart Fan Control
Fan mapping Relationships (T1FMR): Fan1 Fan2 Fan3 Fan4 Fan5 Fan6 Fan7 Fan8
Smart Fan Control Table (SFIV)
   42C   47C   47C   47C   47C   47C   47C
   40%  100%  100%  100%  100%  100%  100%
Thermal Cruise (TTTI): 40C
Critical Temperature (T0CTFS): 47C
Hysteresis (HT0): 5C
------
Temp2
Mode: Smart Fan Control
Fan mapping Relationships (T2FMR): Fan1 Fan2 Fan3 Fan4 Fan5 Fan6 Fan7 Fan8
Smart Fan Control Table (SFIV)
   42C   47C   47C   47C   47C   47C   47C
   40%  100%  100%  100%  100%  100%  100%
Thermal Cruise (TTTI): 40C
Critical Temperature (T1CTFS): 47C
Hysteresis (HT1): 5C
------
Temp3
Mode: Smart Fan Control
Fan mapping Relationships (T3FMR):
Smart Fan Control Table (SFIV)
   42C   47C   47C   47C   47C   47C   47C
   40%  100%  100%  100%  100%  100%  100%
Thermal Cruise (TTTI): 40C
Critical Temperature (T2CTFS): 47C
Hysteresis (HT2): 5C
------
Temp4
Mode: Smart Fan Control
Fan mapping Relationships (T4FMR):
Smart Fan Control Table (SFIV)
   42C   47C   47C   47C   47C   47C   47C
   40%  100%  100%  100%  100%  100%  100%
Thermal Cruise (TTTI): 40C
Critical Temperature (T3CTFS): 47C
Hysteresis (HT3): 5C
------
Temp5
Mode: Smart Fan Control
Fan mapping Relationships (T5FMR): Fan1 Fan2 Fan3 Fan4 Fan5 Fan6 Fan7 Fan8
Smart Fan Control Table (SFIV)
   42C   47C   47C   47C   47C   47C   47C
   40%  100%  100%  100%  100%  100%  100%
Thermal Cruise (TTTI): 40C
Critical Temperature (T4CTFS): 47C
Hysteresis (HT4): 5C
------
Temp6
Mode: Smart Fan Control
Fan mapping Relationships (T6FMR):
Smart Fan Control Table (SFIV)
   42C   47C   47C   47C   47C   47C   47C
   40%  100%  100%  100%  100%  100%  100%
Thermal Cruise (TTTI): 40C
Critical Temperature (T5CTFS): 47C
Hysteresis (HT5): 5C
------
Fan1
Output Nonstop Value (F1ONV): 40%
------
Fan2
Output Nonstop Value (F2ONV): 40%
------
Fan3
Output Nonstop Value (F3ONV): 40%
------
Fan4
Output Nonstop Value (F4ONV): 40%
------
Fan5
Output Nonstop Value (F5ONV): 40%
------
Fan6
Output Nonstop Value (F6ONV): 40%
------
Fan7
Output Nonstop Value (F7ONV): 40%
------
Fan8
Output Nonstop Value (F8ONV): 40%


À première vue, le résultat semble un peu cryptique, nous analyserons donc les résultats.

Il existe 6 capteurs de température disponibles sur ce “chipset”. Je ne suis pas sûr que tous soient liés à quelque chose d’important. Par défaut, seulement 3 d’entre eux sont utilisés pour contrôler les ventilateurs. Pour chaque capteur de température, nous avons un bloc d’informations similaire à celui-ci:

Temp1Description
Mode: Smart Fan ControlDéfinit le mode de fonctionnement de ce capteur de température. Soit "Smart Fan Control" ou "Thermal Cruise Control".
Correspondances des fans (T1FMR): Fan1 Fan2 Fan3 Fan4 Fan5 Fan6 Fan7 Fan8Utilisé par "Smart Fan Control" ou "Thermal Cruise Control". Définit la relation entre les capteurs de température et les ventilateurs. Ce paramètre est généralement utilisé pour définir la zone. Par exemple: le CPU doit être refroidit par le ventilateur attaché au CPU. Dans notre cas, c'est plutôt inutile, puisque le CPU est passivement refroidi. Nous avons donc configuré tous les ventilateurs pour être contrôlé par Temp1 et Temp2.
Smart Fan Control Table (SFIV)Utilisé par "Smart Fan Control". Ce tableau démontre bien la connexion entre la température et la vitesse des ventilateurs. Lorsque la température est <= 42⁰C, le ventilateur fonctionnera à 25%. Lorsque la température est >= 60° C, le ventilateur fonctionnera à 100%. Les valeurs intermédiaires sont calculées linéairement. par exemple: si la température est de 52 ° C, les ventilateurs fonctionnent à ~ 69%
42C 47C 47C 47C 47C 47C 47C
40% 100% 100% 100% 100% 100% 100%
Thermal Cruise (TTTI): 40CUtilisé par "Thermal Cruise Control". Definit la température ciblée pour ce capteur.
Critical Temperature (T0CTFS): 47CUtilisé par "Smart Fan Control" ou "Thermal Cruise Control".Définit une limite supérieure de température. Lorsque cette température est atteinte, les ventilateurs contrôlés par ce capteur fonctionneront à 100%.
Hysteresis (HT0): 5CUtilisé par "Smart Fan Control" ou "Thermal Cruise Control". Pour éviter de modifier la vitesse du ventilateur lorsque les capteurs de température sont instables, il utilise l'hystérésis pour atténuer la valeur.

Par exemple: Avec un capteur de température de 45° C et un hystérésis réglé à 2° C, la température peut fluctuer entre 43° C et 47° C sans affecter la vitesse du ventilateur. Si la température atteint 48° C, la vitesse du ventilateur sera modifiée en fonction du mode de contrôle actuel.

Lorsque vous utilisez ce script, vous réalisez que les valeurs définies par défaut dans le BIOS ne sont pas appropriées. La limite inférieure est définie à 42° C et la limite supérieure est de 47° C avec une hystérésis de 5 ° C. Fondamentalement, dire au “chipset” de faire fonctionner le ventilateur à 40% tout le temps. Sauf si supérieur à 47° C, dans un tel cas, faire fonctionner les ventilateurs à 100%. Il n’y a pas d’augmentation en raison de l’hystérésis de 5° C qui équivaut à la différence entre 47 ° C et 42 ° C.

$ sudo smx8fancontrol --help
usage: smx8fancontrol.py [-h] [-m {smart,cruise}] [-p PWM] [-t TEMP]
                         [-H HYSTERSIS]

Change SuperMicro X8 Fan Control.

optional arguments:
  -h, --help            show this help message and exit
  -m {smart,cruise}, --mode {smart,cruise}
                        Set the fan mode: smart or cruise. smart: to use Smart
                        Fan mode. cruise: to use Thermal Cruise mode.
  -p PWM, --pwm PWM     Set Fan Duty (in percentage).
  -t TEMP, --temp TEMP  Set Temperature (in Celsius) associated to pwm.
  -H HYSTERSIS, --hystersis HYSTERSIS
                        Set Hystersis value in degree (0-15)

Sur mon système, pour obtenir un bon équilibre entre le bruit des ventilateurs et la température, j’utilise cette commande pour changer les valeurs des capteurs.

sudo smx8fancontrol -m smart -p 25,50,100 -t 42,47,60 -H 2

J’espère que ce script sera utile à d’autres personnes, même si le matériel est un peu vieux.