Forum Programmation.perl Amélioration d'un script de gestion de la vitesse des ventilateurs.

Posté par  .
Étiquettes : aucune
0
9
juin
2007
Bonjour à tous !
Il y a un certain temps, j'avais utilisé ce script perl pour gérer automatiquement la vitesse des ventilateurs du CPU :
#!/usr/bin/perl -w

# Fichier de gestion de la vitesse de ventillo

$vitesse_ventil= "/sys/bus/i2c/devices/9191-0290/pwm1";

while (1) {

# Lecture de la température stockée dans $temp
$temp = `cat /sys/bus/i2c/devices/9191-0290/temp3_input`;


if($temp < 45000)
{
exec (`echo 213 > $vitesse_ventil`);
}

if($temp > 45000 and $temp < 50000)
{
exec (`echo 232 > $vitesse_ventil`);
}
if($temp > 50000 and $temp < 57000)
{
exec (`echo 240 > $vitesse_ventil`);
}
sleep 5;

# Ca commence à chauffer
if($temp > 57000)
{
# la commande print permet de ressortir un message
# permettant le debogage
# print "superieur:".$temp."\n";

# On passe les ventillos à fond
exec (`echo 255 > $vitesse_ventil`);

# On devrait pouvoir faire chuter la fréquence
#exec (`echo 532000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed & echo 532000 > /sys/devices/system/
# cpu/cpu0/cpufreq/scaling_max_freq & echo 532000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq`);
# On informe le journal systeme que nous avons depassé 57°C

exec (`echo "ATTENTION Temperature depasse 57°: $temp" >> /var/log/syslog`);
}
}
# pause entre chaque lecture
sleep 2;



Ce script marche parfaitement bien. Je sais qu'il existe Fancontrol qui permet de faire ça (avec un outils de configuration assez simple) mais je préfère utiliser ce script et l'améliorer. En fait je veux m'inspirer de l'algorithme utiliser par Fancontrol :

fancontrol first reads its configuration, writes it to arrays and loops its main function. This function gets the tem‐
peratures and fanspeeds from lm_sensors proc files and calculates new speeds depending on temperature changes, but only
if the temp is between MINTEMP and MAXTEMP. After that, the new values are written to the PWM outputs. Currently the
speed increases quadratically with rising temperature. This way you won’t hear your fans most of the time at best.


Le problème avec l'actuel script perl, c'est évidemment le phénomène d'oscillation autour de la valeur seuil 57°C qui fait que le ventilateur ralentit puis accélère, etc...

Evidemment, ca n'arrive que très rarement, mais je pensais qu'on pouvait améliorer ça..
Qu'en pensez vous ?

Merci.
  • # Fonction(s) de lissage ?

    Posté par  . Évalué à 2.

    Bonjour,

    Pour gérer les seuils de manière plus "lisse", tu peux utiliser une ou plusieurs fonction(s) (affine, polynomiale, quadratically :P, ... - avec ou sans mémoire) pour le calcul de la vitesse de rotation du ventilateur.
    Cela remplacera les "sauts" (213, 232, 240 ...) par des valeurs (si elles sont supportées par le noyau et le ventilateur) "continues" [par morceaux].

    Par exemple, je pourrais dire que la vitesse du ventilateur est:

    V = MIN (255, 200 + ($temp/1000 - 10))

    Ce calcul est très approximatif mais donne une idée :-)

    Note: Cela me rappelle les cours de mathématiques pour le calcul des intégrales...

    Après, pour compléter, tu peux stocker un mini historique (un petit tableau des valeurs antérieures, genre dans un RRA/RRD ^__^) et modifier le calcul grâce à ta connaissance du passé (et donc de l'évolution de la température sur une petite période, un peu comme le load average).

    Aussi, tu peux ajouter d'autres paramètres (la température d'un autre élément, la charge CPU, l'heure [si tu as des tâches programmées], ...)

    Voili voilà quelques pistes.

    Bon courage !

    Cdlt,

    PS: Il y a bcp de fonctions/modules Perl (parfois même dans la base d'install) comme open/<>/print/close, Sys::Syslog ou Unix::Syslog ou Logger::Syslog....
    • [^] # Re: Fonction(s) de lissage ?

      Posté par  . Évalué à 1.

      Oki merci, Perl est donc capable de gérer des fonctions mathématiques avancées ?
      Désolé, mais je connais pas grand chose aux scripts ;)
      J'essayerai d'étudier ça quand j'aurai un peu plus de temps ;)
      Perso en Physique j'avais vu un truc du genre http://perso.orange.fr/y.a.g./asserv/four.htm pour l'asservissement ;)

      Quand tu parles de tableau du "passé" c'est un peu ça non ?
    • [^] # Hystérésis

      Posté par  . Évalué à 2.

      Sinon il y a aussi le principe de l'hystérésis : la limite n'est pas la même selon que la température monte ou descende.
      Je sais pas trop comment l'expliquer, je trouve http://fr.wikipedia.org/wiki/Hysteresis carrément pas terrible.
      Mais à ce que j'en sais, c'est utilisé fréquemment sur les systèmes de thermostat exactement pour cette raison.
      Je vais essayer sur un exemple. Si tu veux une limite à mettons 57°, tu vas décider d'une autre limite inférieure, mettons 55°.
      Au départ, la température est inférieure au deux.
      Si elle monte, rien ne change jusqu'à 57°. À 57° un changement se déclenche, qui provoque (ou pas...) une baisse de température.
      La température descend, et arrive à 57° mais rien ne se passe. Ce n'est que quand on descend à 55° que le système repasse au régime inférieur etc.
      En gros, les seuils de déclenchement ne sont pas les mêmes que l'on soit au dessus ou en dessous des valeurs critiques.

      Cela dit je trouve la version affine plus "jolie" (normal je suis plutôt matheux à la base), mais selon les systèmes, on ne pas pas toujours y avoir recours. Il faut pour ça que les valeurs possibles ne soient pas trop "discrètes".
      • [^] # Re: Hystérésis

        Posté par  . Évalué à 1.

        Salut,
        Oui je connais le principe des cycles d'hystérésis (dit à mémoire). Effectivement, c'est un peu ce que fait Fancontrol ;)
        C'est peut être plus simple à formaliser en Perl que la méthode précédente...?
        • [^] # Re: Hystérésis

          Posté par  . Évalué à 2.

          Bonjour,

          Pour l'implémentation, je ne pourrais pas répondre à ta place (qui va nous coder tout cela :P)
          Pour le choix, je "pertinent" [LinuxFR (c)(r)] la proposition d'hystérésis :-)
          L'approche du "four" est didactique et donne un aperçu de ce que l'on peut faire à ce sujet.

          Pour illustrer l'idée du RRA/RRD, cela te permet aussi de profiter des mesures pour les représenter graphiquement (cacti ? munin ?) et voir les évolutions pour peut-être corriger le tir.

          Pour illustrer les tâches programmées, je pense évidemment au crontab (hourly ?, daily, weekly...). Tu peux préparer un environnement plus "frais" en avance de phase (en refroidissant plus que nécessaire dans un laps de temps avant).

          Quel sujet vaste !

          Bon courage !

          Cdlt,

          PS: CPAN [http://search.cpan.org] est le compagnon privilégié de Perl
          Par exemple, il y a un module Math::LP [http://search.cpan.org/~wimv/Math-LP-0.03/lib/Math/LP.pm] assez sympathique

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.