Dans les grandes lignes, les idées dont j'aimerais parler, quelques notes, ça peut évoluer vers une sorte de plan.
Questione récurrente : que se passe-t-il sur mon système ? Que ce soit machine locale, serveur de prod, physique ou virtuelle ou container.
Nombreux outils pour répondre, en partie, à cette question (descriptions fort simplifiées) :
ps
: liste les processus en courstop
/htop
: affiche les processus en cours, triés par consommation CPU/RAM/autre ; éventuellement avec en plus quelques mini-graphiquesnethogs
: liste les processus qui consomment du réseau et affiche combien pour chaquetcpdump
: liste ce qui passe sur le réseaulsof
: liste les fichiers ouverts et les processus qui y accèdent -> vu que plein de choses sous UNIX sont représentées par des fichiers, c'est déjà fort pratique ;-)netstat
: infos à propos du réseau (connexions ouvertes, tables de routage, ...)strace
: liste les appels systèmes effectués par un processus, au fur et à mesure de son exécutionnmap
: pour lister les ports sur lesquels quelque chose écoute -> doit pouvoir être remplacé par une sonde sysdig ?iostat
vmstat
Bon, ça permet d'obtenir plein d'informations, mais il faut utiliser 36 outils différents, qui ont tous des options différentes... Pas très marrant et pas évident !
Exemples :
ps -Alf
top
htop
nethogs wlan0
tcmdump
lsof /home/pmartin/projects/ecommerce
netstat
netstat --route
netstat --statistics
strace php -S localhost:8001
Cf http://www.sysdig.org/wiki/sysdig-overview/
Cf Installation
Sous Debian :
curl -s https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public | sudo apt-key add -
sudo curl -s -o /etc/apt/sources.list.d/draios.list http://download.draios.com/stable/deb/draios.list
sudo apt-get update
sudo apt-get install -y linux-headers-$(uname -r)
sudo apt-get install -y sysdig
Attention : lancer la commande sysdig
sans aucun paramètre pour contrôler un peu ce qu'elle va faire, c'est s'exposer à beaucoup de lignes qui vont défiler dans la console !
Mais on peut limiter à quelques événements, pour voir à quoi ça ressemble :
sysdig -n 100
Note : pour pas mal de trucs, il faut lancer sysdig
en root : ça va chercher des informations bien bas-niveau, pas forcément accessibles à n'importe qui ;-)
Format de sortie par défaut :
By default, sysdig prints the information for each captured event on a single
line with the following format:
%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
where:
evt.num is the incremental event number
evt.time is the event timestamp
evt.cpu is the CPU number where the event was captured
proc.name is the name of the process that generated the event
thread.tid id the TID that generated the event, which corresponds to the
PID for single thread processes
evt.dir is the event direction, > for enter events and < for exit events
evt.type is the name of the event, e.g. 'open' or 'read'
evt.info is the list of event arguments.
Par défaut, sortie directement sur la console. Mais on peut également enregistrer les traces vers un fichier, pour ensuite les analyser.
Enregistrer vers un fichier :
sysdig -w mon-fichier.scap
Analyser ce qui est dans le fichier :
sysdig -r mon-fichier.scap
On peut spécifier une taille max par fichier, faire du rotate de fichiers, compresser les fichiers, ...
Depuis le système physique, on peut analyser ce qu'il se passe dans les containers : juste ça marche ;-)
Il faut, occasionnellement, utiliser l'option -pc
pour avoir de la visibilité à l'intérieur des containers.
Et quand on a -pc
, sortie par défaut :
Using -pc or -pcontainer, the default format will be changed to a container-friendly one:
%evt.num %evt.outputtime %evt.cpu %container.name (%container.id) %proc.name (%thread.tid:%thread.vtid) %evt.dir %evt.type %evt.info
Cf Bonne série d'exemples de commandes et Sysdig CLI examples
Dans les trucs à montrer :
- On voit des choses qui défilent en live
- On peut les filtrer
- On a des chisels pour agréger ou autres
- On peut enregistrer ce qu'il se passe vers des fichiers, puis analyser ce qui a été enregistré, en off-line
Observer tout ce qu'il se passe, c'est très verbeux et clairement pas une bonne idée ^^
=> On peut filtrer \o/
Par exemple, pour avoir toutes les informations liées à un (ou plusieurs) processus nommé(s) php
:
sysdig proc.name=php
On peut lancer un serveur PHP en CLI une fois cette commande en cours :
cd examples
php -S localhost:8001
=> Si on fait des requêtes sur http://localhost:8001/
ou sur http://localhost:8001/phpinfo.php
, on voit tout ce que fait le processus \o/
On peut combiner des filtres, bien sûr, pour ne conserver que ce qui nous intéresse :
sysdig -r mon-fichier.scap "proc.name=php and evt.type=open and fd.name contains php and not fd.directory contains /usr/"
Pour ce qui est de combiner des filtres et de filtres un peu avancés :
- Opérateurs : =, !=, <, <=, >, >=, contains
- Combinaison : or, and, not
- On peut utiliser des parenthèses
On peut voir tous les répertoires parcourus par l'utilisateur root
:
sysdig "evt.type=chdir and user.name=root"
Voir passer toutes les ouvertures de fichiers au fur et à mesure qu'elles arrivent, en choisissant les informations affichées gràce à -p
:
sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open
Même chose, en limitant à une portion du chemin :
sysdig -pc -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" "evt.type=open and fd.name contains /var/cache/"
Lister toutes les connexions réseau entrantes, qui sont servies par un processus autre que nginx
:
sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=nginx"
Et si on veut tous les fichiers auxquels nginx essaye d'accéder ; mais échoue (genre, les fichiers en 404 sur nos sites) :
sysdig "proc.name=nginx and evt.type=open and evt.failed=true"
Ou pour voir toutes les requêtes SQL de sélection jouées depuis des process PHP :
sysdig "proc.name contains php-fpm and evt.buffer contains SELECT"
Pour obtenir la liste des filtres existant :
sysdig -l
Et pour obtenir la liste des types d'événements existant (>
indique un événement entrant et <
un événement sortant) :
sysdig -L
Scripts qui analysent le flux d'événements pour réaliser des actions utiles.
Exécuter un chisel :
sysdig -c NOM_DU_CHISEL
Exemple : lister en temps réel les fichiers avec le plus de lectures/écritures (en volume d'octets) :
sysdig -c topfiles_bytes
Par défaut : n'affiche pas d'information liée à des containers.
Même chose, mais en incluant les informations liées à des containers ; on ajoute le flag -pc
sysdig -c topfiles_bytes -pc
=> On peut faire une passe sur les chisels existant : il y en a pas mal qui peuvent être utiles, selon les cas ;-)
Tracer les accès fichier lents (plus de 3ms), y compris dans des containers :
sysdig -pc -c fileslower 3
Afficher les containers en cours d'exécution (docker, coreos, lxc) :
sysdig -c lscontainers [desc]
Je parlais plus haut de nethogs
pour voir les process qui consomment du réseau ; ça se fait aussi avec sysdig :
sysdig -c topprocs_net
Liste des chisels disponibles :
sysdig -cl
Plus d'informations sur un chisel
sysdig -i NOM_DU_CHISEL
Bien sûr, les chisels peuvent être combinés avec des filtres, pour affiner ce sur quoi les chisels sont appliqués !
Lister les fichiers qui représentent les plus d'I/O, uniquement pour le container tea-ecommerce
:
sysdig -pc -c topfiles_bytes "container.name=tea-ecommerce"
Ou, pour visionner les fichiers qui font le plus gros volume d'I/O, en se limitant à un répertoire donné :
sysdig -pc -c topfiles_bytes "container.name=tea-ecommerce and fd.directory contains cache"
Ou pour les fichiers accédés uniquement par le processus php-fpm :
sysdig -pc -c topfiles_bytes "proc.name contains php-fpm"
Pour afficher une sorte de spectrogramme des fichiers accédés :
sysdig -c spectrogram "fd.type=file and container.name=tea-ecommerce"
Suivre les logs de plusieurs containers (surtout si on n'a rien fait pour les mettre où il faut), c'est un peu compliqué ? Bah non ;-)
sysdig -pc -cspy_logs
Bien sûr, ça se filtre :
sysdig -pc -cspy_logs "fd.name contains access.log or container.name=tea-db"
Et il y a plein de choses qu'on peut faire ; genre visionner les requêtes solr sur notre index ecommerce :
sysdig -pc -cspy_logs "evt.args contains IndexEcommerce_fr and evt.args contains path=/select"
Interface graphique qui permet de visualiser ce qu'il se passe en live -- pensez à un htop
boosté de folie ^^
On peut réutiliser l'option -r
pour analyser un fichier de trace existant, également ;-)
Lister tous les processus (y compris ceux dans des containers) :
csysdig
Lister tous les processus (y compris ceux dans des containers), avec le contexte du container :
csysdig -pc
Lister tous les containers qui tournent en local, avec les ressources qu'ils consomment :
csysdig -vcontainers
Lister tous les processus qui tournent dans des containers :
csysdig -pc "container.name!=host"
On peut aussi analyser une requêtes sur notre serveur web PHP de test :
csysdig -pc "proc.name=php"
=> C'est l'occasion de faire F5 et F6 pour la sortie, digger ce qu'il se passe, ...
Ca se scripte ; en Lua notamment, cf Chisels User Guide
C'est cool \o/
Un seul outil et plus 36 outils différents avec des interfaces et options différentes.
Analyse on-line ou off-line. Fouillage en profondeur.