¿Hay alguna manera de monitorear el progreso de un reequilibrio btrfs?

13

Estoy reemplazando un disco duro fallido en un btrfs reflejado.

btrfs device delete missing /[mountpoint]está tomando muy larga, así que supongo que en realidad es el reequilibrio de datos a través de la unidad de repuesto.

¿Hay alguna forma de monitorear el progreso de tal operación?

No necesariamente espero una GUI bonita, o incluso un contador%; y estoy dispuesto a escribir un par de líneas de script de shell si es necesario, pero ni siquiera sé por dónde empezar a buscar datos relevantes. btrfs filesystem showpor ejemplo, simplemente se cuelga, presumiblemente esperando que finalice la operación de la balanza antes de que muestre cualquier información sobre el espejo reflejado.

usuario50849
fuente

Respuestas:

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
fuente
44
Gracias, resulta que en mi caso btrfs no parece considerar la operación actual como un equilibrio, ya que eso no devuelve nada, pero veo que también hay un "estado de reemplazo", que probablemente podría haber usado, si hubiera usado el comando de reemplazo . Buena respuesta independientemente.
user50849
El estado de equilibrio debe ser algo como: Balance on '/volume1' is running 28 out of about 171 chunks balanced (1156 considered), 84% left. Inusualmente, el porcentaje cuenta atrás.
mwfearnley
7
sudo btrfs fi show

esto generará algo así:

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

Y si notas que la identificación del dispositivo # 4 se ve un poco diferente al resto. cuando haces "btrfs device delete missing / mntpoint", entonces comenzará a regenerar los meta / datos de raid necesarios para liberar esa unidad "faltante".

si haces algo como

"watch -n 10 sudo btrfs fi show"

entonces puede ver que el espacio en el dispositivo ofensivo "perdido" gradualmente se hace más y más pequeño hasta que la operación se completa y se eliminará del fi.

As
fuente
4

BTRFS puede tardar un tiempo en leer o reorganizar los datos antes de escribirlos en la unidad en la que espera que escriban.

Puede ver cuánto tiempo de CPU se dedica a las operaciones BTRFS, incluido el reequilibrio, agregar, eliminar, convertir, etc.

ps -ef | grep btrfs

Para ver qué tan ocupada está cada unidad, instale sysstat y ejecute:

iostat

Agregue algunas opciones para hacer que iostat muestre estadísticas en megabytes y actualice cada 30 segundos:

iostat -m -d 30

Salida de muestra de scrub para que no se escriba 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 y ejecute munin para ver gráficos históricos de la actividad de la unidad y mucha otra información. https://www.digitalocean.com/community/tutorials/how-to-install-the-munin-monitoring-tool-on-ubuntu-14-04

Charles Young
fuente
1

También me preguntaba cuándo terminaría una eliminación duradera, así que se me ocurrió este pequeño código de 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

Esto te dará una buena barra de progreso como esta:

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

La idea general es usar pvpara mostrar el progreso. Dado que ese comando solo permite monitorear los bytes que fluyen a través de una tubería que usamos ddpara generar una cantidad adecuada de ceros y canalizarlos pv.

La ventaja de este método es que obtienes una buena barra de progreso. Sin embargo, dado que parece que btrfssiempre elimina los datos de un GB a la vez, lleva algún tiempo hasta que se pueda observar una nueva diferencia en el tamaño de los bytes.

Para solucionar este problema, el indicador -ase agrega a los indicadores predeterminados de pvpara que muestre una velocidad de transmisión promedio (ya que la velocidad de transmisión actual normal será 0 la mayor parte del tiempo).

Me doy cuenta de que esta no es la mejor solución, sino la mejor que se me ocurrió. Si alguien tiene ideas para mejoras, ¡hágamelo saber! :)

Erki der Loony
fuente