Archive | admin

Comprendre la load average d’une machine Linux

Posted on 30 August 2011 by Thomas Ginestet

J’ai entendu dire beaucoup de choses sur l’interprétation de la load average affichée par la commande top sous Linux.

Tout d’abord, un petit rappel de ce que nous indiquent les trois champs de load average:

load average: 0.15, 0.27, 0.07

0.15 représente la charge moyenne de la dernière minute.
0.27 représente la charge moyenne des cinq dernières minutes.
0.07 représente la charge moyenne des quinze dernières minutes.

Ce qui revient souvent et qui est compris de travers, c’est de dire qu’une machine est surchargée si sa load average est supérieure à 1. C’est erroné sauf si votre machine n’a qu’un seul processeur, monocore de surcroît…
Ce qui est vrai, c’est qu’une machine peut être considérée comme surchargée si chacun de ses cores (et non pas de ses processeurs…) à une load average supérieure à 1.

Quelques exemples pour mieux comprendre:

- un dual proc, mono core = 2 cores -> load average ok jusqu’à 2.
- un dual proc, dual cores = 4 cores -> load average ok jusqu’à 4.
- un dual proc, quad cores = 8 cores -> load average ok jusqu’à combien ?

Bon ok, c’est un peu  grossier comme raisonnement. On va dire qu’en tant que bon admin, vous vous serez soucié du problème de charge avant que celle-ci soit supérieure ou égale au bottleneck.

Encore faudrait-il que vous sachiez de combien de processeurs et de coeurs votre machine dispose. Facile, un ptit cat sur le /proc/cpuinfo va vous donner toutes les infos dont vous avez besoin. Par exemple sur ma machine:

thomas@cryonux:~$ cat /proc/cpuinfo
processor    : 0
vendor_id    : GenuineIntel
cpu family    : 6
model        : 15
model name    : Intel(R) Core(TM)2 CPU          6700  @ 2.66GHz
stepping    : 6
cpu MHz        : 2666.486
cache size    : 4096 KB
physical id    : 0
siblings    : 2
core id        : 0
cpu cores    : 2
apicid        : 0
initial apicid    : 0
fpu        : yes
fpu_exception    : yes
cpuid level    : 10
wp        : yes
flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dts tpr_shadow
bogomips    : 5332.97
clflush size    : 64
cache_alignment    : 64
address sizes    : 36 bits physical, 48 bits virtual
power management:
processor    : 1
vendor_id    : GenuineIntel
cpu family    : 6
model        : 15
model name    : Intel(R) Core(TM)2 CPU          6700  @ 2.66GHz
stepping    : 6
cpu MHz        : 2666.486
cache size    : 4096 KB
physical id    : 0
siblings    : 2
core id        : 1
cpu cores    : 2
apicid        : 1
initial apicid    : 1
fpu        : yes
fpu_exception    : yes
cpuid level    : 10
wp        : yes
flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dts tpr_shadow
bogomips    : 5333.46
clflush size    : 64
cache_alignment    : 64
address sizes    : 36 bits physical, 48 bits virtual
power management:

Les infos qui nous intéressent sont: le physical id pour déterminer le nombre de processeurs physiques et cpu cores pour le nombre de cores. Pour obtenir le nombre total de cores à prendre en compte pour la load average, il faut multiplier le nombre de physical id différents par le nombre de cpu cores affichés (peut importe le nombre de fois que vous le voyez affiché).

Ici je n’ai qu’un seul physical id (0) et 2 cpu cores, ce qui nous donne 1 x 2 = 2. Pour ceux qui ont bien suivi, cela ve dire que je n’ai qu’un seul processeur, mais dual cores.

Bonus: regardez la ligne siblings. Si le nombre de siblings = cpu cores, alors l’hyperthreading n’est pas activé. Si le nombre de siblings = 2 x cpu cores, alors l’hyperthreading est activé.

 

