Upload
yann-rouillard
View
265
Download
3
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
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/