在Archlinux上使用FlashCache

FlashcacheFacebook 的一个开源项目,通过将固态硬盘(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
    

    参考:No entry for device-mapper found

模拟实验

参考:flashcache的实现与用法

  • 创建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