Attention cependant, car si le calcul d’une load average convenable se base sur les capacités CPU de votre machine, il ne faut pas résumer la charge d’une machine à sa charge CPU. Vous pouvez tout à fait avoir une load average trop élevée alors que la CPU est idle à 90%. La raison à cela ? Beaucoup de processus en attente de traitement (io). Mais du coup, ça vous aura au moins permis d’éliminer une cause potentielle de votre problème de perf ;-)

Comments (0)

Tags: , , , , , ,

Vos statistiques de performances système/réseau avec Nmon

Posted on 30 November 2010 by Thomas Ginestet

Nmon est un outil conçu pour surveiller en temps réel les performances système/réseau d’une machine mais permet également de les enregistrer lors d’un benchmark où pour une utilisation à long terme type capacity planning. Nmon a été à la base développé pour AIX afin de répondre au propre besoin de son auteur. Il existe cependant une version Linux (La version 13g est présente dans les dépôts de l’Ubuntu 10.10).

Nmon permet de remonter les infos types charge processeur, utilisation mémoire, io disques, processus, trafic réseau, etc. Continue Reading

Comments (0)

Tags: , , ,

Plugins Amanda pour Nagios

Posted on 09 September 2010 by Thomas Ginestet

Voici plusieurs scripts qui vous permettrons de vérifier via Nagios le bon fonctionnement d’une sauvegarde effectuée par Amanda. Les fonctionnalités sont les suivantes:

- amchecklabel.pl: vérification du label de la bande attendue pour la prochaine sauvegarde.

- amcheckconnection.pl: vérification de la connexion avec les clients Amanda qui seront sauvegardés lors de la prochaine sauvegarde.

- amstatus.pl: vérification que la sauvegarde se soit bien déroulée.

Ces scripts utilisent le plugin check_grep que vous trouverez dans le paquet nagios-of-plugins. Vous devrez également avoir configuré au préalable le plugin NSCA.


Quelques explications:

- $result: cette variable va contenir le résultat renvoyé par la commande check_grep sur la string ‘label ok’, string récupérée par la commande ‘/usr/local/sbin/amcheck my_amanda_config‘. Le résultat va être analysé et va permettre de définir un code d’erreur associé. Ce code d’erreur (0 si le résultat de la commande contient OK ou 2 si il contient CRITICAL) sera ensuite envoyé par NSCA à Nagios.

- $hosts: le nom du serveur de sauvegarde. Envoyé également avec le code d’erreur par NSCA.

- $service: le nom du service à déclarer dans Nagios. Envoyé également avec le code d’erreur par NSCA.

Rappelons que NSCA fonctionne sur le principe du check passif. Il vous faut alors rajouter l’exécution des scripts perl à la crontab afin d’automatiser tout cela.
Veillez à espacer de quelques minutes le amchecklabel.pl et le amcheckconnection.pl car ils sont tous deux basés sur la commande amcheck d’Amanda qui met un peu de temps à s’exécuter et qui risque de tirer la tronche si vous la lancez plusieurs fois de suite.
N’oubliez pas non plus de lancer amstatus.pl à une heure où vous êtes certain que votre sauvegarde soit bien finie, sinon vous obtiendrez une alarme Nagios en cadeau :-)

Voici un exemple de crontab (la mienne en fait…):

00 14 * * 1-5 su backup -c "/usr/lib/nagios/plugins/amchecklabel.pl"
05 14 * * 1-5 su backup -c "/usr/lib/nagios/plugins/amcheckconnection.pl"
00 08 * * 1-5 /usr/lib/nagios/plugins/amstatus.pl

Comments (0)

Tags: , , ,

Commandes Linux en vrac

Posted on 08 September 2010 by Thomas Ginestet

Issue de mon propre fichier pense-bête, voici une liste de commandes qui pourrait vous être utile. Certaines sont propres à leur distribution (je pense notamment à Debian / Ubuntu et Redhat / CentOs) mais la plupart sont génériques.

Cette liste est “brute” et évidemment loin d’être exhaustive, vous voici prévenu…

grep -l -> liste les fichiers qui contiennent la pattern

