Depurando a latência de E / S do Linux

13

Estou tendo alguns problemas de E / S em alguns sistemas Linux que administro. Eles se manifestam no fato de que os processos geralmente bloqueiam por vários segundos em chamadas simples como abrir (), desvincular () ou fechar () nos arquivos (o que é um problema porque alguns dos programas envolvidos precisam de latência de E / S bastante baixa para operar). devidamente). É verdade que os sistemas em questão experimentam uma carga moderada de E / S, mas mal posso pensar que seria suficiente para justificar tempos de latência tão enormes. Às vezes, as chamadas podem levar mais de 15 segundos para serem concluídas (embora, com mais freqüência, elas possam demorar 1 ou 2 ou 3 segundos).

Minha pergunta é: Como posso descobrir por que isso acontece? O que eu gostaria é de uma ferramenta que possa me dizer por que os processos em questão estão bloqueados no kernel e por que o que eles dormem está ocupado, o que está acontecendo com ele e essas coisas. Existe essa ferramenta ou existe outra maneira de tentar depurar o que acontece?

Como alternativa, é claro, se você tem alguma idéia do que realmente está acontecendo, como isso pode ser evitado?

Para o registro, o sistema de arquivos que eu uso é o XFS.

Dolda2000
fonte

Respostas:

14

Agora, no devido tempo, eu mesmo consegui resolver isso, para que eu possa pelo menos acompanhá-lo para a posteridade.

Infelizmente, perdi o problema original em uma atualização do kernel, mas ganhei uma nova, com desempenho ainda pior e 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 rastrear o andamento de solicitações de E / S individuais com muitos detalhes úteis, como o processo que enviou a solicitação. É útil tmpfsativar a saída , para que o manuseio do armazenamento do rastreamento não inicie o rastreamento.

Porém, isso só ajudou até agora, então eu compilei um kernel com mais funcionalidade de depuração. Em particular, achei ftracebastante útil, pois me permitiu rastrear o processo com baixo desempenho 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 WCHANresultados funcionais ps, o que pode funcionar como uma maneira mais fácil de ver o que um processo está fazendo dentro do kernel, pelo menos para casos mais simples.

Eu também esperava que o LatencyTop fosse útil, mas o achei bastante problemático e também exibia apenas razões de latência que eram "de alto nível" demais para serem realmente úteis, infelizmente.

Além disso, achei mais útil do iostatque simplesmente exibir o conteúdo /sys/block/$DEVICE/statem intervalos muito próximos, da seguinte maneira:

while :; do cat /sys/block/sda/stat; sleep .1; done

Veja Documentation/iostats.txtna árvore de fontes do kernel o formato do statarquivo. Visualizá-lo em intervalos próximos me permitiu ver o tempo exato e o tamanho das explosões de E / S e coisas assim.

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 seu mapa. arquivos de região. Embora pareça possível corrigir esse recurso e também que os problemas que ele causa possam ser corrigidos no Linux 3.9, resolvi o pior problema que eu tinha agora corrigindo o Berkeley DB para permitir que eu colocasse seus arquivos de região em um diretório diferente (no meu caso /dev/shm), permitindo-me evitar completamente o problema.

Dolda2000
fonte
3

De acordo com minha experiência, a ferramenta estatística mais simples e detalhada que você pode instalar para rastrear problemas misteriosos de desempenho do sistema é http://freecode.com/projects/sysstat aka. sar

com certeza você deseja examinar também a saída do comando iostat, especialmente quanto seu% iowait deve estar abaixo de 5-10% sob a carga normal do sistema (abaixo de 1,0 ou mais).

observe a saída ps se, na coluna STAT, você vê status D que significa que esses processos estão bloqueados e aguardando E / S, muito provavelmente um problema de hardware com o controlador ou o disco, verifique as estatísticas SMART e dmesg e syslog para obter pistas.

verifique o log do sar e identifique os horários de pico, se isso acontecer, e tente combiná-los com tarefas cron intensivas em disco, por exemplo, backups na rede

você pode avaliar o desempenho do seu disco com o bonnie ++

Feczo
fonte
3

Pensei em mencionar strace, mesmo que essa pergunta já tenha meses. Pode ajudar alguém com um problema semelhante que encontra esta página.

experimentar.

strace "application"

você também pode fazer

strace -e read,write "application"

para mostrar apenas eventos de leitura / gravação.

O aplicativo será carregado normalmente (embora um pouco mais lento para iniciar) e você poderá usá-lo normalmente para desencadear o problema. A saída aparecerá no shell que você usou para iniciar o strace.

O bom do strace é que você pode ver a chamada de função / kernel mais recente no momento em que o aplicativo aciona a desaceleração. Você pode achar que, se suas /homecontas estiverem no NFS, o aplicativo está tendo alguma dificuldade com a E / S de arquivo pelo NFS por algum motivo.

Smar
fonte