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

103

Copiei um arquivo grande para um disco USB montado em um sistema Linux com assíncrono. Isso retorna para um prompt de comando de forma relativamente rápida, 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? Assistindo buffersem topnão ajuda.

mattdm
fonte
para obter mais informações, consulte: lwn.net/Articles/572911
lanoxx

Respostas:

162

Observar /proc/meminfomostrará o Dirtynúmero diminuindo ao longo do tempo, à medida que todos os dados serão processados; algumas delas também podem se espalhar Writeback. 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 Dirtynúmero grande quando iniciar e syncterminar quase ao mesmo tempo 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 de transferência USB. Se ele apenas saltar para cima e para baixo sem uma tendência clara, provavelmente você pode apenas olhar para o Dirtynúmero.

Greg Smith
fonte
4
No meu sistema, o write-back fica a alguns megas até logo no final, quando Dirty está vazio, e nesse ponto também começa a diminuir.
mattdm
24

Você pode procurar no /sys/block/<device>/statarquivo o dispositivo apropriado enquanto estiver sincronizando. A 9 ª coluna indicará o número de pedidos em voo sobre o dispositivo, que deve ir para baixo a zero quando a sincronização está feito.
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 um pouco mais de informação. (Também há um inflightarquivo nesse diretório no meu sistema que pode conter solicitações de leitura e gravação em andamento, mas não consigo encontrar documentos para isso.)

Esteira
fonte
3
Apenas para uma referência útil, combinando uma idéia de outra resposta:watch -t -n1 'awk "{ print \$9 }" /sys/block/sdd/stat'
mattdm
4
Para o meu pendrive, isso tende a pairar em torno de 150 durante toda a duração da operação de cópia e syncdepois. Ele chega a 0, mas apenas no final. Isso torna a outra resposta mais útil para observar impacientemente o progresso.
mattdm
1
(Embora, em teoria, eu gosto de olhar apenas o dispositivo apropriado, em vez da informação em todo o sistema.)
mattdm
Existe uma maneira de obter a quantidade de bytes gravados (sincronizados, liberados durante o vôo) ou armazenados em cache para serem gravados na unidade? Se eu tivesse um tamanho de cache de gravação por unidade, poderia usá-lo dupara calcular os dados reais que são sincronizados na unidade.
Unfa 26/04
10

Usando a resposta de Greg, você pode simplesmente syncexecutar 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á syncem segundo plano enquanto estiver executando watchna frente. Quando o synccomando terminar (aproximadamente quando o tamanho do bloco Dirty atingir 0), você terá uma saída semelhante a esta:

1]  + 27260 done        sync

Isso significa que o comando foi concluído e você pode matá-lo watchcom Ctrl+ C.

jflemieux
fonte
BTW: Eu sei que essa é uma pergunta antiga, mas é a primeira que aparece no Google quando alguém a procura e eu queria adicionar a solução que encontrei.
Jflemieux
1
Pena que o sync / umount não recebeu atualizações do kernel e pode imprimir esse tipo de coisa diretamente, se solicitado.
mcr