Existe uma maneira de medir o progresso do ext4lazyinit?

17

Eu fiz uma pergunta sobre ext4lazyinit aqui . Pelo que li e compreendi, ele simplesmente permite que você comece a usar o disco rígido sem criar todos os inodes para o seu sistema de arquivos.

A única maneira que você sabe ou medida lata está monitorando ext4lazyinitno iotop. Existe uma maneira de obter seu progresso como uma porcentagem?

shirish
fonte
2
verifique esta discussão remendo
Krzysztof Stasiak
Você tentou os utilitários bar [1] ou pv [2]? [1]: [ archlinux.org/packages/community/any/bar/] [2]: [ archlinux.org/packages/community/x86_64/pv/]
mattia.b89 16/17
@ mattia.b89 ext4lazyinit não é um programa para o espaço do usuário, é um processo do kernel em segundo plano. Verifique o link na pergunta que aponta para a pergunta original de shirish sobre isso para obter informações.
Austin Hemmelgarn
Além disso, eu tenderia a concordar com a avaliação de Ted T'so na discussão do patch que o @KrzysztofStasiak vinculou, se você estiver em uma situação em que precisa esperar que isso termine, provavelmente não deve usá-lo.
Austin Hemmelgarn
@KrzysztofStasiak você poderia dar uma resposta? Acho que esta é a mais próxima que posso chegar da resposta. FWIW Ted Tso é sinônimo de ext *, sejam quais forem suas crenças, elas são importantes.
Shirish

Respostas:

1

Verifique esta discussão do patch . Você pode inicializar o sistema sem o lazyinit, mas não pode medi-lo. Se você tiver tempo para esperar, apenas espere. Você pode tentar o patch da discussão, mas, de acordo com o Patchwork, o estado "rejeitou".

Krzysztof Stasiak
fonte
1

Parece que encontrei uma maneira de aproximar o progresso do ext4lazyinit.

TL; DR: veja o script abaixo.

Esse método pressupõe que o disco nunca foi desconectado (nem o sistema foi reinicializado) desde a primeira vez em que a partição foi montada e que você gravou exatamente tantos dados na partição quanto em uso nela (portanto, nenhuma exclusão) ou modificação de arquivos).

Etapa 1 : Compare o tamanho da partição no fdisk (convertido em kiB) com o número de blocos de 1K mostrados em df. Subtraia (número de blocos de 1K) de (tamanho da partição em kiB) para obter (tamanho aproximado da tabela de inodes).

EDIT: Exemplo, fdisk:

Sector size (logical/physical): 512 bytes / 4096 bytes
(...omitted...)
Device     Start         End     Sectors  Size Type
/dev/sdd1   2048 11720978398 11720976351  5.5T Linux filesystem

df:

Filesystem              1K-blocks       Used  Available Use% Mounted on
/dev/mapper/workbackup 5813233164 1217095176 4596121604  21% /mnt/backup_work

11720976351 setores * 512 bytes / setor / 1024 = 5860488175,5 kiB (quase 5,5 TiB, como diz o fdisk). Menos 5813233164 de DF é igual a 47255011,5 kiB (cerca de 45 GiB) para o tamanho aproximado da tabela de inodos.

Etapa 2 : obter (total de kiB gravado na partição):

awk '{ print $3"\t"$10 }' /proc/diskstats

Escolha a linha certa para sua partição e converta-a em kiB.

EDIT: exemplo:

sdb     260040
sdb1    260040
sdd     2530109116
sdd1    2530108940

Usando sdd1 no meu caso, kiB total gravado = 2530108940 setores * 512 bytes / setor / 1024 = 1265054470 kiB (quase 1,2 TiB).

Etapa 3 : necessário apenas se você já tiver gravado dados no sistema de arquivos. Subtraia (número de blocos de 1K USADO, mostrado em df) de (total de kiB gravado na partição) para obter (aproximadamente kiB gravado na tabela de inodes).

EDIT: exemplo: kiB aproximado gravado na tabela de inode = 1265054470 (da etapa 2) - 1217095176 (consulte a saída df na etapa 1) = 47959294 kiB (45,7 GiB)

Etapa 4 : divida (aproximadamente kiB gravado na tabela de inodes) por (tamanho aproximado da tabela de inodes em kiB) e multiplique por 100 para obter o progresso como uma porcentagem.

EDIT: exemplo: progresso aproximado = 47959294 / 47255011,5 * 100% = 101,5%

Roteiro

Ou para escrever isso como um script parcial (onde eu me recuso a escrever uma chamada para o fdisk, por razões de segurança):

let sectorsize=$(cat /sys/block/sda/queue/hw_sector_size)
let partsize=$2*$sectorsize/1024
let fssize=$(df -- "$3" | tail -n -1 | awk '{print $2}')
let approxinodetablesize=$partsize-$fssize
let tkw=$(awk "/$1/"' {print $10}' /proc/diskstats | head -n 1)*$sectorsize/1024
let used=$(df -- "$3" | tail -n -1 | awk '{print $3}')
let tkw_inodetable=$tkw-$used
echo "Approximate progress: $(bc -l <<< "$tkw_inodetable*100.0/$approxinodetablesize") %"

Ligue com $ 1 = "nome da partição" (por exemplo, sdd1), $ 2 = "setores da partição de acordo com o fdisk", $ 3 = "ponto de montagem sem barra"

Resultado dos testes

Eu só testei meu método uma vez. Configuração:

  • Partição de 6 TB

  • criptografia usando cryptsetup

  • sistema de arquivos criado com parâmetros padrão, exceto -m 0

  • 279 GiB de arquivos gravados na partição antes da ext4lazyinit ser concluída.

Resultado : uma leitura de 99,7% no momento da conclusão :-)

EDIT: mesmo disco, depois de gravar quase outro TiB de dados, agora produz uma estimativa de 101,5%. Preciso o suficiente para ser útil, eu acho.

theaviatrix
fonte
teria sido melhor ter um exemplo, para termos uma idéia do que exatamente estaríamos olhando.
Shirish
@ shirish Obrigado pela sua sugestão.
theaviatrix