有没有办法监视btrfs重新平衡的进度?


13

我正在替换镜像的btrfs中发生故障的硬盘驱动器。

btrfs device delete missing /[mountpoint]花费的时间长,所以我认为它实际上是在重新平衡替换驱动器上的数据。

有什么方法可以监视这种操作的进度?

我不一定期望外观漂亮的GUI甚至%计数器;而且如果必要的话,我愿意写几行shell脚本,但是我什至不知道从哪里开始寻找相关数据。btrfs filesystem show例如,它刚刚挂起,大概在显示平衡的fs的任何信息之前等待平衡操作完成。

Answers:


25
btrfs balance status /mountpoint

man 8 btrfs

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

        Options

        -v   be verbose

4
谢谢,事实证明,在我的情况下,btrfs似乎没有将当前操作视为平衡,因为该操作不会返回任何值,但是我看到还有一个“替换状态”,如果我使用了replace命令,我可能会使用它。好的答案不管。
user50849 2014年

余额状态应类似于:Balance on '/volume1' is running 28 out of about 171 chunks balanced (1156 considered), 84% left。异常地,百分比倒数。
mwfearnley '18

7
sudo btrfs fi show

这将输出如下内容:

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

并且,如果您注意到设备ID#4看起来与其余设备略有不同。当您执行“ btrfs设备删除丢失的/ mntpoint”时,它将开始重新生成释放该“丢失”驱动器所需的raid元/数据。

如果你做类似的事情

"watch -n 10 sudo btrfs fi show"

然后您会看到有问题的“丢失”设备上的空间越来越小,直到操作完成并将其从fi中移除。


4

在将数据写入您希望写入的驱动器之前,BTRFS可能需要一些时间来读取或重新排列数据。

您可以看到有多少CPU时间用于BTRFS操作,包括重新平衡,添加,删除,转换等:

ps -ef | grep btrfs

要查看每个驱动器的繁忙程度,请安装sysstat并运行:

iostat

添加一些选项以使iostat以兆字节为单位显示统计信息,并每30秒更新一次:

iostat -m -d 30

scrub的样本输出,因此在此时间间隔内没有写操作:

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

安装并运行munin可以查看驱动器活动的历史图表以及许多其他信息。 https://www.digitalocean.com/community/tutorials/how-to-install-the-munin-monitoring-tool-on-ubuntu-14-04


1

我还想知道什么时候才能完成持久删除,所以我想出了这小段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

这将为您提供一个不错的进度条,如下所示:

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

总体思路是pv用来显示进度。由于该命令仅允许监视流经管道的字节,因此我们使用dd它生成适当数量的零并将其通过管道传输到中pv

这种方法的优点是您会获得一个不错的进度条。但是,由于似乎btrfs总是一次删除一个GB的数据,因此需要一段时间才能观察到字节大小的新差异。

为了解决此问题,将该标志-a添加到默认标志,pv以使其显示平均传输速率(因为大多数情况下正常的当前传输速率将为0)。

我意识到这不是最好的解决方案,而是我能想到的最好的解决方案。如果有人有改进的想法,请告诉我!:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.