netselect et netselect-apt -> permet de choisir les meilleurs dépôts automatiquement en fonction du temps de réponse

DHCPStatus -> paquet permettant de voir le statu en cours des @IP attribuées et libres d’un serveur dhcp. Il faut installer le tar.gz disponible sur sourceforge

nmblookup -A @IP -> donne le nom de poste + @MAC ainsi que l’état d’activité de l’@IP donnée (nécessite le paquet samba-common)

fichier dhcpd.leases -> donne les ip en cours affectées par le serveur dhcp (généralement dans /var/lib/dhcp3/)

arp -an -> permet de lister les @ip et @mac associées en activité

e2image, dumpe2fs, debugfs -> commandes utiles ayant un lien avec fsck

set -> permet de voir toutes les variables déclarées pour l’utilisateur en cours

ngrep -> même chose que grep mais sur les trames réseau

find / -type f | xargs grep “mot” -> trouver un mot dans un fichier

lsof -> voir la liste des fichiers ouverts

shred -n 50 -z -u nom_fichier -> permet de supprimer efficacement un fichier (va réécrire du garbage 50 fois dessus puis des 0 et enfin supprimer le fichier)

-mmin n -> fichier dont les données ont été modifiées il y a n minutes (à utiliser avec find)

-nouser / -nogroup -> fichier dont l’uid / le gid ne correspond à aucun user / group (à utiliser avec find)

date –date=”-1 day” ou “1 days ago” -> donne la date d’hier

date –date=”1 day” -> donne la date de demain

printenv -> voir les variables d’environnement de l’utilisateur

htop -> version améliorée de top, bien plus claire et poussée

computer-janitor -> nettoie un système pour qu’il soit comme un système fraîchement installé.

iconv -> convertir l’encodage d’un fichier dans un autre type d’encodage

renice -> “reprioriser” un processus

pgrep -> permet de lister des processus de manière fine (ex: pgrep -u root -l va lister les processus de root)
pkill -> permet de tuer des processus de manière fine (mêmes commandes que pgrep)

gnutls-cli -> permet de faire des tests de connexion en tls/ssl

cat /etc/issue -> connaître la version de la distrib installée (ex: Ubuntu 8.10)
cat /etc/debian_version -> connaître le nom de code du projet de la version de la debian installée (ex: lenny/sid)

nohup -> Exécuter un programme en le rendant insensible aux déconnexions de l’utilisateur

unix2dos – dos2unix -> via le paquet tofrodos sous Ubuntu, permet de convertir un fichier txt du format Windows à Unix et réciproquement

cpulimit -> permet de limiter l’utilisation cpu d’un processus

wall -> envoyer des messages aux utilisateurs connectés sur la machine

sync -> Synchroniser les données en mémoire et celles sur disque.

tee -> Copier l’entrée standard sur la sortie standard et dans un fichier.

tr -> Traduire ou éliminer des caractères (ex: lower to upper case).

lshw -> donne des infos avancées sur l’ensemble du matos présent sur la machine

Lorsqu’on modifie le fichier de configuration d’un programme, on n’est pas obligé de le relancer: on peut l’obliger à relire son fichier de configuration. Pour cela, envoyer le signal -1 ou HUP. Ainsi la commande killall -HUP squid oblige squid à relire son fichier de configuration.

psgrep monprog -> donne le pid du prog
pidof monprog -> idem

script -> enregistre l’historique des commandes shell effectuées

blkid -> donne les UUID et LABEL des disques d’un système

udevinfo -a -p /sys/block/sda -> donne plein d’info sur le périphérique concerné
Si l’on ne connaît pas forcément la branche supérieure (ici /sys/block/sda) dans laquelle se trouve le périphérique:
udevinfo -a -p $(udevinfo -q path -n /dev/sda)

udevtest /class/scsi_generic/sg3 -> affiche les actions de udev sur le périphérique (ici sg3). Le /class/scsi…. est récupéré grâce à udevinfo

dumpe2fs -> affiche le nombre d’inodes sur une partitions

