Ir al contenido

pahole - Análisis de layout de estructura y línea de cache

pahole - Análisis de layout de estructura y línea de cache

pahole (“poke-a-hole”) lee información de debug DWARF o BTF e imprime el layout actual en memoria de estructuras C — dónde se sienta cada campo, cuánto padding insertó el compilador, y cuántas líneas de cache ocupa la estructura. Los compiladores paddean estructuras para satisfacer alineación, y una estructura descuidadamente ordenada puede desperdiciar docenas de bytes y ocupar líneas de cache extra. En estructuras de datos hot eso se traduce directamente a cache misses. pahole hace el desperdicio visible para que puedas reordenar campos y encogerlo.

Instalación

PlataformaComando
Debian/Ubuntusudo apt install dwarves
Fedora/RHELsudo dnf install dwarves
Arch Linuxsudo pacman -S pahole
Desde sourcecompilar el proyecto dwarves
Verificarpahole --version

Tu binario debe ser compilado con info de debug (-g). Binarios stripped no tienen nada para pahole que leer.

Uso básico

ComandoDescripción
pahole ./myprogramMostrar todas las estructuras en el binario
pahole -C mystruct ./myprogramUna estructura específica
pahole -C task_struct /sys/kernel/btf/vmlinuxEstructura del kernel vía BTF
pahole --sizes ./myprogramListar tamaños de estructura
pahole -H 1 ./myprogramSolo estructuras con ≥1 agujero

Leyendo la salida

struct example {
        char                       flag;                 /*     0     1 */

        /* XXX 7 bytes hole, try to pack */

        long int                   counter;              /*     8     8 */
        char                       name[16];             /*    16    16 */
        int                        id;                   /*    32     4 */

        /* XXX 4 bytes hole, try to pack */

        void *                     ptr;                  /*    40     8 */

        /* size: 48, cachelines: 1, members: 5 */
        /* sum members: 37, holes: 2, sum holes: 11 */
};
AnotaciónSignificado
/* offset size */Offset y tamaño de bytes de cada campo
XXX N bytes holePadding que insertó el compilador
size:Tamaño total de la estructura
cachelines:Cuántas líneas de 64 bytes ocupa
sum holes:Total de bytes desperdiciados
last cacheline:Bytes usados en la línea final

Encontrando desperdicio en todo un codebase

ComandoEncuentra
pahole -H 1 ./binEstructuras con agujeros
pahole --nr_members ./binOrdenadas por conteo de miembros
pahole -c 2 ./binEstructuras que ocupan ≥2 líneas de cache
pahole -E ./binExpandir estructuras anidadas inline
pahole -a ./binMostrar detalles de alineación/packing
# ¿Qué estructuras desperdician más memoria en padding?
pahole -H 8 ./myprogram | head -50

Fijando el layout

El fix estándar es ordenar campos de mayor a menor alineación:

/* Antes: 48 bytes, 11 desperdiciados */
struct bad  { char flag; long counter; char name[16]; int id; void *ptr; };

/* Después: 40 bytes, 0 desperdiciados */
struct good { long counter; void *ptr; char name[16]; int id; char flag; };
TécnicaEfecto
Ordenar por alineación descendenteElimina la mayoría de agujeros
Agrupar campos hot juntosLos mantiene en una línea de cache
Split de campos cold en una segunda estructuraLos datos hot permanecen densos
__attribute__((packed))Elimina padding — pero puede ralentizar acceso desalineado
BitfieldsEmpacar flags pequeños

pahole incluso puede sugerir un reordenamiento con --reorganize:

pahole --reorganize -C mystruct ./myprogram

Trabajo del kernel (BTF)

ComandoPropósito
pahole -C task_struct /sys/kernel/btf/vmlinuxInspeccionar una estructura kernel activa
pahole -J vmlinuxGenerar BTF desde DWARF
pahole --btf_encodeBTF encoding para herramientas eBPF

La generación de BTF es por qué dwarves es una dependencia de build del kernel — el CO-RE de eBPF depende de ello.

Cuándo importa esto

SituaciónImpacto
Millones de instancias de una estructuraAhorros de memoria escalan linealmente
Loop hot tocando campos de estructuraMenos líneas de cache = menos misses
Serialización de red/discoEstructuras más pequeñas, menos I/O
Memoria embebida/restringidaCada byte cuenta
Una estructura usada dos vecesNo molestarse

pahole vs herramientas relacionadas

HerramientaResponde
pahole¿Cómo se layout esta estructura, y dónde está el desperdicio?
perf¿Realmente estoy teniendo cache misses?
valgrind (cachegrind)Comportamiento de cache simulado
heaptrack¿Dónde va la memoria heap?

Usa perf para confirmar que cache misses es tu cuello de botella, luego pahole para fijar el layout que lo causa.

Recursos