Techniques sysadmin d'investigation de dysfonctionnements applicatifs

Preview:

DESCRIPTION

Comment investiguer un problème applicatif quand on ne maitrise pas le code source d'une application ou quand on ne l'a tout simplement pas ? Cette présentation à destination des administrateurs système propose quelques techniques pour faire parler les applications récalcitrantes.

Citation preview

Investiguer des dysfonctionnements

applicatifs dans le monde Unix / Linux

Plan

0. Pourquoi faire

1. Connaître l’ennemi

2. Epier ses faits et gestes

3. Intercepter ses communications

0. Pourquoi faire ?

Pourquoi faire ?

Parce que les fichiers de logs ne sont pas toujours suffisants

Parce qu’on a pas toujours de support

Parce que le support n’est pas toujours bon

Pour apporter des éléments objectifs au débat « c’est la faute au système – réseau / c’est la faute à l’application »

Qui connait son ennemi […], en cents combats ne sera point défait.

Sun Tzu – L’art de la guerre

1. Connaître l’ennemi

ps: toutes les informations de base sur les processus

Connaître l’ennemiQuelques outils utiles

ps: toutes les informations de base sur les processus

lsof: pour connaître tous les échanges avec l’extérieur (fichiers, réseau, socket, pipe…)

Connaître l’ennemiQuelques outils utiles

ps: toutes les informations de base sur les processus

lsof: pour connaître tous les échanges avec l’extérieur (fichiers, réseau, socket, pipe…)

netstat: pour connaître toutes les connexions réseaux en cours et ou en écoute

Connaître l’ennemiQuelques outils utiles

ps: toutes les informations de base sur les processus

lsof: pour connaître tous les échanges avec l’extérieur (fichiers, réseau, socket, pipe…)

netstat: pour connaître toutes les connexions réseaux en cours et ou en écoute

top: pour voir la consommation de ressources par le processus

Connaître l’ennemiQuelques outils utiles

ps: toutes les informations de base sur les processus

lsof: pour connaître tous les échanges avec l’extérieur (fichiers, réseau, socket, pipe…)

netstat: pour connaître toutes les connexions réseaux en cours et ou en écoute

top: pour voir la consommation de ressources par le processus

/proc/PID/…: exhaustif … mais moins lisible

ipcs: tout ce qui concerne la communication inter-processus (mémoire partagée, file de message…)

Connaître l’ennemiQuelques outils utiles

Un commande très connue mais qui reste incontournable

La commande de base pour en savoir plus sur un processus (%cpu, %mem, status, heure de démarrage…):

ps u -p PID

Connaître l’ennemiLa commande ps

Un commande très connue mais qui reste incontournable

La commande de base pour en savoir plus sur un processus (%cpu, %mem, status, heure de démarrage…):

ps u -p PID

Quelques utilisations moins connues mais utiles:

Connaître l’ennemiLa commande ps

Un commande très connue mais qui reste incontournable

La commande de base pour en savoir plus sur un processus (%cpu, %mem, status, heure de démarrage…):

ps u -p PID

Quelques utilisations moins connues mais utiles:

Connaître les variables d’environnement d’un processus:

ps eww -p PID

Connaître l’ennemiLa commande ps

Un commande très connue mais qui reste incontournable

La commande de base pour en savoir plus sur un processus (%cpu, %mem, status, heure de démarrage…):

ps u -p PID

Quelques utilisations moins connues mais utiles:

Connaître les variables d’environnement d’un processus:

ps eww -p PID

Connaître les groupes additionnels d’un processus:

ps -o supgid -p PID

Connaître l’ennemiLa commande ps

Un commande très connue mais qui reste incontournable

La commande de base pour en savoir plus sur un processus (%cpu, %mem, status, heure de démarrage…):

ps u -p PID

Quelques utilisations moins connues mais utiles:

Connaître les variables d’environnement d’un processus:

ps eww -p PID

Connaître les groupes additionnels d’un processus:

ps -o supgid -p PID

Vue en arbre des processus:

ps auxf

Connaître l’ennemiLa commande ps

Une véritable couteau suisseQuelques usages classiques:

Connaître les fichiers/sockets ouverts par un processus

lsof -n -p PID

Connaître l’ennemiLa commande lsof

Une véritable couteau suisseQuelques usages classiques:

Connaître les fichiers/sockets ouverts par un processus

lsof -n -p PID

Uniquement les connexions réseau d’un processus

lsof -n -p PID -a -i

Connaître l’ennemiLa commande lsof

Une véritable couteau suisseQuelques usages classiques:

Connaître les fichiers/sockets ouverts par un processus

lsof -n -p PID

Uniquement les connexions réseau d’un processus

lsof -n -p PID -a -i

Exemple de sortie de la commande lsof:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

chromium 3164 yrouillard 0r CHR 1,3 0t0 2050 /dev/null

chromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors

chromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors

chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies

chromium 3164 yrouillard 51r FIFO 0,8 0t0 17007 pipe

chromium 3164 yrouillard 84u unix 0x7280 0t0 18484 socket

chromium 3164 yrouillard 74u IPv4 152346 0t0 TCP atlas.local:34979

