从 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:增强非旋转设备 Timofey Titovets 的 raid1/10 平衡启发式。2017 年 12 月 27 日,星期三
目前 btrfs raid1/10 平衡器对镜像的 blance 请求,基于 pid % num of mirrors。...
如果其中一个镜子是非旋转的,则所有读取请求将被移动到非旋转设备。...
PS 灵感来自 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 日