A tempo debito, sono riuscito a risolverlo da solo, quindi posso almeno seguirlo da solo per i posteri.
Sfortunatamente, ho perso il problema originale in un aggiornamento del kernel, ma ne ho guadagnato uno nuovo, anche peggio in termini di prestazioni e altrettanto difficile da rintracciare. Le tecniche che ho trovato erano le seguenti:
Prima di tutto, blktrace
/ blkparse
è uno strumento che ho trovato molto utile. Consente di tracciare l'avanzamento delle singole richieste I / O con molti dettagli utili, come il processo che ha inviato la richiesta. È utile attivare l'output tmpfs
, in modo che la gestione dell'archiviazione della traccia non inizi a tracciare se stessa.
Ciò ha aiutato solo finora, quindi ho compilato un kernel con più funzionalità di debug. In particolare, ho trovato ftrace
abbastanza utile, dal momento che mi ha permesso di tracciare il processo poco performante all'interno dello spazio del kernel, per vedere cosa faceva e dove si bloccava. Anche la compilazione di un kernel di debug fornisce un WCHAN
output funzionante ps
, che può funzionare come un modo più semplice per vedere cosa sta facendo un processo all'interno del kernel, almeno per i casi più semplici.
Speravo anche che LatencyTop fosse utile, ma l'ho trovato abbastanza difettoso, e inoltre mostrava solo motivi di latenza che erano troppo "di alto livello" per essere veramente utili, sfortunatamente.
Inoltre, ho trovato più utile che iostat
semplicemente visualizzare il contenuto di /sys/block/$DEVICE/stat
a intervalli molto ravvicinati, semplicemente in questo modo:
while :; do cat /sys/block/sda/stat; sleep .1; done
Vedi Documentation/iostats.txt
nella struttura dei sorgenti del kernel per il formato del stat
file. La visualizzazione ad intervalli ravvicinati mi ha permesso di vedere i tempi e le dimensioni esatte delle esplosioni di I / O e cose simili.
Alla fine, ho scoperto che il problema che avevo dopo l'aggiornamento del kernel era causato da pagine stabili , una funzionalità introdotta in Linux 3.0, che causava, nel mio caso, l'arresto di Berkeley DB per periodi prolungati quando sporcava le pagine nel suo mmap'ed file regionali. Mentre sembra possibile correggere questa funzionalità e anche che i problemi che causa potrebbero essere risolti in Linux 3.9, ho risolto il problema peggiore che ho avuto per ora patch Berkeley DB per permettermi di mettere i suoi file regionali in una directory diversa (nel mio caso /dev/shm
), permettendomi di evitare del tutto il problema.