我正在使用我的脚本创建 dm-cache 设备: http://pastebin.com/KTSzL6EA
实际上它正在运行以下命令:
dmsetup create suse-cache-metadata --table 0 15872 linear /dev/mapper/suse-cache 0
dmsetup create suse-cache-blocks --table 0 125813248 linear /dev/mapper/suse-cache 15872
dmsetup create storagecached --table 0 2930266112 cache /dev/mapper/suse-cache-metadata /dev/mapper/suse-cache-blocks /dev/mapper/storage 512 1 writethrough default 0
dmsetup resume storagecached
在 60gb SSD LVM 卷上缓存 1.5TB USB 2.0 HDD。我正在使用以下方式安装缓存的 dm 设备:
mount -t btrfs -o noatime,autodefrag,compress=lzo,space_cache /dev/mapper/storagecached /mnt/storage
但是它似乎根本不起作用。我注意到每次我访问缓存设备上的任何内容时,以及每次某些机器人访问我的网站时,外部硬盘都会旋转起来,我猜它应该被缓存,这非常烦人,最终在大约一周后导致 I/O 错误,因为外部硬盘无法处理连续的旋转和旋转停止。
我决定实际执行一些基准测试,使用dd
命令将 8gb 文件复制到 /dev/null 仅达到 40MB/s。它与非缓存 HDD 的速度相同。总是如此。无论是在清除缓存的试运行中,还是我认为应该缓存的第三次或第四次读取中。用于缓存的 SSD 在根分区上达到 92MB/s。当然,每次测试后我都会清除 linux RAM 缓存以消除 RAM 缓存性能影响。
我实际上在 2 台电脑上使用了这个脚本,但似乎都没有用。我知道 writethrough 不会加快写入速度,但我更关心读取速度。
编辑:
检查dmsetup status
日志后,我注意到缓存命中率非常低。这可能是 btrfs 的错误吗?
答案1
dm cache 需要一些时间才能将块提升到缓存设备。与 linux ram 缓存不同,默认 dmcache 策略需要至少读取几次某些数据才能将其提升到 SSD,通常需要大量读取,超过 10 次。如果机器中有相对大量的备用内存,则“训练”dmcache 可能需要大量时间。如果缓存大小与备用内存量相似,并且经常使用的数据占用大量空间,则可能根本无法正常工作。
答案2
使用 lvmcache(7) 进行设置,您会更开心。此外,手册页对于启动和运行非常有帮助。请注意写回/写通策略和 smq 缓存策略,该策略仅在较新版本(内核 4.2 之后)中默认启用。这也是 RHEL 7.2+ 或更高版本中的默认设置。
你可以观看我的演讲:https://www.youtube.com/watch?v=6W_xK5Ks-Lw 或阅读幻灯片:https://www.linuxdays.cz/2017/video/Adam_Kalisz-SSD_cache_testing.pdf