->138.102.119.3:https (ESTABLISHED)

[…]

Connaître l’ennemiLa commande lsof

Une véritable couteau suisseQuelques usages classiques:

Connaître les fichiers/sockets ouverts par un processus

lsof -n -p PID

Uniquement les connexions réseau d’un processus

lsof -n -p PID -a -i

Exemple de sortie de la commande lsof:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

chromium 3164 yrouillard 0r CHR 1,3 0t0 2050 /dev/null

chromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors

chromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors

chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies

chromium 3164 yrouillard 51r FIFO 0,8 0t0 17007 pipe

chromium 3164 yrouillard 84u unix 0x7280 0t0 18484 socket

chromium 3164 yrouillard 74u IPv4 152346 0t0 TCP atlas.local:34979

->138.102.119.3:https (ESTABLISHED)

[…]

Connaître l’ennemiLa commande lsof

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEchromium 3164 yrouillard 0r CHR 1,3 0t0 2050 /dev/nullchromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errorschromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errorschromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookieschromium 3164 yrouillard 51r FIFO 0,8 0t0 17007 pipechromium 3164 yrouillard 84u unix 0x7280 0t0 18484 socketchromium 3164 yrouillard 74u IPv4 152346 0t0 TCP atlas.local:34979 ->138.102.119.3:https (ESTABLISHED)

Une véritable couteau suisseQuelques usages classiques:

Connaître les fichiers/sockets ouverts par un processus

lsof -n -p PID

Uniquement les connexions réseau d’un processus

lsof -n -p PID -a -i

Exemple de sortie de la commande lsof:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

chromium 3164 yrouillard 0r CHR 1,3 0t0 2050 /dev/null

chromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors

chromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors

chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies

chromium 3164 yrouillard 51r FIFO 0,8 0t0 17007 pipe

chromium 3164 yrouillard 84u unix 0x7280 0t0 18484 socket

chromium 3164 yrouillard 74u IPv4 152346 0t0 TCP atlas.local:34979

->138.102.119.3:https (ESTABLISHED)

[…]

Connaître l’ennemiLa commande lsof

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEchromium 3164 yrouillard 0r CHR 1,3 0t0 2050 /dev/nullchromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errorschromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errorschromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookieschromium 3164 yrouillard 51r FIFO 0,8 0t0 17007 pipechromium 3164 yrouillard 84u unix 0x7280 0t0 18484 socketchromium 3164 yrouillard 74u IPv4 152346 0t0 TCP atlas.local:34979 ->138.102.119.3:https (ESTABLISHED)

Numéro Descripteur de fichier

Une véritable couteau suisseQuelques usages classiques:

Connaître les fichiers/sockets ouverts par un processus

lsof -n -p PID

Uniquement les connexions réseau d’un processus

lsof -n -p PID -a -i

Exemple de sortie de la commande lsof:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

chromium 3164 yrouillard 0r CHR 1,3 0t0 2050 /dev/null

chromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors

chromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors

chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies

chromium 3164 yrouillard 51r FIFO 0,8 0t0 17007 pipe

chromium 3164 yrouillard 84u unix 0x7280 0t0 18484 socket

chromium 3164 yrouillard 74u IPv4 152346 0t0 TCP atlas.local:34979

->138.102.119.3:https (ESTABLISHED)

[…]

Connaître l’ennemiLa commande lsof

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEchromium 3164 yrouillard 0r CHR 1,3 0t0 2050 /dev/nullchromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errorschromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errorschromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookieschromium 3164 yrouillard 51r FIFO 0,8 0t0 17007 pipechromium 3164 yrouillard 84u unix 0x7280 0t0 18484 socketchromium 3164 yrouillard 74u IPv4 152346 0t0 TCP atlas.local:34979 ->138.102.119.3:https (ESTABLISHED)

Type d’accès au « fichier » r: lecture w: écriture u: lecture et écriture

Une véritable couteau suisseQuelques usages classiques:

Connaître les fichiers/sockets ouverts par un processus

lsof -n -p PID

Uniquement les connexions réseau d’un processus

lsof -n -p PID -a -i

Exemple de sortie de la commande lsof:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

chromium 3164 yrouillard 0r CHR 1,3 0t0 2050 /dev/null

chromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors

chromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errors

chromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookies

chromium 3164 yrouillard 51r FIFO 0,8 0t0 17007 pipe

chromium 3164 yrouillard 84u unix 0x7280 0t0 18484 socket

chromium 3164 yrouillard 74u IPv4 152346 0t0 TCP atlas.local:34979

->138.102.119.3:https (ESTABLISHED)

[…]

Connaître l’ennemiLa commande lsof

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEchromium 3164 yrouillard 0r CHR 1,3 0t0 2050 /dev/nullchromium 3642 yrouillard 1u REG 254,2 21801 786846 /home/yrouillard/.xsession-errorschromium 3642 yrouillard 2u REG 254,2 21801 786846 /home/yrouillard/.xsession-errorschromium 3164 yrouillard 68u REG 254,2 1016832 78869 /home/[…]/Cookieschromium 3164 yrouillard 51r FIFO 0,8 0t0 17007 pipechromium 3164 yrouillard 84u unix 0x7280 0t0 18484 socketchromium 3164 yrouillard 74u IPv4 152346 0t0 TCP atlas.local:34979 ->138.102.119.3:https (ESTABLISHED)

