103
Investiguer des dysfonctionnements applicatifs dans le monde Unix / Linux

Techniques sysadmin d'investigation de dysfonctionnements applicatifs

Embed Size (px)

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

Page 1: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

Investiguer des dysfonctionnements

applicatifs dans le monde Unix / Linux

Page 2: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

Plan

0. Pourquoi faire

1. Connaître l’ennemi

2. Epier ses faits et gestes

3. Intercepter ses communications

Page 3: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

0. Pourquoi faire ?

Page 4: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 »

Page 5: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Sun Tzu – L’art de la guerre

1. Connaître l’ennemi

Page 6: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

ps: toutes les informations de base sur les processus

Connaître l’ennemiQuelques outils utiles

Page 7: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 8: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 9: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 10: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 11: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 12: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 13: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 14: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 15: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 16: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 17: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 18: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 19: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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)

Page 20: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 21: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 22: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 …

Page 23: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Connaître l’ennemiExemples concrets

Page 24: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 25: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Connaître l’ennemiExemples concrets

Page 26: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 27: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 28: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 29: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 30: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 31: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 32: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 33: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 34: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 35: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 36: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 37: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 38: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 39: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 40: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 41: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 42: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 43: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 44: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 45: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 46: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

La règle la plus importante:

Epier ses faits et gestesL’outil strace

Page 47: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 48: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 49: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 50: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 ?!

Page 51: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 52: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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)

Page 53: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 54: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 55: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 56: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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à !?

Page 57: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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/

Page 58: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 59: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 60: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 61: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 ?

Page 62: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 ?

Page 63: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 !

Page 64: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Churchill

3. Intercepter ses communications

Page 65: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 66: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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, …)

Page 67: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 68: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 69: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 70: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 71: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 72: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 73: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 74: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 75: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 76: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 77: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 78: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 79: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 80: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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…

Page 81: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 !!

Page 82: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 83: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 84: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 !

?

Page 85: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 86: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 87: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 ?

Page 88: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 89: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 90: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 91: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 ?!

Page 92: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 ?

Page 93: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 ?

Page 94: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 95: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

Questions ?

Page 96: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

Annexe

Page 97: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

5. Connaître son passé

Page 98: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 99: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 100: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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 !

Page 101: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

6. Passer à la vitesse supérieure

Page 102: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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

Page 103: Techniques sysadmin d'investigation de dysfonctionnements applicatifs

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/