Agora, no devido tempo, consegui resolver isso sozinho, para que eu possa, pelo menos, fazer o mesmo para a posteridade.
Infelizmente, perdi o problema original em uma atualização do kernel, mas ganhei um novo, ainda pior no desempenho, e tão difícil de rastrear. As técnicas que encontrei foram as seguintes:
Primeiro de tudo, blktrace
/ blkparse
é uma ferramenta que achei bastante útil. Ele permite o rastreamento do progresso de solicitações individuais de E / S com muitos detalhes úteis, como o processo que enviou a solicitação. É útil colocar a saída em tmpfs
, para que a manipulação do armazenamento do rastreio não comece a se rastrear.
Isso ajudou apenas até agora, então eu compilei um kernel com mais funcionalidades de depuração. Em particular, achei ftrace
bastante útil, pois permitiu-me traçar o desempenho ruim processo dentro do espaço do kernel, para ver o que ele fez e onde bloqueou. A compilação de um kernel de depuração também fornece WCHAN
de saída para ps
, o que pode funcionar como uma maneira mais fácil de ver o que um processo está fazendo dentro do kernel, pelo menos em casos mais simples.
Eu também esperava que o LatencyTop fosse útil, mas eu achei muito bugs, e também que ele só exibia motivos de latência que eram muito "alto nível" para ser realmente útil, infelizmente.
Além disso, achei mais útil que iostat
simplesmente visualizar o conteúdo de /sys/block/$DEVICE/stat
em intervalos muito próximos, simplesmente assim:
while :; do cat /sys/block/sda/stat; sleep .1; done
Consulte Documentation/iostats.txt
na árvore de origem do kernel para o formato do arquivo stat
. Vê-lo a intervalos curtos permitiu-me ver a hora e o tamanho exacto das explosões de E / S e de tais coisas.
No final, descobri que o problema que tive após a atualização do kernel foi causado por páginas estáveis , um recurso introduzido no Linux 3.0, fazendo com que, no meu caso, o Berkeley DB parasse por longos períodos ao sujar as páginas em seus arquivos de região do mmap. Embora pareça possível consertar esse recurso, e também que os problemas que ele causa possam ser corrigidos no Linux 3.9, eu resolvi o pior problema que tive por agora por corrigindo o Berkeley DB para permitir que eu coloque seus arquivos de região em um diretório diferente (no meu caso /dev/shm
), permitindo-me evitar o problema completamente.