Type d’accès au « fichier » CHR: périphérique caractère REG: fichier standard FIFO: pipe unix: socket unix IPv4: connexion IP …

Cas 1: Quels sont les fichiers de log du process weblogic ?

Connaître l’ennemiExemples concrets

Cas 1: Quels sont les fichiers de log du process weblogic ?

$ lsof -n -p 17102 | grep ".log"java 17102 fs90prd 1w VREG 85,1 16735376 96588

/opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_stdout.log

java 17102 fs90prd 2w VREG 85,1 91890547 98263

/opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_stderr.log

java 17102 fs90prd 9w VREG 85,1 0 98931

/opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_weblogic.log

[…]

java 17102 fs90prd 21w VREG 85,1 0 96993

/opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PRD_WT1.log

java 17102 fs90prd 22w VREG 85,1 8406043 98954

/opt/psoft/FSCM90PT84924/webserv/PRD_WT1/servers/PIA/logs/PIA_access.log

[…]

Connaître l’ennemiExemples concrets

Cas 2: Mais avec qui discute ce processus Time Navigator ?

Connaître l’ennemiExemples concrets

Cas 2: Mais avec qui discute ce processus Time Navigator ?

$ lsof -n -p 12475 -a –iCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

tina_daem 12475 root 6u IPv4 0xffffffffadbc6880 0t0 TCP *:tina (LISTEN)

tina_daem 12475 root 7u IPv4 0xffffffff933fbe00 0t0 UDP *:tina-msg

tina_daem 12475 root 8u IPv4 0xffffffff9ccc5040 0t0 TCP

138.102.1.107:38051->138.102.1.27:59334 (ESTABLISHED)

Connaître l’ennemiExemples concrets

Cas 2: Mais avec qui discute ce processus Time Navigator ?

$ lsof -n -p 12475 -a –iCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

tina_daem 12475 root 6u IPv4 0xffffffffadbc6880 0t0 TCP *:tina (LISTEN)

tina_daem 12475 root 7u IPv4 0xffffffff933fbe00 0t0 UDP *:tina-msg

tina_daem 12475 root 8u IPv4 0xffffffff9ccc5040 0t0 TCP

138.102.1.107:38051->138.102.1.27:59334 (ESTABLISHED)

Sur le serveur 138.102.1.27:59334

# lsof -n -i TCP:59334COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

ATEMPO 16247 root 16u IPv4 11757747 TCP 138.102.1.27:59334

->138.102.1.107:38051 (ESTABLISHED)

Connaître l’ennemiExemples concrets

Cas 3: Mais où est passé mon espace disque ?

$ dd if=/dev/zero of=grosfichier bs=1M count=700; tail -f grosfichier &

$ rm grosfichier

$ df -h /home

/dev/mapper/vg1-home 1,1G 937M 55M 95% /home$ du -xh --max-depth=1 /home

228M /home

Connaître l’ennemiExemples concrets

Cas 3: Mais où est passé mon espace disque ?

$ dd if=/dev/zero of=grosfichier bs=1M count=700; tail -f grosfichier &

$ rm grosfichier

$ df -h /home

/dev/mapper/vg1-home 1,1G 937M 55M 95% /home$ du -xh --max-depth=1 /home

228M /home

$ lsof -n /home | grep "(deleted)"tail 22678 root 3r REG 254,5 734003200 20 /home/grosfichier (deleted)

Connaître l’ennemiExemples concrets

Cas 3: Mais où est passé mon espace disque ?

$ dd if=/dev/zero of=grosfichier bs=1M count=700; tail -f grosfichier &

$ rm grosfichier

$ df -h /home

/dev/mapper/vg1-home 1,1G 937M 55M 95% /home$ du -xh --max-depth=1 /home

228M /home

$ lsof -n /home | grep "(deleted)"tail 22678 root 3r REG 254,5 734003200 20 /home/grosfichier (deleted)

$ kill -15 22678

$ df -h /home

/dev/mapper/vg1-home 1,1G 234M 758M 24% /home

Connaître l’ennemiExemples concrets

2. Epier ses faits et gestes

Espionne tous les gestes de ton adversaire […], et tu trouveras le meilleur moment pour causer sa perte.

L’art du Ninja – Vol. 2

strace: pour connaître tous les appels système effectués par le processus

un outil clé pour comprendre ce que font les processus

Epier ses faits et gestesQuelques outils utiles

strace: pour connaître tous les appels système effectués par le processus

un outil clé pour comprendre ce que font les processus

ltrace: pour connaître tous les appels à des librairies effectués par le processus

utile mais demande une connaissance des librairies utilisées

Epier ses faits et gestesQuelques outils utiles

strace: pour connaître tous les appels système effectués par le processus

un outil clé pour comprendre ce que font les processus

ltrace: pour connaître tous les appels à des librairies effectués par le processus

