RaphAstronome

samedi, 23 janvier 2010

Temps d'exécution et re-nice d'un plugin munin

Le fichier /etc/munin/plugin-conf.d permet aussi de configurer le temps maximal d'exécution d'un script munin avec l'option "timeout".

Cette commande ne deverait pas être utilisé sur un serveur en production. Par défaut le temps d'exécution est de 10 secondes. C'est déjà très long : imaginez que chaqu'un de vos plugins prennent tout ce temps ! L'exécution de chaqu'un d'entre eux ne devrait pas dépasser une fraction de seconde si on ne veux pas que les applications qui tournent sur le serveur soit gênés.

Dans le cas où cela serait obligatoire l'ajout d'un "nice" dans la commande peut être une bonne chose :

[nom_plugin]
timeout 50
command nice %c

Mise à jour : Le changement de timeout ne semble pas fonctionner avec Ubuntu Lucid Lynx.

jeudi, 31 janvier 2008

Time avec paramètres : marche pas.

Pour voir la durée d'exécution d'un programme de manière un peu plus précise et simple qu'avec un chronomètre il y a la commande time. De plus le temps CPU dédié au processus (user) et système (sys) est affiché :

$ time sleep 10
real    0m10.023s
user    0m0.004s
sys     0m0.000s

Ici l'instruction "sleep 10", attend 10 secondes et ne consomme presque pas de CPU.

On va mettre en forme tout ça pour par exemple l'utiliser dans un script pour ça il y a l'option --format, qui peut éventuellement être réduit à -f mais ici :

$ time -f "%e" sleep 10
bash: -f : commande introuvable
real    0m0.157s
user    0m0.116s
sys     0m0.028s

Baf ! Marche pas il à essayé d'exécuter la commande "-f" au lieu de sleep.

Ce problème est bizarre mais quelques part il fallait s'y attendre : mais comment bash et time peut deviner où est la commande et où sont les paramètres ? En fait la solution est elle aussi bizarre car on peut résoudre le problème en mettant le chemin complet de la commande time :

$ /usr/bin/time -f "%e" sleep 10
10.00

Ca marche ! Le temps d'exécution de la commande sleep est bien de 10 secondes.

Si quelqu'un sait pourquoi il y a un tel changement qu'il me le dise, merci.

mercredi, 13 juin 2007

Charge du système

Un processeur (simple core) ne peut exécuter qu'un seul programme à la fois. Pour pouvoir en exécuter plusieurs simultanément l'ordonnanceur du système d'exploitation (ex: Windows, Linux ...) va exécuter les programmes par intermittence. Par exemple si 2 processus tournent le premier sera exécuté pendant, par exemple, 5 milli-secondes puis le deuxième prend le relais 5ms et ainsi de suite jusqu'a ce que les processus soit terminées, ou déactivés d'une manière ou d'une autre (attente d'une action de l'utilisateur par exemple). Cette méthode permet à l'utilisateur de voir les 2 processus ce dérouler simultanément, et pourquoi pas interagir entre eux.

Sur les système de type Unix (et donc Linux) il existe un nombre qui permet d'avoir une idée de l'utilisation de l'ordinateur par les différents processus : la charge système ou load average.

  • Vous comprendrez vite que si il n'y a aucun processus en cours d'exécution, le processeur ne sera pas du tout utilisé (charge = 0).
  • Si il y a des processus lancés mais qu'ils n'utilisent pas totalement le processeur la charge est entre 0 et 1 . C'est le cas le plus courant sur les machines domestiques lorsqu'on fait du traitement de texte ou une autre activité qui ne consomme que peu de ressources du processeur.
  • Si le processeur est juste suffisant pour exécuter toutes les requêtes sans avoir à les mettre en attente la charge est de 1 mais c'est bien entendu très rare.
  • Si l'ordinateur travaille à fond mais n'arrive pas à exécuter toutes les requêtes lorsque les processus le désirerait la charge devient supérieure à 1, les requêtes sont alors mises en attente.

On pourrait penser qu'une charge supérieure à 1 provoquerait la mise en attente d'une liste de plus en plus importante requêtes jusqu'au plantage. Ceci peut arriver mais dans la pratique il faut une charge de plusieurs dizaines voire centaines pour que ça arrive. En effet de nombreux facteurs font que ce n'est pas si grave :

  • Les tâches sont exécutés plus tard ils demandent donc un temps supplémentaire plus tardivement, il en résulte un ralentissement des programmes.
  • Les tâches peuvent avoir des priorité différentes (paramètre "nice") le processeur exécutera en priorité certains processus. Boinc par exemple effectue ces calcul sur le temps inutilisé du processeur ce qui fait que la charge est toujours supérieure à 1 mais qu'il n'y est pas de ralentissement des autres programmes puisque ce dernier laisse place aux processus prioritaires.

Attention toutefois ce nombre inclus aussi les latences des entrées sorties (accès disque, réseau etc...) Ce fait est très important lorsqu'on veut réduire la charge : en effet avec une charge de 2.6 on pourrait penser qu'il faut un processeur 2.6 fois plus puissant. En fait pas forcément ça peut venir de beaucoup de choses et les remèdes sont variées :

  • Disque dur très sollicité (SWAP ou cache disque trop petit) : augmentez la RAM, si c'est pour un serveur de fichiers il est possible de mettre des disques en RAID pour augmenter leur débit.
  • Processeur(s) a 100% : c'est lui qui est limitant il en faut un plus puissant.
  • La carte graphique : ce voit surtout sur les jeux, activez la sycro verticale histoire de ne pas gaspiller les performances du GPU. Si vous le programmez utilisez si possible les listes d'affichages et VBO plutôt que le mode rendu immédiat.
  • Il est possible que ce soit dû à plusieurs éléments ou des composants qui ne sont pas dans cette liste.

L'utilisation le logiciels plus léger ou leur répartition sur plusieurs ordinateurs peut bien sur améliorer les choses ;) !

Certains programmes de calcul ou de jeu s'octroie autant de processeur qu'il le peuvent, à cause de leur conception, plus la machine est puissante plus il calculera vite, il collera toujours le processeur à 100%. Si c'est un jeu ça ne pose pas de problème car il est rare de jouer et faire être chose en même temps. Si le besoin ce fait sentir on peut augmenter le paramètre "nice" pour que ce processus soit traité avec une priorité plus faible mais avec un risque de saccades.

La charge est donnée par processeur donc sur les machines qui en possèdent plusieurs (ou multi-core) la charge normale sera celle du nombre de cores.