/dev/sda3
我已在 SSD 上设置了缓存/dev/sdb3
,就像/dev/bcache0
在 Ubuntu 13.10(内核 3.11.0-14-generic)中使用 bcache 一样。我已将其格式化为ext4
。
我目前使用这些选项安装/
(在我的 SSD 上)和/home
(bcache)fstab
# / (root) -> /dev/sda2 (SSD)
UUID={uuid for /dev/sda2} / ext4 discard,noatime,nodiratime,errors=remount-ro 0 1
# /home -> { /dev/bcache0 -> { /dev/sda3 -> /dev/sdb3 } }
UUID={uuid for /dev/bcache0} /home ext4 defaults 0 2
我想知道的是,在挂载 bcache 时是否有任何挂载选项(例如 discard (TRIM)、noatime 等)有用,或者 bcache 本身是否负责优化 SSD 和 HDD 分区的文件系统。
如果我没有表达清楚我的问题,请告诉我,谢谢。
答案1
discard
是一种特殊情况:bcache 将(我认为)利用它来丢弃扇区,但不会将其传递到堆栈中,除非您明确要求它这样做(echo 1 |sudo tee -a /sys/block/*/bcache/discard
,这将在重新启动后被记住)。性能最佳的情况是您的文件系统发送丢弃(这意味着您需要将标志放入/etc/fstab
),并且 bcache 仅在您的 SSD 是 SATA 3.1(排队 TRIM 支持)时才将它们传递下去。
您的文件系统能够将 bcache 检测为 SSD(sysfs 中的 rotation=0),它可能会用它来稍微不同地调整自身。除了 和 之外discard
,noatime
我认为没有必要偏离ext4 默认值。
答案2
如果您在 bcache 设备上文件系统的 fstab 挂载参数中放置 discard,则文件系统将针对已删除的块向 bcache 发出 TRIM 命令。理论上,bcache 可以使用传入的 TRIM 命令作为释放缓存数据的提示,但我认为它不会这样做,而且网上搜索到的提示表明 bcache 根本不理解传入的 TRIM 命令(我发现了一份未经验证的错误报告)。
但是,bcache 本身可以在删除其缓存 SSD 设备上的存储桶时发送 TRIM 命令。默认情况下,它不启用此功能,因为 TRIM 在 SATA3.1 之前的驱动器上没有排队,因此速度较慢,但在现代 SSD 上启用丢弃可提供更好的性能。
TLDR;不要在 bcache 设备上的文件系统的 /etc/fstab 中放置“discard”,但如果您的缓存设备是现代 SATA3.1 SSD,则将 endable bcache 的 discard 放入 /sys/block/*/bcache/discard 中。
更新 2023-02-28:至少对于内核 6.xx,情况已经发生了变化。
对于 bcache,该/sys/block/*/bcache/discard
设置已不存在,至少对于我的旧 ssd 来说是这样。它可能只出现在支持排队修剪 (SATA3.1) 的驱动器上,或者只是默认为“开启”以支持它的驱动器。它似乎没有任何问题可以接受来自文件系统的 TRIM 操作,但我不知道它是否只是忽略它们或将它们用作丢弃存储桶的提示。
对于 btrfs,它会自动将 bcache 设备检测为“非旋转”,因此ssd
默认添加挂载选项。它会在首次添加整个 bcache 设备时“丢弃”它们,但discard
默认情况下不“打开”。我怀疑使用 btrfs 挂载选项discard=async
会没问题;最坏的情况是 bcache 会忽略它,最好的情况是它将其用作删除存储桶的提示。
另一个可能值得添加的 btrfs 挂载选项是ssd_spread
。从描述来看,这会启用尝试保持数据连续。它目前默认为关闭,因为现代 ssd 并不关心,但它可能对 bcache 有益,因为它将使非 ssd 备份驱动器上的数据更连续。
答案3
在内核 6.4.11 上,我设法找到了我的 WD SN750 的丢弃:/sys/block/nvme0n1/nvme0n1p1/bcache/discard
默认情况下禁用