ulimit -a -> donne les capacités mémoire, nombre d’ouvertures de fichiers, etc

mount –bind olddir newdir -> permet de monter en parallèle une partie du filesystem déjà monté, sur un autre point de montage.
ex: dans un environnement chroot, pour mapper le /dev dans le chroot il faut faire mount –bind /dev /pointdemontageduchroot/dev avant de chrooter

strings -> peut permettre de parser un binaire pour retrouver de l’ascii

ethtool -> permet d’avoir des infos (ex: driver, vitesse) et de modifier les paramètres des cartes réseaux

chattr -> change les attributs avancés (sorte d’ACL). On peut empêcher la suppression d’un fichier même pour root, empêcher si l’on supprime un fichier que l’emplacement disque qui était occupé par ce fichier soit libéré tant que le disque n’est pas plein (on peu ainsi récupérer le fichier avec un outil de restauration)
lsattr -> affiches les attributs avancés

sysctl -a -> donne les options en cours du noyau utilisé
sysctl -w -> pour écrite…mais n’est pas conservé au reboot. Pour conserver, modifier /etc/sysctl.conf ou par ex echo 1 > /proc/sys/..

stat -> permet d’avoir des informations très précises sur les propriétés d’un fichier / filesystem
access: accès
modify: contenu
change: droits, attributs

rpm -qpl plop.rpm | grep etc -> liste les fichiers de conf de plop

sed -i ‘s/PW_HERE/password/g’ dbsetup.sql -> remplace dans dbsetup.sql le mot PW_HERE par password dans toutes les occurrences rencontrées

fuser -m -> permet de lister les processus accédant à un fichier

exporter des données en préservant les droits, fichiers spéciaux, …
dans le répertoire à exporter:
tar -cvf – . | (cd /mnt;tar -xvf -)
le tirer (-) = sortie standard

Pour créer de la swap supplémentaire:
sur partition où il reste de la place -> dd if=/dev/zero of=SWAP bs=1M count=100
mkswap SWAP (fichier créé)
swapon SWAP

à rentrer dans fstab si on veut le conserver au reboot

cat /proc/sys/vm/swappiness ou sysctl vm.swappiness -> donne la valeur de la proportion de swap utilisée par le système. Va de 0 à 100 (plus c’est haut, plus ça swap).

sysctl -w vm.swappiness=0 -> va modifier swapiness en lui affectant la valeur de 0. On peut aussi la modifier avec un echo.
Pour la modifier en dur, placer la directive dans /etc/sysctl.conf

cat /proc/numdupidd’unprocessus/status -> donne des infos sur le processus donné dont sa taille en mémoire

5% de l’espace disque est réservé pour le root pour des manoeuvres de secours par ex. On peut changer ce % avec tune2fs -m % /dev/hdxy

partprobe /dev/hdX -> permet d’appliquer par ex la création d’une nouvelle partition sans rebooter

uuencode -> conversion de binaire en texte, surtout utilisé pour l’envoi de mail

du -sh /rep -> donne un résumé en Mo (taille totale du répertoire et donc de ses sous répertoires)

pwd -> voir dans quel répertoire on se trouve

Comments (1)

Tags: , , , , ,

Plugin Zimbra pour Nagios

Posted on 03 September 2010 by Thomas Ginestet

En cas de boîte mail proche de la saturation, Zimbra peut prévenir par mail l’utilisateur concerné. C’est génial, mais partant du constat que beaucoup de (mes) utilisateurs ne lisent pas leurs mails dès que ça ressemble de près comme de très loin à de l’informatique, je me suis concocté un petit script en Perl me permettant d’avoir un visu sur les utilisateurs ayant leur messagerie saturée. Continue Reading

Comments (0)

Tags: , ,

Décalage lors d’une impression sur Brother MFC240C et Ubuntu

Posted on 22 June 2010 by adrien

Si comme moi vous rencontrez un problème étrange qui fait que vos impressions sont décalés vers le haut avec une imprimante MFC240C connectée à Ubuntu, essayez de taper cette commande, cela a résolu mon problème tout de suite:

