【问题标题】:BTRFS raid-1: which device gets the reads?BTRFS raid-1:哪个设备读取?
【发布时间】:2019-03-28 23:16:29
【问题描述】:

我有一个具有以下配置的 raid-1:

$ btrfs fi show
Total devices 2 FS bytes used 203.31GiB
        devid    1 size 224.00GiB used 206.03GiB path /dev/sda
        devid    2 size 224.00GiB used 206.03GiB path /dev/mmcblk0p4

/dev/mmcblk0p4 快,/dev/sda

什么决定了哪个设备会获得 IO 读取,有没有办法控制它?

【问题讨论】:

  • 你的linux内核版本是多少?什么是“sda”(是硬盘)? 2017 年和 2018 年的补丁“Btrfs: enchanse raid1/10 balance heuristic for non-rotating devices”被提出,但仍然没有被接受。 md-raid1 应该有 ssd over hdd 逻辑。你知道 ZFS 和 ssd-hdd 平衡吗?
  • 我的内核是 4.19.25

标签: btrfs


【解决方案1】:

从 5.0 版本的 Linux 内核开始,有一个代码来决定将使用镜像阵列的哪一部分。它使用进程的 pid 来选择可用的条带之一:

https://elixir.bootlin.com/linux/v5.0/source/fs/btrfs/volumes.c

static int find_live_mirror(struct btrfs_fs_info *fs_info, ...
{ ...
    if (map->type & BTRFS_BLOCK_GROUP_RAID10)
        num_stripes = map->sub_stripes;
    else
        num_stripes = map->num_stripes;

    preferred_mirror = first + current->pid % num_stripes;

当数据替换处于活动状态时,还有用于更改首选的附加逻辑。但是当前代码在“旋转”选择逻辑上没有“SSD”。

Timofey Titovets 提出了一个补丁来实现搜索 ssd 以在 2017 年和 2018 年将其用作首选,但仍未被接受:

Btrfs:增强非旋转设备的 raid1/10 平衡启发式 蒂莫菲·蒂托维茨。 2017 年 12 月 27 日,星期三

目前 btrfs raid1/10 平衡器对镜像的 blance 请求, 基于 pid % 镜像数。 ...

如果其中一个镜像是非旋转的,则所有读取请求将被移动到非旋转设备。 ...

附:灵感来自 md-raid1 读取平衡

https://www.spinics.net/lists/linux-btrfs/msg80033.html [PATCH V5] Btrfs:增强 raid1/10 平衡启发式,2018 年 7 月 7 日

https://patchwork.kernel.org/patch/10681671/ [V8] Btrfs:增强 raid1/10 平衡启发式,2018 年 11 月 14 日

【讨论】:

  • 那么根据用户进程pid是奇数还是偶数来确定首选设备?
  • 是的,在内核中的当前代码和两个设备的镜像中,偶数 pid 用于第一个设备,奇数用于第二个设备。您可以使用“V8”补丁修补您的内核并重新编译(由于EXPORT_SYMBOL_GPL(part_in_flight) 部分,需要完整的内核重新编译),或者您可以尝试重新分叉您的进程,直到您得到正确的pid。
  • 另一篇关于 btrfs raid1 ssd+hdd 的帖子:superuser.com/questions/874673/btrfs-raid1-ssd-non-ssd。还要感谢 phoronix 帖子 phoronix.com/… 提供补丁链接。
  • 我很好奇 BTRFS RAID 1 上具有 > 2 个驱动器的行为。我知道 raid1 配置文件仍然只有 1 个条带(num_stripes = 1),因此所有数据仅复制两次,即使在 N > 2 个驱动器上也是如此(除非使用 RAIDC3 或 RAIDC4)。 btrfs 如何决定每个条带放置在哪些磁盘上?如果磁盘数量是奇数,或者驱动器大小不相等,那么一个磁盘是否也可以共享两个条带?
猜你喜欢
  • 2014-04-18
  • 1970-01-01
  • 2016-08-03
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2021-09-09
  • 1970-01-01
相关资源
最近更新 更多