在配置了 bcache
之后,测试 IO 速度是否有效提升是一个很好的步骤。这通常涉及到对比缓存生效和未生效(或直接访问后端存储)时的性能差异。由于 bcache
是一个透明的缓存层,精确地“关闭”缓存来做对比测试比较复杂,但我们可以通过特定测试方法来观察缓存的效果。
最推荐的测试工具是 fio
(Flexible I/O Tester),它非常强大且可配置。
1. 安装 fio
(如果尚未安装)
- 对于 Debian/Ubuntu 系统:
sudo apt update sudo apt install fio
- 对于 CentOS/RHEL/Fedora 系统:
sudo yum install fio # 或者 # sudo dnf install fio
2. 测试缓存效果的关键概念
- 预热缓存 (Warm-up): 对于读缓存,第一次读取数据块时,数据会从慢速的后端 HDD (
md10
) 加载到快速的 SSD 缓存 (md4
) 中。后续对相同数据块的读取请求应该直接由 SSD 缓存提供服务,速度会快得多。因此,测试前通常需要一个“预热”阶段。 - 测试文件大小:
- 测试缓存读取性能时,测试文件应小于 SSD 缓存 (
md4
大小为 825.1G) 但又要足够大以避免完全被系统内存缓存。例如,一个 20GB-100GB 的文件。 - 如果要测试超出缓存能力的情况,文件大小应远大于 SSD 缓存。
- 测试缓存读取性能时,测试文件应小于 SSD 缓存 (
fio
的direct=1
选项: 这个选项会使fio
绕过操作系统的页缓存 (page cache),直接对存储设备进行 IO 操作。这对于测试bcache
自身的性能非常有用,可以减少系统内存缓存带来的干扰。- 监控
bcache
统计信息: 在测试期间,监控bcache
的命中率等统计数据可以帮助了解缓存是否在按预期工作。# 打开一个新的终端窗口来监控 watch -n 1 'echo "== Cache Stats =="; cat /sys/block/bcache0/bcache/stats_total/cache_hits /sys/block/bcache0/bcache/stats_total/cache_misses /sys/block/bcache0/bcache/stats_total/cache_bypass_hits /sys/block/bcache0/bcache/stats_total/cache_bypass_misses; echo ""; echo "== Other Stats =="; echo -n "Dirty Data: "; cat /sys/block/bcache0/bcache/dirty_data; echo -n "State: "; cat /sys/block/bcache0/bcache/state; echo -n "Writeback Rate: "; cat /sys/block/bcache0/bcache/writeback_rate; echo -n "Cache Mode: "; cat /sys/block/bcache0/bcache/cache_mode'
3. 使用 fio
进行性能测试
重要:
- 请将测试命令中的
/mnt/cached_storage/testfile
替换为您bcache
设备的实际挂载点和您选择的测试文件名。 - 测试会产生大文件,测试完成后记得删除 (
sudo rm /mnt/cached_storage/testfile*
)。 - 运行
fio
命令通常不需要sudo
,除非您写入的目录需要特定权限,或者您要操作原始块设备(不推荐初学者直接操作块设备进行基准测试)。这里我们测试的是挂载的文件系统。
A. 顺序读取性能 (测试缓存效果)
-
创建并预热测试文件:
首先,创建一个较大的测试文件。这个过程也会将文件数据写入缓存(取决于您的写入模式和可用缓存空间)。fio --name=prepare_seq_read_file --rw=write --bs=1M --filename=/mnt/cached_storage/testfile_seq_read --size=50G --direct=1 --group_reporting
这个命令会创建一个 50GB 的文件。
-
第一次读取 (可能部分来自 HDD,同时填充缓存):
fio --name=seq_read_warmup --rw=read --bs=1M --filename=/mnt/cached_storage/testfile_seq_read --size=50G --direct=1 --group_reporting --iodepth=32
-
(可选) 清理系统页缓存: 确保后续读取不是来自内存。
sync #确保所有挂起的写操作完成 echo 3 | sudo tee /proc/sys/vm/drop_caches
-
第二次读取 (应主要来自 SSD 缓存):
fio --name=seq_read_cached --rw=read --bs=1M --filename=/mnt/cached_storage/testfile_seq_read --size=50G --direct=1 --group_reporting --iodepth=32
比较第二次读取的吞吐量 (BW 项,通常单位是 MB/s 或 GB/s)。如果缓存有效,这个速度应该接近您的
md4
(NVMe SSD RAID0) 的读取速度。
B. 随机读取性能 (测试缓存效果)
随机读取是 SSD 缓存能带来显著提升的典型场景。
-
创建并预热测试文件 (如果尚未使用上一步的文件,或者需要一个专门的随机读文件):
fio --name=prepare_rand_read_file --rw=write --bs=4k --filename=/mnt/cached_storage/testfile_rand_read --size=50G --direct=1 --group_reporting
-
第一次随机读取 (预热):
fio --name=rand_read_warmup --rw=randread --bs=4k --filename=/mnt/cached_storage/testfile_rand_read --size=50G --direct=1 --numjobs=4 --group_reporting --iodepth=64 --runtime=120s
这里使用
--runtime
来限制测试时间,因为完整读取50GB的4k随机块会非常慢。 -
(可选) 清理系统页缓存:
sync echo 3 | sudo tee /proc/sys/vm/drop_caches
-
第二次随机读取 (应主要来自 SSD 缓存):
fio --name=rand_read_cached --rw=randread --bs=4k --filename=/mnt/cached_storage/testfile_rand_read --size=50G --direct=1 --numjobs=4 --group_reporting --iodepth=64 --runtime=120s
关注 IOPS (每秒操作次数) 和吞吐量 (BW)。SSD 缓存应该能提供远高于 HDD 的随机读取 IOPS。
C. 写入性能
写入性能很大程度上取决于您 bcache
的缓存模式 (writethrough
, writeback
, writearound
)。
- 如果是
writeback
模式: 写入操作首先进入 SSD 缓存,速度应该很快,接近md4
的写入速度,直到缓存变满或开始强制回写。fio --name=seq_write_test_wb --rw=write --bs=1M --filename=/mnt/cached_storage/testfile_seq_write --size=50G --direct=1 --group_reporting --iodepth=32
- 如果是
writethrough
模式: 写入操作需要同时写入 SSD 和 HDD,所以持续写入速度可能更接近较慢的 HDD (md10
),但对于突发写入和小文件写入,SSD 仍能起到加速作用。fio --name=seq_write_test_wt --rw=write --bs=1M --filename=/mnt/cached_storage/testfile_seq_write --size=50G --direct=1 --group_reporting --iodepth=32
4. 简单 dd
测试 (快速检查,但不全面)
dd
可以用于非常简单的顺序读写测试,但其结果可能受多种因素影响,不如 fio
精确。
- 测试写 (结果受缓存模式影响):
# 创建一个10GB的文件 dd if=/dev/zero of=/mnt/cached_storage/dd_testfile bs=1M count=10000 status=progress
- 测试读 (第一次,预热):
dd if=/mnt/cached_storage/dd_testfile of=/dev/null bs=1M status=progress
- 清理系统页缓存:
sync echo 3 | sudo tee /proc/sys/vm/drop_caches
- 测试读 (第二次,应从缓存):
dd if=/mnt/cached_storage/dd_testfile of=/dev/null bs=1M status=progress
5. 如何解读结果
- 对比基线: 您可能对您 HDD (
sda
,sdb
组成的md10
) 单独的性能有一个大概的了解 (例如,顺序读写可能在 200-300MB/s,随机 IOPS 较低)。 - SSD 缓存效果:
- 读取: 经过预热后,对已缓存数据的读取速度应该接近您的
md4
(NVMe SSD RAID0) 的性能。NVMe RAID0 的顺序读取速度可能达到数 GB/s,随机 IOPS 非常高。 - 写入 (
writeback
模式): 写入速度也应该接近md4
的写入性能,直到缓存写满。
- 读取: 经过预热后,对已缓存数据的读取速度应该接近您的
- 监控
bcache
统计: 如果测试时cache_hits
远大于cache_misses
,说明缓存正在有效地服务请求。
6. 清理测试文件
测试完成后,记得删除创建的大型测试文件:
sudo rm /mnt/cached_storage/testfile*
sudo rm /mnt/cached_storage/dd_testfile
通过这些测试,您应该能够量化 bcache
配置带来的性能提升,特别是在读取热数据和随机 IO 方面。