sudo brprintconf_mfc240c -pt A4

source: http://doc.ubuntu-fr.org/imprimantes_brother#le_haut_des_documents_est_coupe

Comments (0)

Tags: , , , , , ,

Le SIP et la Neufbox

Posted on 09 June 2010 by adrien

Pour tous ceux qui se casse la tête à configurer un téléphone SIP derrière une neufbox de SFR, voici un petit mémo tiré de mon expérience.
Si vous voulez configurer un compte SIP de chez OVH, indiquez simplement dans le outbound proxy, sip.ovh.net et utilisez le port UDP 5962.
Pour bancher mon compte Neuftalk sur un téléphone SIP j’ai dû utiliser le port 5061 (par exemple) et créer une règle de NAT sur la neufbox qui prend en paramètres 5061 comme port externe et 5060 en port de destination. Bien sur n’oubliez pas d’attribuer une adresse statique dans l’onglet DHCP pour que votre téléphone ai toujours la même adresse IP.

Comments (0)

Tags: , ,

Nommer ses périphériques grâce à Udev

Posted on 20 May 2010 by Thomas Ginestet

J’ai eu récemment un problème sur un serveur de sauvegarde avec un chargeur de bandes LTO4 qui avait changé de nom après le reboot dudit serveur. Les fichiers de configuration qui comportaient une directive vers l’emplacement du chargeur de bandes n’ont pas apprécié…

J’ai donc décidé d’attribuer un nom immuable à mon périphérique, grâce à une règle UDEV. Après l’avoir identifié, cette règle va créer un lien symbolique vers le périphérique. Il est donc important d’être rigoureux pour fournir à udev une identification précise du matériel.

Pour procéder à cette identification, nous allons nous aider de udevadm info. Udev se basant sur sysfs (/sys) nous allons devoir au préalable trouver la correspondance entre le nom de mon périphérique dans /dev et celui dans /sys.

Dans /dev mon chargeur se nomme actuellement sg9, soit /dev/sg9. La commande suivante va me permettre de trouver sa correspondance dans /sys:

thomas@cryonux:~$ find /sys -name dev | grep sg9

me donne:

/sys/devices/pci0000:00/0000:00:06.0/0000:0c:00.0/0000:0d:08.0/host2/port-2:0/end_device-2:0/target2:0:0/2:0:0:1/scsi_generic/sg9/dev

Utilisons maintenant udevadm info afin de trouver des informations pertinentes pour l’identification du matériel:

thomas@cryonux:~$ udevinfo -a -p /sys/devices/pci0000:00/0000:00:06.0/0000:0c:00.0/0000:0d:08.0/host2/port-2:0/end_device-2:0/target2:0:0/2:0:0:1/scsi_generic/sg9/dev

Plein d’informations découpées en rubriques vont résulter de cette commande, le but étant de prendre celles qui permettent d’identifier simplement mais efficacement le périphérique.

Attention cependant à ne pas piocher les informations dans plusieurs rubriques différentes car udev considérant chaque rubrique comme un périphérique différent, votre règle ne fonctionnerait pas.

L’autre solution serait de séparer les informations dans votre règle udev en plusieurs lignes, mais rappelez vous que plus votre règle udev est simple, mieux c’est.

Une fois que vous avez trouvé votre bonheur, il ne reste plus qu’à créer la règle udev. Pour cela, il faut créer un fichier .rules dans /etc/udev/rules.d/ et, tout comme avec le fonctionnement des runlevels, spécifier l’ordre d’exécution de la règle.

Le mien s’appelle 55-chargeur-lto4.rules et contient uniquement la ligne suivante:

SUBSYSTEMS=="scsi",  ATTRS{model}=="PV-124T         ", ATTRS{type}=="8",  SYMLINK+="chargeur-lto4"

Vous noterez que j’ai rajouté aux informations trouvées grâce à udevinfo un attribut SYMLINK. Cet attribut correspond à un nom que j’ai donné à mon périphérique, sous forme de lien symbolique créé dans /dev/