utile mais demande une connaissance des librairies utilisées

gdb: le debugger du projet GNU

complexe mais utilisable dans quelques cas

Epier ses faits et gestesQuelques outils utiles

Un outil très puissant

Afficher tous les appels système dès le démarrage:

strace -f /chemin/vers/executable

Epier ses faits et gestesL’outil strace

Un outil très puissant

Afficher tous les appels système dès le démarrage:

strace -f /chemin/vers/executableAfficher les appels système d’un processus en cours:

strace -f -p PID

Epier ses faits et gestesL’outil strace

Un outil très puissant

Afficher tous les appels système dès le démarrage:

strace -f /chemin/vers/executableAfficher les appels système d’un processus en cours:

strace -f -p PID

Avoir l’affichage des temps:

strace -tt -f -p PID

Epier ses faits et gestesL’outil strace

Un outil très puissant

Afficher tous les appels système dès le démarrage:

strace -f /chemin/vers/executableAfficher les appels système d’un processus en cours:

strace -f -p PID

Avoir l’affichage des temps:

strace -tt -f -p PIDExemple de sortie:

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581

14:18:38.209716 time(NULL) = 1317903518

14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0

14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

Epier ses faits et gestesL’outil strace

Un outil très puissant

Afficher tous les appels système dès le démarrage:

strace -f /chemin/vers/executableAfficher les appels système d’un processus en cours:

strace -f -p PID

Avoir l’affichage des temps:

strace -tt -f -p PIDExemple de sortie:

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581

14:18:38.209716 time(NULL) = 1317903518

14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0

14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

Epier ses faits et gestesL’outil strace

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 58114:18:38.209716 time(NULL) = 131790351814:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 014:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

Un outil très puissant

Afficher tous les appels système dès le démarrage:

strace -f /chemin/vers/executableAfficher les appels système d’un processus en cours:

strace -f -p PID

Avoir l’affichage des temps:

strace -tt -f -p PIDExemple de sortie:

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581

14:18:38.209716 time(NULL) = 1317903518

14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0

14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

Epier ses faits et gestesL’outil strace

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 58114:18:38.209716 time(NULL) = 131790351814:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 014:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

L’heure de l’appel système

Un outil très puissant

Afficher tous les appels système dès le démarrage:

strace -f /chemin/vers/executableAfficher les appels système d’un processus en cours:

strace -f -p PID

Avoir l’affichage des temps:

strace -tt -f -p PIDExemple de sortie:

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581

14:18:38.209716 time(NULL) = 1317903518

14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0

14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

Epier ses faits et gestesL’outil strace

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 58114:18:38.209716 time(NULL) = 131790351814:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 014:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

Le nom de l’appelsystème

Un outil très puissant

Afficher tous les appels système dès le démarrage:

strace -f /chemin/vers/executableAfficher les appels système d’un processus en cours:

strace -f -p PID

Avoir l’affichage des temps:

strace -tt -f -p PIDExemple de sortie:

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581

14:18:38.209716 time(NULL) = 1317903518

14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0

14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

Epier ses faits et gestesL’outil strace

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 58114:18:38.209716 time(NULL) = 131790351814:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 014:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

Les arguments

Un outil très puissant

Afficher tous les appels système dès le démarrage:

strace -f /chemin/vers/executableAfficher les appels système d’un processus en cours:

strace -f -p PID

Avoir l’affichage des temps:

strace -tt -f -p PIDExemple de sortie:

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581

14:18:38.209716 time(NULL) = 1317903518

14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0

14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

Epier ses faits et gestesL’outil strace

14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 58114:18:38.209716 time(NULL) = 131790351814:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 014:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8

Le code retour

Les appels système à connaître pour survivre

stat / lstat: connaître le status d’un fichierstat("fichier_present", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0

stat("fichier_absent", 0x1bab190) = -1 ENOENT

(No such file or directory)

open / close: ouvrir / fermer un fichieropen("/var/www/toto.inra.fr/.htaccess", O_RDONLY|O_LARGEFILE) = 138

close(138)

read / write: lire / écrire dans un fichierwrite(54, "138.102.XX.XX - - [07/Oct/2011:1"..., 348) = 348

read(5, "GET /design/plain/images/accueil"..., 4096) = 626

flock / fcntl (SET_LK): verrouiller ou déverrouiller un fichierflock(19, LOCK_EX) = 0

fcntl(4, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=0, len=0}) = 0

Epier ses faits et gestesL’outil strace

poll / select: attendre une activité sur un fichier ou une connexion réseau

select(34, [26 27 28 29 30 31 32 33], NULL, NULL, NULL) = 1 (in [32])

poll([{fd=6, events=POLLOUT, revents=POLLOUT}], 1, 0) = 1

connect / socket: se connecter à un port réseausocket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 6

connect(6, {sa_family=AF_INET, sin_port=htons(53),

sin_addr=inet_addr("138.102.119.226")}, 28) = 0

send / recv / recvfrom: lire et écrire sur le réseausend(6, "\324x\1\0\0\1\0\0\0\0\0\0\20moteur-recherche"..., 42, 0) = 42

recv(6, "HTTP/1.0 200 OK\r\nConnection: Clo"..., 8192, 0) = 174

