bcache允许一个或多个快速磁盘驱动器(例如基于闪存的固态驱动器 (SSD))充当一个或多个较慢硬盘驱动器的缓存。
如果我理解正确,
我想知道哪种方法更明智。我突然想到,使用一种或其他技术增加 RAID5/6 可能更简单,但我不确定是哪一种!
选择一种方法而不是另一种方法(对于包含 VM 后备文件的大型非根文件系统)是否有充分的理由(例如增加后备存储或其他任何东西)?
* “一个 SSD”是指某种冗余 SSD 设备,例如两个物理 SSD 的 RAID1
我有一个文件服务器,其中有一堆磁盘在 BTRFS 池中一起运行,并且想要添加一个 SSD 进行缓存。我主要不是在加快速度之后,而是想捕捉常规的小访问,以便能够在大部分时间关闭硬盘而不是大量使用(不运行它们 24/7 将节省能源,并且应该使磁盘使用寿命更长)。
据我所知,目前在 Linux 中实现了两种 SSD 缓存技术,dm-cache 和 bcache。dm-cache 仍然被告知效率更高,但两者的开发正在进行中,我不需要调整绝对最大效率。
阅读bcache 的文档,我想到了这些选项:
writeback_delay:当脏数据写入缓存并且之前不包含任何内容时,在启动回写之前等待几秒钟。默认为 30。
writeback_percent:如果非零,bcache 会尝试通过限制后台回写和使用 PD 控制器平滑调整速率来保持缓存脏的这个百分比。
writeback_running:如果关闭,则根本不会发生脏数据的写回。脏数据仍然会被添加到缓存中,直到它大部分满为止;仅用于基准测试。默认为开。
writeback_delay为我设置一个足够大的值似乎可以完成这项工作:每小时只回写一次,或者(我认为这会发生)如果缓存已满。
这是一个合理的设置,我是否考虑过其他任何方法来成功降低磁盘转速?如果它满足我的要求,我也可以走完全不同的路线。
@gorkypl 似乎正在寻找针对类似问题的另一种解决方案,但具有不同的要求和环境,并且还没有收到答案。
我相信,一旦我确定我的缓存设备状态是“干净的”:
$ sudo cat /sys/block/bcache0/bcache/state
Run Code Online (Sandbox Code Playgroud)
我可以在关机或使用 liveCD 启动时将其从机器上物理移除,并使用以下命令清理超级块:
$ sudo dd if=/dev/zero of=<backing device for cache> bs=1024 count=1024
Run Code Online (Sandbox Code Playgroud)
但我找不到任何地方确认,这个程序不会搞砸任何事情。
我最近用三种不同的驱动器重新配置了我当前的 Debian 机器:SLC SSD、QLC SSD 和 4TB HDD。我一直在尝试lvmcache其他实用程序,我想知道是否可以创建一个多层缓存解决方案,利用两个 SSD 进行不同级别的缓存。
我的乌托邦结构是这样的:
lvmcache不幸的是,我还没有发现太多允许在或bcache(或者实际上是其他任何地方)中进行此类配置的多层缓存功能。
是否可以lvmcache这样bcache配置?如果没有,是否还有其他解决方案可以实现这种配置?
如果我们在一个系统中安装了三个 SSD,并为 SSD 上的未使用空间提供一个备用分区(/dev/sda2、/dev/sdb2和/dev/sdc2)。可以bcache配置为使用所有三个分区来缓存单个后备设备(例如/dev/md10位于 之上的设备/dev/sd[defghij]1)。
从我在其他地方读到的内容来看,一个特定的 SSD 设备有可能被用来bcache缓存多个硬盘驱动器或 RAID 阵列。但是没有什么可以解释一个后备设备是否可以同时被多个 SSD 缓存。
例如,您可能有三个 100GB SSD 而不是单个大型 300GB SSD,并且您希望将它们用作单个 12TB 阵列的缓存设备。
我需要升级一些驱动器固件,我想在此期间关闭 bcache。
文档显示了如何停止 bcache 设备:
停止
写入此文件以关闭 bcache 设备并关闭后备设备。
对我来说,这看起来像这样:
echo 1 > /sys/block/bcache0/bcache/stop
Run Code Online (Sandbox Code Playgroud)
对于缓存设备:
echo 1 > /sys/fs/bcache/<set-uuid>/stop
Run Code Online (Sandbox Code Playgroud)
但是如何将设备带回(无需重新启动服务器)?
我尝试用回声来分离和停止。该设备将自行删除,但重新启动后会再次显示。有一次重新启动后,它恢复了我作为后备设备的 mdadm raid!
另一次,我禁用了与之配对的内存驱动器,进行了分离。重启后 /dev/bcache0 又恢复了。
下没有注销
/sys/fs/块/bcache
我还查看了 /sys/fs/bcache... /sys/block/md0/md0p1/bcache
对于这个不存在的注销。
仅注册和安静注册
我什至卸载了 bcache-tools,重启后 /dev/bcache0 仍然出现,并且正在缓存 /dev/md0!
我正在寻找利用 SSD 来加速我的系统的方法。在“ Linux 相当于 ReadyBoost?”(以及为我触发的研究)我了解了bcache、dm-cache和EnhanceIO。所有这三个似乎都能够在 SSD 上缓存读取数据。
但是,除非我遗漏了什么,否则所有三个似乎都在第一次读取时将文件/块/范围/任何内容存储在缓存中。大型顺序读取可能是一个例外,但除此之外,似乎每次读取缓存未命中都会导致某些内容被缓存。我希望缓存能够缓存我经常使用的那些读取。我担心搜索我的所有 maildir 文件的正文或某个大目录中的递归 grep 可能会驱逐我经常阅读的大部分内容。
有没有什么技术可以缓存经常读取的文件,而不是最近读取的文件?建立某种形式的活动集或诸如此类的东西?我想自适应替换可能是一个描述我所追求的术语。
缺少这一点,我想知道将 LVM 用作底层并在其上构建多个支持 bcache 的设备是否有意义。这个想法是,例如邮件读取不会驱逐缓存/usr之类的。每个挂载的文件系统都会有自己的固定大小的缓存,或者根本没有。有没有人有在 lvm 之上使用 bcache 的经验?是否有理由反对这种方法?
也欢迎任何其他建议。但是请注意,我正在寻找可以在 Linux 上用于生产的东西。我觉得 ZFS 及其 L2ARC 功能不属于该类别(目前),尽管如果您确信相反,欢迎您提出这一点。使用 LVM 的原因是我希望能够根据需要调整为各种文件系统分配的空间大小,使用静态分区很痛苦。因此,提议的解决方案也应该提供这种灵活性。
编辑 1:一些说明。
我主要关心的是启动时间。我想看到用于每次启动的所有文件都可以在该 SSD 上轻松访问。而且我宁愿不必担心保持 SSD 同步,例如在软件包升级之后(这在我的 Gentoo 测试中经常发生)。如果我在启动期间不使用的常用数据也最终出现在缓存中,那是一个额外的好处。我目前的工作项目例如将是一个不错的候选人。但我猜我每天使用的文件中有 90% 会在按下电源按钮后的前 5 分钟内使用。这个目标的一个结果是在启动后擦除缓存的方法,就像 ZFS L2ARC 显然所做的那样,不是一个可行的解决方案。
金发姑娘的回答将焦点从缓存插入转移到缓存驱逐。但这并没有改变问题的根本性质。除非缓存跟踪某个项目的使用频率或频率,否则内容可能仍会过早地从缓存中退出。特别是因为我希望这些文件从启动到关闭一直驻留在 RAM 缓存中,因此每次启动时它们只会从磁盘读取一次。我为 bcache 和 dm-cache 找到的缓存驱逐策略,即 LRU 和 FIFO,都会优先驱逐那些启动时文件,而不是在同一工作日读取的其他文件。因此我的担忧。
我有 3 个 HDD 和 1 个 SSD,我已成功将所有驱动器安装到 bcache。
pavs@VAS:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 132G 35G 90G 28% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 3.9G 8.0K 3.9G 1% /dev
tmpfs 786M 2.3M 784M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 3.9G 152K 3.9G 1% /run/shm
none 100M 52K 100M 1% /run/user
/dev/bcache1 2.7T 2.1T 508G 81% /var/www/html/directlink/FTP1
/dev/bcache2 1.8T 614G 1.2T 36% /var/www/html/directlink/FTP2
/dev/bcache0 1.8T 188G 1.6T 11% /var/www/html/directlink/FTP3
/dev/sdf1 …Run Code Online (Sandbox Code Playgroud) 我正在使用 bcache 和大约 1 TByte 的 SSD 缓存来处理大约 40 TByte 的数据。回写并为 bcache 配置 10%,大约 100 GByte 的脏数据仅存在于缓存设备上。
我喜欢 bcache 继续使用缓存的配置百分比进行延迟写入,但我更喜欢 bcache 随着时间的推移清除它。换句话说,突然的写突发应该去SSD,并且这个堆积的“债务”应该在接下来的几秒/分钟/小时内被清除。
这可能吗?
相关的,写回策略究竟是什么样的?是否会发生旧数据永远保存在 SSD 上,而只有年轻数据被写回的情况?
一直有什么东西在磨损我的硬盘(每秒几KB),但我似乎不知道是什么。
我的配置:4个旋转盘片(/dev/sd[cdef])组装成一个raid5阵列,然后bcache设置为缓存(希望)所有内容(cache_mode = writeback,sequential_cutoff = 0)。在 bcache 卷之上,我设置了 lvm。
sda 和 sdb 是 SSD。sdc、sdd、sde 和 sdf 是旋转磁盘,是 mdadm -> bcache -> lvm -> dm-* 的基础。
所以,这是(第二次打印)的输出iostat -x -d 30:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0,00 0,77 0,97 0,77 12,40 6,13 21,38 0,00 0,23 0,00 0,52 0,23 0,04
sdb 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00
sdc 0,03 1,60 0,13 4,50 0,67 17,63 …Run Code Online (Sandbox Code Playgroud) 我有一个 LVM,我想使用 bcache 来缓存它的一个 LV。(是的,我知道我可以使用 lvmcache,但是我在启动时遇到了问题,我放弃了使用它。)
首先,我使用块将 LV 转换为 bcache 支持设备(这似乎确实有效!):
blocks to-bcache /dev/my_vg/my_lv
Run Code Online (Sandbox Code Playgroud)
我在我的 SSD 上创建了一个缓存设备:
make-bcache --block 4k --bucket 2M -C /dev/sdc4
Run Code Online (Sandbox Code Playgroud)
然后我尝试将缓存附加到后备设备:
bcache-super-show /dev/sdc4 | grep cset.uuid
echo 'above_uuid' > /sys/block/bcache0/bcache/attach
Run Code Online (Sandbox Code Playgroud)
然后我重新启动了我的机器(在添加/dev/bcache0到 之后/etc/fstab)并意识到缓存没有运行。
# cat /sys/block/bcache0/bcache/state
no cache
# bcache-super-show /dev/my_vg/my_lv | grep cache_state
dev.data.cache_state 0 [detached]
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?我需要使用另一个命令来启用缓存吗?
为什么 bcache 不喜欢我的缓存设备并且不让我将它附加到我的后备设备?我是否对--blockand使用了错误的值--bucket?
我知道 acachepool和之间的区别cachevol。
Cachepool将缓存数据和元数据分成两个单独的卷,而 aCachevol对两者使用单个卷。
cachepool我的问题是,使用 a而不是仅使用 a有什么好处cachevol?我能想到的唯一最有意义的情况是,如果您想将单个设备(或一组设备)专用于缓存的元数据,并将一个单独的设备(或一组设备)用于实际缓存数据。但这似乎是一个非常具体的场景,而且它也没有解决以下问题:Why?
为什么大多数人默认使用 acachepool而不是 a cachevol,尤其是。当一台设备用于缓存时?
cachepool使用vs的动机/利弊是什么cachevol?
编辑就上下文而言,这个问题背后的动机来自cachepool于保守设置(如家庭服务器和台式机)中使用的假设,仅仅是因为人们遵循的指南和教程是从企业用例中滴下来的。
cachepool除了工具支持之外,并且仅基于vs的优点cachevol,是否有任何具体原因(性能、实施等...)来激励人们提倡呢cachepool?或者它只是企业涓滴现象的受害者?
如果后者是正确的,那么考虑更保守的设置可能是合理cachevol的,而不是cachepool考虑是否不需要cachepool设置的灵活性和复杂性。