Pour prendre en compte à chaud la modification on va lancer la commande:

thomas@cryonux:~$ udevadm trigger

Un ptit:

thomas@cryonux:~$ ls -al /dev/chargeur-lto4

Et oh magie on a comme résultat:

lrwxrwxrwx 1 root root 4 2009-12-28 21:02  /dev/chargeur-lto4 -> sg9

Comments (0)

Tags: , ,

Réinitialiser le mot de passe root

Posted on 20 May 2010 by Thomas Ginestet

Changer un mot de passe root perdu (on va dire perdu hein…) sous Linux, ya vraiment rien de plus simple !

Il suffit pour cela d’un accès physique à la machine ou même d’un accès type KVM. La méthode décrite ci-dessous n’a été testée qu’avec le bootloader Grub, mais on ne doit pas être loin de la vérité avec Lilo.

Voici les différentes étapes:

- Démarrez ou redémarrez la machine

- Lorsque le menu de Grub apparaît, sélectionnez le kernel sur lequel vous souhaitez faire booter la machine et appuyez sur “a

- Au prompt “grub append>“, rajoutez init=/bin/bash à la fin de la ligne et validez en appuyant sur “Entrée”

- Maintenant que vous avez la main en root, il va falloir remonter la partition racine en lecture/écriture afin de pouvoir changer le mot de passe. Pour cela, tapez:

thomas@cryonux:~$ mount -o remount,rw /

- Yapuka changer le mot de passe avec la commande passwd

- Par mesure de sécurité, vous pouvez remonter la partition en lecture seule avant de redémarrer la machine avec:

thomas@cryonux:~$ mount -o remount,ro /

- Au prochain boot n’oubliez pas de retirer les modifications effectuées sur grub afin de charger normalement le kernel.

Comments (0)

Tags: , , , ,

Sauvegarder et restaurer une base Mysql à chaud

Posted on 20 May 2010 by Thomas Ginestet

Un (des) moyen de sauvegarder proprement une base Mysql est d’utiliser la commande mysqldump.
Cette commande permet d’effectuer la sauvegarde à chaud et peut séparer les squelettes des tables de leurs données (pratique par exemple pour transférer une base vers un autre serveur qui ne serait pas forcément du Mysql).

Voici un script shell qui va parser l’ensemble de vos bases Mysql puis effectuer la sauvegarde:

#!/bin/bash

user="login"
pass="mdp"
listdb=$(mysql --user=$user --password=$pass --exec="SHOW DATABASES;" | tail -n +2)

for dbname in $listdb; do

destdir="/usr/local/dumps/$dbname"

if [ -d $destdir ]; then
echo "Dumping $dbname database"
mysqldump --tab /usr/local/dumps/$dbname --opt --all $dbname --user=$user --password=$pass || echo "Error when dumping $dbname database"
else
mkdir /usr/local/dumps/$dbname
chown -R mysql:mysql /usr/local/dumps/$dbname
echo "Dumping $dbname database"
mysqldump --tab /usr/local/dumps/$dbname --opt --all $dbname --user=$user --password=$pass || echo "Error when dumping $dbname database"
fi
done
echo "Finished"
exit 0

Le script va ici aller mettre dans /usr/local/dumps/nomdelabase (le répertoire sera créé s’il n’existe pas) l’ensemble des squelettes des tables de chaque base au format .sql ainsi que les données au format .txt

A noter que vous pouvez très bien ne pas séparer les squelettes des données en supprimant l’argument –tab. Je vous invite à vous reporter à la doc de mysqldump pour voir l’ensemble des possibilités que vous offre cette commande.

Pour restaurer tout cela, on va utiliser les commandes suivantes (et pourquoi pas les scripter elles aussi):

mysql -u login -pmdp mabase < squelette.sql
mysqlbinlog mysql-bin.xxxxxx (si vous avez activé les fichiers de logs binaires)
mysqlimport --lock-tables --user=login --password=mdp mabase données.txt

Comments (0)