execve: exécuter un processusexecve("/bin/ls", ["/bin/ls", "-l"], [/* 40 vars */]) = 0

Epier ses faits et gestesL’outil strace

La règle la plus importante:

Epier ses faits et gestesL’outil strace

La règle la plus importante:

Accepter de ne pas tout comprendre

dans la floppée de lignes de strace !!

Epier ses faits et gestesL’outil strace

Connaître la pile d’appel d’un processus en cours:

$ gdb –p PID ou gdb core

thread apply all bt

Exemple de sortie:#0 0x00000035d1acb2af in poll () from /lib64/libc.so.6

#1 0x00000035d522fa3d in ?? () from /lib64/libglib-2.0.so.0

#2 0x00000035d522ff1a in g_main_loop_run () from /lib64/libglib-2.0.so.0

#3 0x00002b1fc9f695d5 in ?? () from /usr/lib64/python2.4/site-packages/gtk-2.0/gobject/_gobject.so

#4 0x0000003e81e96167 in PyEval_EvalFrame () from /usr/lib64/libpython2.4.so.1.0

[…]

#12 0x00000035d1a1d994 in __libc_start_main () from /lib64/libc.so.6

#13 0x0000000000400629 in _start ()

Epier ses faits et gestesL’outil gdb

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?

18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0

[…]

18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3

18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT

18:16:29.305480 time(NULL) = 1308154589

[…]

18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

Epier ses faits et gestesLa pratique

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?

18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0

[…]

18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3

18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT

18:16:29.305480 time(NULL) = 1308154589

[…]

18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

Epier ses faits et gestesLa pratique

GLPI lance un processus rsh pour se connecter sur

tours.inra.fr ?!

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?

18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0

[…]

18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3

18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT

18:16:29.305480 time(NULL) = 1308154589

[…]

18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

Epier ses faits et gestesLa pratique

On a perdu 15 secondesentre ces deux appels

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?

18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0

[…]

18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3

18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT

18:16:29.305480 time(NULL) = 1308154589

[…]

18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

Epier ses faits et gestesLa pratique

On a perdu 15 secondesentre ces deux appels

A cause d’une tentative de connexion ssh qui finit en

timeout(port non ouvert)

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?

18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0

[…]

18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3

18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT

18:16:29.305480 time(NULL) = 1308154589

[…]

18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

Epier ses faits et gestesLa pratique

GLPI essaie ensuite de connecter en imap sur tours.inra.fr

Cas 1: Mais pourquoi le login dans GLPI est-il lent ?

18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l", "www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0

[…]

18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3

18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT

18:16:29.305480 time(NULL) = 1308154589

[…]

18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),

sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS

glpi exécute des tâches périodiques quand quelqu’un se connecte La tâche de récupération des tickets mail essayait d’abord de faire

une connexion IMAP par ssh avant de faire une connexion IMAP standard

Epier ses faits et gestesLa pratique

Cas 2: Problème de compilation

# R CMD INSTALL Rmpi_0.5-9.tar.gz

[…]

Error in dyn.load(file, DLLpath = DLLpath, ...) :

unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':

libmpi.so.0: cannot open shared object file: No such file or directory

Epier ses faits et gestesLa pratique

Vu sur le forum PEPI

Cas 2: Problème de compilation

# R CMD INSTALL Rmpi_0.5-9.tar.gz

[…]

Error in dyn.load(file, DLLpath = DLLpath, ...) :

unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':

libmpi.so.0: cannot open shared object file: No such file or directory

# ls /usr/local/lib/libmpi.so.0

/usr/local/lib/libmpi.so.0

Epier ses faits et gestesLa pratique

Vu sur le forum PEPI

Pourtant la librairie est bien là !?

Cas 2: Problème de compilation

# R CMD INSTALL Rmpi_0.5-9.tar.gz

[…]

Error in dyn.load(file, DLLpath = DLLpath, ...) :

unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':

libmpi.so.0: cannot open shared object file: No such file or directory

# ls /usr/local/lib/libmpi.so.0

/usr/local/lib/libmpi.so.0

# strace -f R CMD INSTALL Rmpi_0.5-9.tar.gz 2>&1 | grep libmpi.so

