Image de la famille Peaudecerf

Serveur Dell trop bruyant.

Le: 26 juillet 2021

Script pour réduir le bruit des ventilateurs du serveur Dell:

Mon serveur, un PowerEdge Dell avec un IDRAC 7, fonctionnant avec un ESXI, fait beaucoup trop de bruit. Les ventilateurs sont entre 40% et 60% de leur vitesse maximum.

Ma configuration:

IDRAC7 version: 2.65.65.65
2 CPU
16 slots de mémoire utilisées
7 disques SAS

J'ai décidé de varier la vitesse des ventilateurs suivant la temperature d'entrée du serveur et, d'appliquer une règle si la temperature des CPU dépassaient 50°C.

Soit, Fan % = ((T°ext  x  3)  - 60)  x  1,3
Et, si CPU supérieure à 50° alors Fan % = Fan % + (( T°cpu  -  50)  x  3)

Afin de récupérer et d'envoyer ces informations, j'utilise ipmitool

  - Dans l'IDRAC j'ai activé l'accès à l'IPMI depuis le réseau.  active ipmi



  - J'ai créé un nouveau USER (tuto):

Paramètre de l'IDRAC / Authentification utilisateur  new user



  - J'ai autorisé ce USER (tuto) à utiliser l'IPMI  toto lan

 

Installation de ipmitool sur un Ubuntu tournant sur cet ESXI (ou ailleurs):

sudo apt install ipmitool

Verification de la communication:

ipmitool -I lanplus -H 10.10.10.10 -U tuto -P 'passpartout' sdr type "Temperature"
Inlet Temp | 04h | ok | 7.1 | 23 degrees C
Temp | 0Eh | ok | 3.1 | 48 degrees C
Temp | 0Fh | ok | 3.2 | 47 degrees C

Script pour réduire le bruit :

nano /var/ipmi/temp-ventillateur.sh

