使用 Trim/discard 与 Rbd 内核客户端 (自内核 3.18 起)
laurentbarbe
实时
1
| |
使用批处理
1
| |
测试 ¶
空的 FS
$ rbd create rbd/myrbd --size=20480
$ mkfs.xfs /dev/rbd0
$ rbd diff rbd/myrbd | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }'
14.4062 MB
使用一个大文件…
$ mount /dev/rbd0 /mnt/myrbd
$ dd if=/dev/zero of=/mnt/myrbd/testfile bs=1M count=1024
$ rbd diff rbd/myrbd | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }'
1038.41 MB
当大文件已被删除时(文件系统未以“discard”挂载)
$ rm /mnt/myrbd/testfile
$ rbd diff rbd/myrbd | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }'
1038.41 MB
启动 FS trim
$ fstrim /mnt/myrbd
$ rbd diff rbd/myrbd | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }'
10.6406 MB
基准测试 discard 选项 ¶
没有“discard”
$ mount /dev/rbd0 /mnt/rbd0
$ mkdir testdir; cd testdir
$ dd if=/dev/zero of=mainfile bs=1M count=200
$ split -b 4048 -a 7 mainfile; sync # 4k file / ~51k files
$ cd ..
$ time rm -rf testdir; time sync
real 0m2.780s
user 0m0.096s
sys 0m2.632s
real 0m0.130s
user 0m0.004s
sys 0m0.016s
# total: < 3s
有“discard”
$ mount -o discard /dev/rbd1 /mnt/rbd1
$ mkdir testdir; cd testdir
$ dd if=/dev/zero of=mainfile bs=1M count=200
$ split -b 4048 -a 7 mainfile; sync # 4k file / ~51k files
$ cd ..
$ time rm -rf testdir; time sync
real 1m51.471s
user 0m0.104s
sys 0m2.084s
real 0m47.262s
user 0m0.000s
sys 0m0.008s
# total: ~1m56
这是在没有 ssd 日志的 2 个 osd 上…
在文件系统密集使用的情况下,使用许多小文件,使用 fstrim 可能更有优势,例如每天一次。
(Ceph osd 从 0.46 起支持块设备的 trim)