open("/usr/local/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT

open("/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT

open("/usr/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT

[…]

Epier ses faits et gestesLa pratique

Vu sur le forum PEPI

La librairie est recherchée dans des répertoires /lib64/

Cas 2: Problème de compilation

# R CMD INSTALL Rmpi_0.5-9.tar.gz

[…]Error in dyn.load(file, DLLpath = DLLpath, ...) :

unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':

libmpi.so.0: cannot open shared object file: No such file or directory

# ls /usr/local/lib/libmpi.so.0

/usr/local/lib/libmpi.so.0

# strace -f R CMD INSTALL Rmpi_0.5-9.tar.gz 2>&1 | grep libmpi.so

open("/usr/local/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENTopen("/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT

open("/usr/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT

[…]

/usr/local/lib/ n’est pas dans le chemin de recherche des librairies 64 bits !

Epier ses faits et gestesLa pratique

Vu sur le forum PEPI

Cas 3: Plantage d’un webmail lors de la consultation

# gdb –p PID_Process_Apache ou gdb fichier_core

0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so

2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so

[…]

13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so

15 0x08074607 in ap_run_handler ()

[…]

23 0x0806224f in main ()

Epier ses faits et gestesLa pratique

Cas 3: Plantage d’un webmail lors de la consultation

# gdb –p PID_Process_Apache ou gdb fichier_core

0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so

2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so

[…]

13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so

15 0x08074607 in ap_run_handler ()

[…]

23 0x0806224f in main ()

Epier ses faits et gestesLa pratique

Le plantage semble survenir dans cette librairie

Cas 3: Plantage d’un webmail lors de la consultation

# gdb –p PID_Process_Apache ou gdb fichier_core

0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so

2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so

[…]

13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so

15 0x08074607 in ap_run_handler ()

[…]

23 0x0806224f in main ()

# dpkg -S /usr/lib/libc-client.so.2002edebianlibc-client2002edebian: /usr/lib/libc-client.so.2002edebian

Epier ses faits et gestesLa pratique

A quel paquet appartient cette librairie ?

Cas 3: Plantage d’un webmail lors de la consultation

# gdb –p PID_Process_Apache ou gdb fichier_core

0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so

2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so

[…]

13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so

15 0x08074607 in ap_run_handler ()

[…]

23 0x0806224f in main ()

# dpkg -S /usr/lib/libc-client.so.2002edebianlibc-client2002edebian: /usr/lib/libc-client.so.2002edebian

# Consultation de http://bugs.debian.org/libc-client2002edebian

Epier ses faits et gestesLa pratique

Y a-t-il des bugs connus pour ce paquet ?

Cas 3: Plantage d’un webmail lors de la consultation

# gdb –p PID_Process_Apache ou gdb fichier_core

0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so

2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so

[…]13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so

15 0x08074607 in ap_run_handler ()

[…]23 0x0806224f in main ()

# dpkg -S /usr/lib/libc-client.so.2002edebianlibc-client2002edebian: /usr/lib/libc-client.so.2002edebian

# Consultation de http://bugs.debian.org/libc-client2002edebian

Bug 502996: Segfaults if IMAP server sends more than 30 user flags

Epier ses faits et gestesLa pratique

Bingo !

C’es grâce à [l’interception des communications allemandes]que nous avons gagné la guerre.

Churchill

3. Intercepter ses communications

Intercepter ses communications

Quelques outils utilestcpdump / snoop: outil de capture de bas niveau

Usage classique:tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port

Intercepter ses communications

Quelques outils utilestcpdump / snoop: outil de capture de bas niveau

Usage classique:tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port

wireshark / tshark: pour faire l’analyse des captures• Un outil très puissant à connaître absolument,• capable de décoder énormément de protocole réseau (SQL, HTTP,

HTTPS, LDAP, ethernet, TCP, UDP, IP, …)

Intercepter ses communications

Quelques outils utilestcpdump / snoop: outil de capture de bas niveau

Usage classique:tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port

wireshark / tshark: pour faire l’analyse des captures• Un outil très puissant à connaître absolument,• capable de décoder énormément de protocole réseau (SQL, HTTP,

HTTPS, LDAP, ethernet, TCP, UDP, IP, …)

l’extension livehttpheaders de Firefox: pour connaître les échanges HTTP lors de la consultation d’une page

Etablissement de la connexion

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]

209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]

192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]

Acquittement des paquets

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0

209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0

Client

Syn

Syn + Ack

Ack

Serveur Client

Seq = 2, Len = 4, Ack = 0

ServeurSeq = 0, Len = 0, Ack = 6

Seq = 6, Len = 8, Ack = 0

Intercepter ses communications

Les bases à savoir pour analyser les flux

Etablissement de la connexion

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]

Acquittement des paquets

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0

209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0

Client

Syn

Serveur Client

Seq = 2, Len = 4, Ack = 0

ServeurSeq = 0, Len = 0, Ack = 6

Seq = 6, Len = 8, Ack = 0

Intercepter ses communications

Les bases à savoir pour analyser les flux

Etablissement de la connexion

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]

209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]

Acquittement des paquets

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0

209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0

Client

Syn

Syn + AckServeur Client

Seq = 2, Len = 4, Ack = 0

ServeurSeq = 0, Len = 0, Ack = 6

Seq = 6, Len = 8, Ack = 0

Intercepter ses communications

Les bases à savoir pour analyser les flux

Etablissement de la connexion

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]

209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]

192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]

Acquittement des paquets

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0

209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0

Client

Syn

Syn + Ack

Ack

Serveur Client

Seq = 2, Len = 4, Ack = 0

ServeurSeq = 0, Len = 0, Ack = 6

Seq = 6, Len = 8, Ack = 0

Intercepter ses communications

Les bases à savoir pour analyser les flux

Etablissement de la connexion

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]

209.85.148.106 192.168.0.156 TCP 80 > 45261 [RST]

Acquittement des paquets

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0

209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0

Client

Syn

Rst Serveur Client

Seq = 2, Len = 4, Ack = 0

ServeurSeq = 0, Len = 0, Ack = 6

