Existe uma maneira de monitorar o progresso de um reequilíbrio btrfs?

13

Estou substituindo um disco rígido com falha em um btrfs espelhado.

btrfs device delete missing /[mountpoint]está demorando muito , então suponho que na verdade esteja reequilibrando os dados para a unidade de substituição.

Existe alguma maneira de monitorar o progresso de tal operação?

Eu não necessariamente espero uma GUI bonita, ou mesmo um contador de%; e estou disposto a escrever algumas linhas de shell script, se necessário, mas nem sei por onde começar a procurar dados relevantes. btrfs filesystem showpor exemplo, apenas trava, presumivelmente aguardando a conclusão da operação de balanceamento antes de exibir qualquer informação sobre o fs espelhado.

user50849
fonte

Respostas:

25
btrfs balance status /mountpoint

man 8 btrfs

 [filesystem] balance status [-v] <path>
        Show status of running or paused balance.

        Options

        -v   be verbose
llua
fonte
4
Obrigado, acontece que, no meu caso, o btrfs não parece considerar a operação atual um saldo, pois isso não retorna nada, mas vejo que também há um "status de substituição", que eu provavelmente poderia ter usado, se tivesse usado o comando replace . Boa resposta, independentemente.
user50849
O estado de equilíbrio deve ser algo como: Balance on '/volume1' is running 28 out of about 171 chunks balanced (1156 considered), 84% left. Invulgarmente, a porcentagem é reduzida.
precisa saber é o seguinte
7
sudo btrfs fi show

isso produzirá algo assim:

Label: none  uuid: 2c97e7cd-06d4-4df0-b1bc-651397edf74c
        Total devices 16 FS bytes used 5.36TiB
        devid    1 size 931.51GiB used 770.48GiB path /dev/sdc
        devid    2 size 931.51GiB used 770.48GiB path /dev/sdg
        devid    3 size 931.51GiB used 770.48GiB path /dev/sdj
        devid    4 size 0.00 used 10.02GiB path
        devid    5 size 931.51GiB used 770.48GiB path /dev/sdh
        devid    6 size 931.51GiB used 770.48GiB path /dev/sdi
        devid    7 size 931.51GiB used 770.48GiB path /dev/sdd
        devid    8 size 931.51GiB used 770.48GiB path /dev/sdo
        devid    9 size 465.76GiB used 384.31GiB path /dev/sdn
        devid    10 size 931.51GiB used 770.48GiB path /dev/sdp
        devid    11 size 931.51GiB used 770.48GiB path /dev/sdr
        devid    12 size 931.51GiB used 770.48GiB path /dev/sdm
        devid    13 size 931.51GiB used 769.48GiB path /dev/sdq
        devid    14 size 931.51GiB used 770.48GiB path /dev/sdl
        devid    15 size 931.51GiB used 770.48GiB path /dev/sde
        devid    16 size 3.64TiB used 587.16GiB path /dev/sdf

Btrfs v3.12

E se você notar que o ID do dispositivo nº 4 parece um pouco diferente do resto. quando você faz "btrfs device delete missing / mntpoint", ele começará a regenerar os metadados / dados do raid necessários para liberar a unidade "ausente".

se você fizer algo como

"watch -n 10 sudo btrfs fi show"

então você pode ver o espaço no dispositivo "ausente" ofensivo gradualmente ficando cada vez menor até que a operação seja concluída e ela seja removida do fi.

Ás
fonte
4

O BTRFS pode demorar algum tempo lendo ou reorganizando dados antes de gravar dados na unidade em que você espera que eles gravem.

Você pode ver quanto tempo de CPU está sendo dedicado às operações de BTRFS, incluindo rebalanceamento, adição, exclusão, conversão, etc:

ps -ef | grep btrfs

Para ver como cada unidade está ocupada, instale o sysstat e execute:

iostat

Adicione algumas opções para fazer com que o iostat mostre estatísticas em megabytes e atualize a cada 30 segundos:

iostat -m -d 30

Amostra de saída do scrub para que não haja gravações durante este intervalo:

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda             700.30       170.10         0.00       6804          0
sdb               0.78         0.00         0.01          0          0
sdc             520.20       127.98         0.00       5119          0
sdd             405.72        92.02         0.00       3680          0
sde             630.05       153.66         0.00       6146          0
sdf             627.43       153.60         0.00       6144          0

Instale e execute o munin para ver gráficos históricos da atividade da unidade e muitas outras informações. https://www.digitalocean.com/community/tutorials/how-to-install-the-munin-monitoring-tool-on-ubuntu-14-04

Charles Young
fonte
1

Eu também estava imaginando quando uma exclusão duradoura terminaria, então eu vim com esse pequeno pedaço de código shell:

get_bytes() {
  btrfs device usage --raw /mnt/data | egrep -- '-[0-9]+' | sed -E 's/[^0-9]+([0-9]+)/\1/'
}

prev=$(get_bytes)

while [ 1 ]; do
  current=$(get_bytes)
  diff=$((current-prev))
  if [ "$diff" -gt 0 ]; then
    dd if=/dev/zero iflag=count_bytes count="$diff" 2>/dev/null
  fi
  prev="$current"
  sleep 1
done | pv -petraW -s $(get_bytes) >/dev/null

Isso fornecerá uma boa barra de progresso como esta:

0:13:54 [0,00 B/s] [16,0MiB/s] [>                             ]  1% ETA 19:23:19

A idéia geral é usar pvpara exibir o progresso. Como esse comando permite apenas monitorar bytes que fluem através de um canal, usamos ddpara gerar uma quantidade apropriada de zeros e inseri-los pv.

A vantagem desse método é que você obtém uma boa barra de progresso. No entanto, como parece btrfssempre excluir os dados, um GB de cada vez, leva algum tempo até que uma nova diferença no tamanho dos bytes seja observada.

Para resolver esse problema, o sinalizador -aé adicionado aos sinalizadores padrão pvpara exibir uma taxa de transmissão média (já que a taxa de transmissão atual normal será 0 na maioria das vezes).

Sei que essa não é a melhor solução, mas a melhor que eu poderia encontrar. Se alguém tiver idéias para melhorias, entre em contato! :)

Erki der Loony
fonte