desenv-web-rp.com

Posso observar o progresso de uma operação de `sincronização`?

Copiei um arquivo grande para um disco USB montado em um sistema Linux com assíncrono. Isso retorna para um prompt de comando com relativa rapidez, mas quando eu digito sync, é claro, tudo precisa ir para o disco, e isso leva muito tempo.

Entendo que vai ser lento, mas existe algum lugar onde eu possa assistir a um contador descer para zero? Observar buffers em top não ajuda.

110
mattdm

Olhando para /proc/meminfo mostrará o número Dirty encolhendo ao longo do tempo, à medida que todos os dados são processados; algumas delas podem se espalhar para Writeback também. Esse será um resumo de todos os dispositivos, mas nos casos em que um dispositivo no sistema é muito mais lento que o restante, você geralmente terminará onde tudo nessa fila está relacionado a ele. Você provavelmente encontrará o número Dirty grande ao iniciar e o sync termina na mesma hora em que se aproxima de 0. Tente isto para obter uma exibição interativa:

watch -d grep -e Dirty: -e Writeback: /proc/meminfo

Em discos regulares, normalmente posso ignorar Writeback, mas não tenho certeza se ele está envolvido com mais frequência no caminho da transferência USB. Se ele apenas subir e descer sem uma tendência clara, provavelmente você pode apenas olhar para o número Dirty.

178
Greg Smith

Você pode olhar para o /sys/block/<device>/stat para o dispositivo apropriado enquanto você está sincronizando. Os 9º A coluna indicará o número de solicitações de bordo no dispositivo, que deve diminuir para zero quando a sincronização for concluída.
Não sabe como traduzir isso para um número de bytes, mas deve fornecer uma idéia aproximada de quanto "material" ainda está pendente.

Veja o arquivo stat.txt na documentação do kernel para obter mais informações. (Também existe um arquivo inflight nesse diretório do meu sistema que parece conter solicitações de leitura e gravação em andamento, mas não consigo encontrar documentos para isso.)

24
Mat

Usando a resposta de Greg, você pode simplesmente executar sync em segundo plano enquanto exibe o estado do bloco Dirty na memória.

Para conseguir isso, basta executar este comando:

sync & watch -n 1 grep -e Dirty: /proc/meminfo

Isso chamará sync em segundo plano enquanto executa watch na frente. Quando o comando sync for concluído (aproximadamente quando o tamanho do bloco Dirty atingir 0), você terá uma saída parecida com esta:

1]  + 27260 done        sync

Isso significa que o comando foi concluído e você pode matar o comando watch com Ctrl+C.

12
jflemieux