Seq = 6, Len = 8, Ack = 0

Intercepter ses communications

Les bases à savoir pour analyser les flux

Etablissement de la connexion

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]

209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]

192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]

Acquittement des paquets

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0

Client

Syn

Syn + Ack

Ack

Serveur Client

Seq = 2, Len = 4, Ack = 0

Serveur

Intercepter ses communications

Les bases à savoir pour analyser les flux

J’ai déjà envoyé 2 octetsJe t’envoie 4 nouveaux

octets

Etablissement de la connexion

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]

209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]

192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]

Acquittement des paquets

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0

209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6

Client

Syn

Syn + Ack

Ack

Serveur Client

Seq = 2, Len = 4, Ack = 0

ServeurSeq = 0, Len = 0, Ack = 6

Intercepter ses communications

Les bases à savoir pour analyser les flux

J’ai bien reçu6 octets en tout

Etablissement de la connexion

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]

209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]

192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]

Acquittement des paquets

Traduction en capture tcpdump / wireshark192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0

209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6

192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0

Client

Syn

Syn + Ack

Ack

Serveur Client

Seq = 2, Len = 4, Ack = 0

ServeurSeq = 0, Len = 0, Ack = 6

Seq = 6, Len = 8, Ack = 0

Intercepter ses communications

Les bases à savoir pour analyser les flux

Tu as bien reçu mes 6 octets alors je t’en envoie 8 de plus

Cas 1: Lenteur d’accès aléatoire à des sites Web

Capture depuis le serveur web53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567

54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=56757 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur 53 0.488462 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

54 0.586425 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

55 5.260831 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)

56 5.306787 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

Intercepter ses communications

La pratique

Cas 1: Lenteur d’accès aléatoire à des sites Web

Capture depuis le serveur web53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567

54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=56757 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur 53 0.488462 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

54 0.586425 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

55 5.260831 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)

56 5.306787 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

Intercepter ses communications

La pratique

Le serveur envoie 3306 + 395 = 3873 octets

Cas 1: Lenteur d’accès aléatoire à des sites Web

Capture depuis le serveur web53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567

54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=56757 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur 53 0.488462 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

54 0.586425 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

55 5.260831 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)

56 5.306787 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

Intercepter ses communications

La pratique

Le client accuse réceptionde 1846 octets

Cas 1: Lenteur d’accès aléatoire à des sites Web

Capture depuis le serveur web53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567

54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

…56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=56757 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur 53 0.488462 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

54 0.586425 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

55 5.260831 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)

56 5.306787 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

Intercepter ses communications

La pratique

Le client accuse réceptionde 3306 octets

Cas 1: Lenteur d’accès aléatoire à des sites Web

Capture depuis le serveur web53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567

54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

… 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=56757 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur 53 0.488462 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

54 0.586425 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

55 5.260831 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)

56 5.306787 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

Intercepter ses communications

La pratique

Le serveur attend l’accusé de réception de ces 3873 octets…

Cas 1: Lenteur d’accès aléatoire à des sites Web

Capture depuis le serveur web53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567

54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

… 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=56757 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur 53 0.488462 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

54 0.586425 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

55 5.260831 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)

56 5.306787 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

Intercepter ses communications

La pratique

Pendant 5 secondes !!

Cas 1: Lenteur d’accès aléatoire à des sites Web

Capture depuis le serveur web53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567

54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

… 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=56757 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur 53 0.488462 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

54 0.586425 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

55 5.260831 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)

56 5.306787 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

Intercepter ses communications

La pratique

Il décide ensuite deretransmettre le paquet

Cas 1: Lenteur d’accès aléatoire à des sites Web

Capture depuis le serveur web53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567

54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

… 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=56757 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur 53 0.488462 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

54 0.586425 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

55 5.260831 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)

56 5.306787 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

Intercepter ses communications

La pratique

Il reçoit bien l’accusé de réception des 3873 octets

cette fois-ci

Cas 1: Lenteur d’accès aléatoire à des sites Web

Capture depuis le serveur web53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567

54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

… 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=56757 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur 53 0.488462 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

54 0.586425 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

55 5.260831 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)

56 5.306787 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

Intercepter ses communications

La pratique

Avant le routeur, tout est identique…

… sauf que le 1er paquet envoyé au client n’apparait pas !

?

Cas 1: Lenteur d’accès aléatoire à des sites Web

Capture depuis le serveur web53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567

54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

… 56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=56757 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325

Capture avant le routeur 53 0.488462 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0

54 0.586425 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0

55 5.260831 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)

56 5.306787 138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0

Le paquet était perdu dans le routeur dont il a fallu faire changer la carte

Intercepter ses communications

La pratique

Cas 2: Problème de performance sous tomcat

$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

[…] (en boucle)

Intercepter ses communications

La pratique

Cas 2: Problème de performance sous tomcat

$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

[…] (en boucle)

Intercepter ses communications

La pratique

Vers qui sont envoyéestoutes ces requêtes ?

Cas 2: Problème de performance sous tomcat

$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

[…] (en boucle)

$ lsof -d 243 -a -p 5937java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

Intercepter ses communications

La pratique

