Salta ai contenuti

pahole - Analisi del Layout di Struct e Cache-Line

pahole - Analisi del Layout di Struct e Cache-Line Cheatsheet

pahole (“poke-a-hole”) legge informazioni di debug DWARF o BTF e stampa il layout di memoria effettivo delle strutture C — dove si trova ogni campo, quanto padding il compilatore ha inserito e quante cache line la struct attraversa. I compilatori padding le struct per soddisfare l”allineamento, e una struct ordinata incautela può sprecare decine di byte e attraversare cache line extra. Su strutture di dati hot questo si traduce direttamente in cache miss. pahole rende lo spreco visibile in modo da poter riordinare i campi e ridurlo.

Installazione

PiattaformaComando
Debian/Ubuntusudo apt install dwarves
Fedora/RHELsudo dnf install dwarves
Arch Linuxsudo pacman -S pahole
Dal sorgentebuild il progetto dwarves
Verificapahole --version

Il tuo binario deve essere costruito con informazioni di debug (-g). I binari privati non hanno nulla da leggere per pahole.

Utilizzo di Base

ComandoDescrizione
pahole ./myprogramMostra tutte le struct nel binario
pahole -C mystruct ./myprogramUna struct specifica
pahole -C task_struct /sys/kernel/btf/vmlinuxStruct kernel via BTF
pahole --sizes ./myprogramElenca le dimensioni di struct
pahole -H 1 ./myprogramSolo struct con ≥1 buco

Lettura dell”Output

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 */
};
AnnotazioneSignificato
/* offset size */Offset di byte e dimensione di ogni campo
XXX N bytes holePadding che il compilatore ha inserito
size:Dimensione totale di struct
cachelines:Quante linee da 64 byte attraversa
sum holes:Byte totali sprecati
last cacheline:Byte usati nella riga finale

Ricerca di Spreco in Un Codebase

ComandoTrova
pahole -H 1 ./binStruct con buchi
pahole --nr_members ./binOrdinato per numero di membri
pahole -c 2 ./binStruct che attraversano ≥2 cache line
pahole -E ./binEspandi struct nidificate inline
pahole -a ./binMostra dettagli di allineamento/packing
# Quali struct sprecano più memoria per padding?
pahole -H 8 ./myprogram | head -50

Fissaggio del Layout

La fix standard è ordinare i campi dal più grande al più piccolo allineamento:

/* Prima: 48 byte, 11 sprecati */
struct bad  { char flag; long counter; char name[16]; int id; void *ptr; };

/* Dopo: 40 byte, 0 sprecati */
struct good { long counter; void *ptr; char name[16]; int id; char flag; };
TecnicaEffetto
Ordina per allineamento decrescenteElimina la maggior parte dei buchi
Raggruppa campi hot insiemeMantienili in una cache line
Dividi campi freddi in una seconda structI dati hot rimangono densi
__attribute__((packed))Rimuove il padding — ma potrebbe rallentare l”accesso non allineato
BitfieldPacca piccoli flag

pahole può anche suggerire un riordinamento con --reorganize:

pahole --reorganize -C mystruct ./myprogram

Lavoro su Kernel (BTF)

ComandoScopo
pahole -C task_struct /sys/kernel/btf/vmlinuxIspeziona una struct kernel live
pahole -J vmlinuxGenera BTF da DWARF
pahole --btf_encodeCodifica BTF per il tooling eBPF

La generazione di BTF è il motivo per cui dwarves è una dipendenza della build del kernel — CO-RE di eBPF si basa su di essa.

Quando Questo Importa

SituazioneImpatto
Milioni di istanze di una structIl risparmio di memoria scala linearmente
Loop hot che tocca i campi di structMeno cache line = meno miss
Serializzazione di rete/discoStruct più piccoli, meno I/O
Memoria embedded/ristrettaOgni byte conta
Una struct usata due volteNon disturbarti

pahole vs Tool Correlati

ToolRisposte
paholeCome è disposta questa struct e dove è lo spreco?
perfSto effettivamente avendo cache miss?
valgrind (cachegrind)Comportamento di cache simulato
heaptrackDove va la memoria heap?

Usa perf per confermare che i cache miss sono il tuo collo di bottiglia, poi pahole per fissare il layout che li causa.

Risorse