Flashcache 是 Facebook 的一个开源项目,通过将固态硬盘(SSD)做为机械硬盘(HDD)的缓存层,提升磁盘I/O性能。
Flashcache 位于磁盘驱动层与文件系统层之间,是一个 linux
内核模块。
编译安装
由于Archlinux总是使用最新的linux内核,最好从最新的 Flashcache 源代码进行编译安装。
git clone https://github.com/facebook/flashcache.git
cd flashcache
make
sudo make install
挂载模块
sudo insmod /lib/modules/`uname -r`/extra/flashcache/flashcache.ko
修复挂载错误
insmod: ERROR: could not insert module /lib/modules/3.19.3-3-ARCH/extra/flashcache/flashcache.ko: Unknown symbol in module
通过
dmesg | grep flashcache
可以看到以下错误信息:[ 2130.514615] flashcache: Unknown symbol dm_put_device (err 0)
[ 2130.514654] flashcache: Unknown symbol dm_io_client_create (err 0)
[ 2130.514693] flashcache: Unknown symbol dm_kcopyd_client_create (err 0)
[ 2130.514738] flashcache: Unknown symbol dm_unregister_target (err 0)
[ 2130.514774] flashcache: Unknown symbol dm_io_client_destroy (err 0)
[ 2130.514798] flashcache: Unknown symbol dm_kcopyd_copy (err 0)
[ 2130.514821] flashcache: Unknown symbol dm_register_target (err 0)
[ 2130.514846] flashcache: Unknown symbol dm_kcopyd_client_destroy (err 0)
[ 2130.514870] flashcache: Unknown symbol dm_table_get_mode (err 0)
[ 2130.514895] flashcache: Unknown symbol dm_io (err 0)
[ 2130.514915] flashcache: Unknown symbol dm_get_device (err 0)先挂载
dm-mod
模块再挂载flashcache
模块即可:sudo modprobe dm-mod sudo insmod /lib/modules/`uname -r`/extra/flashcache/flashcache.ko
模拟实验
创建SSD模拟设备
使用内存文件模拟块设备(1G)
dd if=/dev/zero of=/dev/shm/ssd.img bs=1024k count=1024 sudo losetup /dev/loop1 /dev/shm/ssd.img
创建HDD模拟设备
使用普通磁盘文件模拟块设备(5G)
sudo dd if=/dev/zero of=/hdd.img bs=1024k count=5120 sudo losetup /dev/loop2 /hdd.img
创建Flashcache混合设备
sudo flashcache_create -p around cachedev /dev/loop1 /dev/loop2 sudo mkfs.ext4 /dev/mapper/cachedev
挂载Flashcache混合设备
sudo mkdir /data sudo mount /dev/mapper/cachedev /data
/data目录下的数据读写就已经在使用Flashcache了。
创建用来测试的数据文件(1G)
dd if=/dev/urandom of=/dev/shm/test.dat bs=1024k count=1024
测算使用HDD写耗时
sudo sh -c 'echo 1 > /proc/sys/vm/drop_caches; time cp /dev/shm/test.dat /'
输出:
real 0m4.751s user 0m0.000s sys 0m0.600s
测算使用HDD读耗时
sudo sh -c 'echo 1 > /proc/sys/vm/drop_caches; time cp /test.dat /dev/shm/
输出:
real 0m10.580s user 0m0.010s sys 0m0.727s
测算使用Flashcache写耗时
sudo sh -c 'echo 1 > /proc/sys/vm/drop_caches; time cp /dev/shm/test.dat /data/'
输出:
real 0m7.363s user 0m0.000s sys 0m0.760s
测算使用Flashcache读耗时
第一轮测试(缓存预热)
sudo sh -c 'echo 1 > /proc/sys/vm/drop_caches; time cp /data/test.dat /dev/shm/'
输出:
real 0m9.557s user 0m0.013s sys 0m1.157s
第二轮测试(缓存生效)
sudo sh -c 'echo 1 > /proc/sys/vm/drop_caches; time cp /data/test.dat /dev/shm/'
输出:
real 0m3.107s user 0m0.000s sys 0m0.850s
清除测试数据
sudo rm /test.dat /dev/shm/test.dat /data/test.dat
结果分析
- Flashcache读性能: 提升70%
- Flashcache写性能: 降低55%
因为使用了
Write-Around
方式,所以提升了读性能,降低了写性能。清除模拟环境
sudo umount /data sudo dmsetup remove cachedev sudo losetup -d /dev/loop1 sudo rm /dev/shm/ssd.img sudo losetup -d /dev/loop2 sudo rm /hdd.img sudo rmdir /data