Cas 2: Problème de performance sous tomcat

$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

[…] (en boucle)

$ lsof -d 243 -a -p 5937java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

Intercepter ses communications

La pratique

Il communique avec le serveur postgres

Cas 2: Problème de performance sous tomcat

$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

[…] (en boucle)

$ lsof -d 243 -a -p 5937java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432

Intercepter ses communications

La pratique

On écoute plus précisément ce qu’ils se disent

Cas 2: Problème de performance sous tomcat

$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

[…] (en boucle)

$ lsof -d 243 -a -p 5937java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432

Intercepter ses communications

La pratique

Sous wireshark, on voit toujours la même requête ?!

Cas 2: Problème de performance sous tomcat

$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

[…] (en boucle)

$ lsof -d 243 -a -p 5937java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432

$ strings -a | grep "^select" | wc -l8467

$ strings -a | grep "^select" | sort -u | wc -l

1

Intercepter ses communications

La pratique

Combien de requêtes SQL ?

Cas 2: Problème de performance sous tomcat

$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

[…] (en boucle)

$ lsof -d 243 -a -p 5937java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432

$ strings -a /tmp/capture.cap | grep "^select" | wc -l8467

$ strings -a /tmp/capture.cap | grep "^select" | sort -u | wc -l

1

Intercepter ses communications

La pratique

Combien de requêtes SQL uniques ?

Cas 2: Problème de performance sous tomcat

$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

send(243, "P\0\0\2<\0select donneesjcr0_.id as i"..., 617, 0) = 617recv(243, "1\0\0\0\0042\0\0\0\4T\0\0\1z\0\fid4_0_\0\0\0@\27\0\1\0\0\0"..., 8192, 0) = 487

[…] (en boucle)

$ lsof -d 243 -a -p 5937java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)

$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432

$ strings -a /tmp/capture.cap | grep "^select" | wc -l8467

$ strings -a /tmp/capture.cap | grep "^select" | sort -u | wc -l

1

L’application effectue la même requête sql en boucle !!

Intercepter ses communications

La pratique

Questions ?

Annexe

5. Connaître son passé

Les problèmes n’arrivent pas toujours quand un administrateur est présent (nuit, week-end…)

Les outils de monitoring classiques (Cacti, Nagios, Zabbix…) ne permettent pas de faire des diagnostics précis dans le passé– aggrégations des données trop rapides,

– peu d’indicateurs détaillées, – grain pas assez fin (pas de vision par processus ou

utilisateurs…)

Un besoin d’outils adapté pour le diagnostic

Connaître son passéLa problématique

Pour ceux qui ne peuvent pas s’offrir Sysload, Patrol…Un outil gratuit (mais pas réellement open-source)

Librement téléchargeable sur http://dimitrik.free.fr/

Une interface fruste mais puissante

De nombreuses sondes par défaut (tout l’historique des commandes iostat, vmstat, iostat, netstat sans perte de données)

Très facilement extensible (sondes mysql, java…)

Exemples de requêtes possibles:• Quels sont les 10 processus qui ont occupé le plus de mémoire entre

22h et 4h du matin ?

• Quel est le taux d’interruption du CPU 2 entre 2h et 4h ?

• Quel utilisateur a consommé tout le CPU entre 5h et 6h ?

Connaître son passé dim_stat, une solution

Cas 1: Comprendre les raisons d’une saturation mémoireSous Solaris, le répertoire /tmp est stocké en mémoire et son occupation peut saturer la mémoire comment savoir si des saturations étaient dues au /tmp ou à des processus ?

Connaître son passéExemple d’utilisation

9 septembre 201160% RAM seulement,C’est le /tmp qui doit occuper le reste de la mémoire !!!

2 septembre 201190% RAM occupé par les processus, ce sont eux qui saturent la mémoire !

6. Passer à la vitesse supérieure

Passer à la vitesse supérieure 2 outils pour aller plus loin

Dtrace sous Solaris: un outil d’analyse et de profilage du système extrêmement puissant• le précurseur, créé en 2003 et disponible depuis Solaris 10• totalement sûr, avec un impact faible, conçu pour être utilisé

en production • permet d’accéder à énormément d’information du système,• un language de scripting spécifique: le D

b

Systemtap sous Linux: l’équivalent pour Linux, créé en 2005,• disponible nativement dans Redhat depuis la version 5.2• scripts systemtap compilés et chargés en tant que module

noyau

Passer à la vitesse supérieuredtrace et systemtap

Des outils puissants qui permettent de répondre aux questions suivantes:

Quels sont les processus qui génèrent le plus d’entrées/sorties disque ?

Quels processus sont responsables d’une occupation CPU Système importante ?

Quels sont les processus qui génèrent le plus de traffic réseau ?

Quels sont les processus qui accèdent de manière brève à ce fichier ?

Quelle processus est responsable de la suppression de fichiers ?

Des outils complexes à maîtriser !Mais il existe de nombreux scripts directement utilisables sur le net:

• DtraceToolkit: http://hub.opensolaris.org/bin/view/Community+Group+dtrace/dtracetoolkit

• Exemples Systemtap: http://sourceware.org/systemtap/examples/

Recommended