#!/bin/bash
#
#definitions des variables
LOG="/var/log/ipmi"
IP="10.10.10.10"
USER="tuto"
password="passpartout"
#### Mail
SENDMAIL="/usr/sbin/sendmail"
DE="Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser."
A="Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser."
#
DATE=$(date +%d/%m/%Y)
HEURE=$(date +%Hh:%Mm:%Ss)
total_erreur=0
# creer le repertoire log
if [ ! -d ${LOG} ];then
mkdir ${LOG}
fi
## exec 1>> ${LOG}/ipmitool.log
exec 2>> ${LOG}/error.log
# Saisie de l'heure de debut
echo "#" >> ${LOG}/ipmitool.log
echo "#" >> ${LOG}/ipmitool.log
echo "##### Le :" $DATE "a" $HEURE "#####" >> ${LOG}/ipmitool.log
OLDFANS=$(ipmitool -I lanplus -H $IP -U $USER -P $password sensor reading Fan1 | awk '{ print $3 }')
echo "Vitesse: $OLDFANS RPM" >> ${LOG}/ipmitool.log
# Temperature Carte mère, cpu1 and cpu2
OUTPUT=$(ipmitool -I lanplus -H $IP -U $USER -P $password sdr type temperature | sed -e 's/Temp\(.*0Eh\)/Cpu1\1/' -e 's/Temp\(.*0Fh\)/Cpu2\1/')
# Temperature ambiante
AMBIANTE=$(echo $OUTPUT| awk -F'|' '{ print $5 $9 $13 }' | awk '{ print $1 }')
# Temperature CPU1
CPU1=$(echo $OUTPUT| awk -F'|' '{ print $5 $9 $13 }' | awk '{ print $5 }')
# Temperature CPU2 CPU2=$(echo $OUTPUT| awk -F'|' '{ print $5 $9 $13 }' | awk '{ print $9 }')
echo "T° ambiante : $AMBIANTE" >> ${LOG}/ipmitool.log
# Si T° trop basse, on fix à 10%
if [ "$AMBIANTE" -gt "4" ] && [ "$AMBIANTE" -lt "23" ]
then
echo "Modif du à la T° ambiente" >> ${LOG}/ipmitool.log
NEWFANS=10
else
NEWFANS=`echo "(($AMBIANTE*3)-60)*1.3" | bc -l`
fi
echo "T° CPU1 : $CPU1" >> ${LOG}/ipmitool.log
echo "T° CPU2 : $CPU2" >> ${LOG}/ipmitool.log
if [ "$CPU1" -ge "$CPU2" ]
then
CPU=$CPU1
else
CPU=$CPU2
fi VCPU=0
echo "le CPU le plus chaud est à $CPU °C" >> ${LOG}/ipmitool.log
if [ "$CPU" -gt "50" ]
then
VCPU=`echo "($CPU-50)*3" | bc -l`
echo "## Du à cette T°, on ajoute au calcule : $VCPU ##" >> ${LOG}/ipmitool.log
NEWFANS=`echo "($NEWFANS+$VCPU)" | bc`
fi
# On retire tous apres le point
NEWFANS=${NEWFANS%.*}
# On limite à 10 % (peut etre retiré)
if [ "$NEWFANS" -lt "10" ]
then
NEWFANS=10
fi
# On limite à 100 %
if [ "$NEWFANS" -gt "100" ]
then
NEWFANS=100
fi
# Test des sensors
# Si $xx grep (rechercher une chaîne de caractères dans un fichier) où wc -m (affiche le nombre de caractères) equale 0
if [ $(echo "$CPU1" | grep -E '^[0-9]+$' | wc -m) -eq 0 ] || [ $(echo "$CPU2" | grep -E '^[0-9]+$' | wc -m) -eq 0 ] || [ $(echo "$AMBIANTE" | grep -E '^[0-9]+$' | wc -m) -eq 0 ]
then
echo "##!!## Erreur d'un sensor de T° ##!!##" >> ${LOG}/ipmitool.log
NEWFANS=100
((total_erreur++))
fi
if [ "$CPU1" -gt "75" ] || [ "$CPU1" -lt "20" ] || [ "$CPU2" -gt "75" ] || [ "$CPU2" -lt "20" ] || [ "$AMBIANTE" -gt "38" ] || [ "$AMBIANTE" -lt "5" ]
then
echo "## Erreur d'un sensor de T°. Limite atteinte !! ## " >> ${LOG}/ipmitool.log
NEWFANS=100
fi
echo "La nouvelle vitesse envoyée : $NEWFANS %" >> ${LOG}/ipmitool.log
# Hexadecimal
NEWFANS=`printf "%x\n" $NEWFANS`
ipmitool -I lanplus -H $IP -U $USER -P $password raw 0x30 0x30 0x02 0xff 0x$NEWFANS
if [[ "$?" > 0 ]]
then
((total_erreur++))
fi
# si erreur, je log l'heure et j'envoie un mail
if [[ "$total_erreur" > 0 ]]
then
echo "# Il y a eu un probleme dans la gestion des ventilateurs. regarder aussi le fichier: ${LOG}/ipmitool.log" 1>> ${LOG}/error.log
echo "Les lignes du dessus sont du: ${DATE} a ${HEURE}
## Creation du mail
SUBJECT="Subject: Erreur pendant la gestion des ventilateurs";
BODY="Bonjour,
Le script de la gestion des ventilateurs a généré au moins 1 erreur.
Il est important de verrifier ces 2 fichiers:
"${LOG}"/error.log
et
"${LOG}"/ipmitool.log
Ce message est envoyé par: /var/perso/temp-ventilateur.sh
"${USER}""
#### ENVOIE Mail
echo "from:"$DE > /tmp/ventilateurs.txt
echo "to:"$A >> /tmp/ventilateurs.txt
echo "$SUBJECT" >> /tmp/ventilateurs.txt
echo "MIME-Version: 1.0" >> /tmp/ventilateurs.txt
echo "Content-Type: text/plain; charset=\"utf-8\"" >> /tmp/ventilateurs.txt
echo "$BODY" >> /tmp/ventilateurs.txt
cat /tmp/ventilateurs.txt | $SENDMAIL -t
fi

 

Vous avez pu remarqué que si une température n'est pas lue ou n'est pas entre 20° et 75° pour les CPU et entre 5° et 38° pour la T° ambiante, les ventilateurs sont alors paramétrés à 100% du max.

Un fichier de log est ajouté à chaque lecture du script (/vat/log/ipmi).

Un mail est envoyé à chaque fois qu'une erreur est détectée.

 Autoriser le script à être exécuté:

chmod +x /var/perso/temp-ventillateur.sh

 Mise en place d'une tache Cron:

sudo crontab -e
*/1 * * * * /var/ipmi/temp-ventillateur.sh

Nettoyage des log:

sudo nano /etc/logrotate.d/temperature
/var/log/ipmi/error.log
/var/log/ipmi/ipmitool.log
{
size 50k
rotate 7
compress
}

A CHAQUE DEMARRAGE AVEC PERTE DE COURANT (et, avant la premiere utilisation du script) :

Utilisation manuel du contrôle des ventilateurs :

Sous linux : (à lancer automatiquement au demarrage du serveur)

ipmitool -I lanplus -H 10.10.10.10 -U tuto -P 'passpartout' raw 0x30 0x30 0x01 0x00

Sous windows :

ipmitool -I lanplus -H 10.10.10.10 -U tuto -P "passpartout" raw 0x30 0x30 0x01 0x00

 

Ajouter un commentaire