Ply : un outil d'instrumentalisation du noyau Linux
ven, 26/10/2018 - 16:28
Ply est un très bel outil à découvrir pour les administrateurs système Linux, ou pour les esprits curieux qui veulent regarder sous le capot de leur système. Ply est un traceur Linux dynamique, qui permet d'extraire des données arbitraires, comme des valeurs de registre, des arguments de fonction, des données de pile / tas, des traces de pile, etc.
Ecrit en C et conçu avec les systèmes embarqués à l'esprit, Ply est léger et n'a besoin pour fonctionner que d'une libc et d'un noyau moderne supportant Linux BPF. Ply ne nécessite ni LLVM, ni aucun module externe au noyau.
Pour instrumentaliser le noyau, on écrit des scripts dans un langage doté d'une syntaxe "à la C". Le langage supporte l'inférence de type, ce qui rend l'écriture des scripts particulièrement rapide. Ce langage est fortement inspiré de awk et de dtrace, indique le concepteur de Ply.
Comme regarder chaque donnée individuelle à partir d'une trace n'est pas aussi utile qu'une agrégation de données, ply prend en charge l'agrégation des données à la source, réduisant ainsi le temps système de traçage.
A titre d'exemple d'utilisation, voici un sonde qui compte tous les appels de fonctions dont le nom commence par sys_, c'est à dire tous les appel système.
#! /usr/bin/env ply
kprobe: SyS_ *
{
@syscalls [caller] = count ();
}
Cette sonde produira une sortie comme ceci :
~ $ ply count-syscalls.ply
pli: actif
^ Cply: désactivation
@syscalls:
{sys_sigaltstack + 1}: 1
{sys_set_tid_address + 1}: 2
{sys_sysinfo + 1}: 2
{sys_alarm + 1}: 2
{sys_mincore + 1}: 2
{sys_pread64 + 1}: 2
{sys_newlstat + 1}: 2
{sys_unlink + 1}: 2
[... etc...]
{sys_newfstat + 1}: 586
{sys_mmap_pgoff + 1}: 599
{sys_mmap + 1}: 600
{sys_rt_sigprocmask + 1}: 859
{sys_close + 1}: 863
{sys_ppoll + 1}: 1315
{sys_epoll_wait + 1}: 1731
{sys_poll + 1}: 2644
{sys_write + 1}: 3262
{sys_recvmsg + 1}: 3624
{sys_ioctl + 1}: 4423
{sys_read + 1}: 5059
{sys_futex + 1}: 7918
Ply est documenté sur son site officiel.
Ply est open source, disponible sur GitHub.