Linux 下 SSD 的 对齐和 TRIM

4K 对齐

什么是 4K 对齐, 4K 对齐是一种说法习惯而已, 因为许多磁盘的物理扇区大小都是4096字节(4K). 但是如果磁盘的物理扇区 比如是 8 个逻辑扇区(假设逻辑扇区是 512字节), 那就需要按照 8192字节来对齐了, 严格来说也不能叫做 4K对齐 了.

为什么要4k对齐呢?

主要是为了提高性能和延长寿命, 尤其是运行在window系统和NTFS格式的.

下面是没有对齐的:

下图是对齐之后的:

如何查看是否4k对齐呢 ?

sudo fdisk -l

查看Primary分区的start栏是否能被8整除, Extended分区可能不能整除8, 不用担心. 如果是ext4, 那是自动对齐的.

进行 4k 对齐

Windows 可以用系统自带工具或DiskGenius进行分区, Linux 下使用 gparted 等.

TRIM 指令


首先我们需要了解一下什么是trim.

机械硬盘, 操作系统在删除数据时, 并不需要真正执行删除, 只需要标记被删除数据的空间为 Free 即可, 因为将来写入新数据可以直接覆盖.

但 SSD 却不是, 例如某个 SSD, 以 4KB 为一个 Page, 512KB 为一个 Block , 每个 Block 有 128 个 Page.

由于 Page 是 SSD 读写的 unit, Block 是 SSD 擦写的 unit, 若我们就想对某个 Block 的某个 Page 进行即刻删除, 那就必须对整个 Block 进行擦除, 这是由 NAND Flash 的硬件原理决定的. 也就是说, 只想修改 4K 的Page, 结果需要对 512KB 的 Block 进行读取/擦除/修改/重新写入, 这对性能损耗很大.

这里就是 TRIM 的用处了, 当我们需要删除某些 Page 时, 并不用真正执行删除, SSD 接收到 TRIM 指令后, 只是标记这些位置的为 无用 状态, 等待后续 SSD 执行主动或被动 GC(garbage collection), 回收掉这些 无用 状态的 Block.

可见 TRIM 降低了写入放大, GC 移动的数据少了, 改善了性能, 提升了 SSD 寿命.少了内部带宽的占用,从而提升了吞吐量.

启用trim

方法一: discard

vim /etc/fstab

为SSD的每个分区option中加上discard选项, 每当系统删除文件时, 就会通知ssd进行trim. 可知, 当删除大量文件时, 性能也会有所下降的.
更多内容可参考这里

方法二: 使用 cron 按计划执行 fstrim

sudo vim /etc/cron.daily/trim
#!/bin/sh
LOG=/var/log/trim.log
echo "*** $(date -R) ***" >> $LOG
fstrim -v / >> $LOG
sudo chmod +x /etc/cron.daily/trim

这里的 / 目录是要 trim 的 ssd 分区, 这个根据情况来设置.

至于 cron.daily 的具体执行时间, 是在6:25, 如下(cat /etc/crontab):

$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

查看 fstrim 结果

每天可以从日志中查看trim结果, tail /var/log/trim.log, 如下:

*** Fri, 12 Aug 2016 08:26:23 +0800 ***
/: 426609340416 bytes were trimmed

参考


https://zh.wikipedia.org/zh-hk/Trim%E5%91%BD%E4%BB%A4
http://pcedu.pconline.com.cn/504/5047738_all.html
New:
https://www.techtarget.com/searchstorage/definition/TRIM