一种测试 SSD 是否 trim 的方法

首先你要进到你想要测试的分区下面运行:
dd if=/dev/urandom of=tempfile bs=512k count=100 conv=fdatasync,notrunc

这样就可以创建一个叫做tempfile的文件了,我要测试的是一个建立在LVM上的分区,其对应的设备文件是在:/dev/vgssd/test
如果你想要知道你想测试的分区对应的设备文件,你可以用
df -h
来查看挂载点相应的设备文件。

然后再运行:
hexdump tempfile

这条命令的意思是以十六进制来查看tempfile这个文件,运行了之后就会看到里面有很多的十六进制数据开始刷屏了,刷完之后,你就从里面任意选一段十六进制字符串。例如我运行的结果是:

.........................省略一部分............................
31fffd0 40af 2278 1a01 02aa 9b06 dfbc b850 916f
31fffe0 f7e5 e690 3386 2f2e b53b b970 de41 9864
31ffff0 7da4 1c3d 34bc d5c5 2757 97f0 7e8d 18cb
3200000

我就截选最后那一串吧,就是:7e8d 18cb

然后运行
hexdump /dev/vgssd/test|grep '7e8d 18cb’
3b9ffff0 7da4 1c3d 34bc d5c5 2757 97f0 7e8d 18cb

hexdump /dev/vgssd/test是以十六进制查看设备里面的数据,然后再从这些数据里面查找7e8d 18cb这串十六进制数据,由运行结果可知还是找到了。
如果没有开自动trim,那么运行
rm tempfile
也就是删除tempfile之后,由于tempfile没有从SSD上物理擦除,那么应该还是能从设备/dev/vgssd/test上找到“7e8d 18cb”这串数据的。
因此你再运行:
hexdump /dev/vgssd/test|grep '7e8d 18cb’
3b9ffff0 7da4 1c3d 34bc d5c5 2757 97f0 7e8d 18cb

可以看到结果还是能够找到的。
接下来,我们手动trim,看看会怎么样。

fstrim -v /mnt/test

/mnt/test是设备/dev/vgssd/test的挂载点,由于硬盘数据的异步写入模式,可能操作还没有真正执行,所以我们运行:
echo 3 > /proc/sys/vm/drop_caches

这个是清理内存,以便将那些改变切实应用到硬盘上去。
然后再运行
hexdump /dev/vgssd/test|grep ‘7e8d 18cb’

看,这次没有找到了吧,说明数据确实被擦除了。也就是说fstrim对LVM上的分区也是能够起作用的。
同样的,用这个测试方法可以试试对于LVM上的分区,如果只是在挂载分区时,加上那个discard参数,看看那个动态trim是否有效。答案是无效的,还要在LVM那层开启discard才行,详情可以去看我的另外一篇帖子《联想Y500装机记:LVM篇》。