优化挂载参数
在 Linux 中挂载 SSD 上的 btrfs,可以采用各种参数进行优化:
# <file system> <mount point> <type> <options> <dump> <pass>
UUID&#61;<略> / btrfs defaults,ssd,discard,noatime,compress&#61;lzo,subvol&#61;&#64; 0 1
这些参数各有优缺点&#xff0c;酌情添加。
ssd
btrfs 文件系统有对 SSD 进行优化&#xff0c;在挂载参数中加入 ssd
即可。该参数不会自动启用 TRIM/discard。
discard
可以通过以下命令确认 SSD 是否支持 TRIM&#xff1a;
sudo hdparm -I /dev/sdX | grep TRIM
* Data Set Management TRIM supported (limit 8 blocks)
若 SSD 支持 TRIM 命令&#xff0c;可以在 /etc/fstab 中启用 discard
参数。建议将 discard
挂载参数作为首选。据 debian wiki 所述&#xff0c;包括三星&#xff0c;镁光&#xff0c;英睿达在内的一些 SSD 在 discard/TRIM 上有问题&#xff0c;不能合适地处理 TRIM 命令。以下是 linux 内核相关处源代码 (2015/10/15)&#xff1a;
/* devices that don&#39;t properly handle queued TRIM commands */
{ "Micron_M500_*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Crucial_CT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Micron_M5[15]0_*"," MU01", ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Crucial_CT*M550*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Crucial_CT*MX100*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Samsung SSD 8*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "FCCT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, },
/* devices that don&#39;t properly handle TRIM commands */
{ "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, },
该参数不是必需的&#xff0c;也可以自定义周期性运行 fstrim
命令来取代该参数&#xff0c;使用该命令前要确认 SSD 支持 TRIM&#xff0c;否则可能造成数据丢失。当 SSD 有足够的空余空间或&#xff08;未分配的&#xff09;可用空间时不需要该参数。
noatime
挂载参数可以加入 noatime
&#xff0c;通过禁止更新访问记录来减少不必要的写操作以提高性能。该选项对 HDD 同样有性能提升。btrfs 的默认配置为 relatime
。
compress
打开压缩功能在通常情况下有利于提高传输性能&#xff08;并非绝对&#xff09;&#xff0c;也可以节省存储空间。加入以下挂载参数&#xff1a;
compress&#61;lzo
或
compress&#61;zlib
lzo 速度更快&#xff0c;zlib 压缩率更高。注意确认 SSD 主控是否是非压缩主控&#xff0c;若为压缩主控不建议加入该参数。
写缓存
若 SSD 带有缓存&#xff0c;启用 Write Cache 可以提高性能&#xff1a;Disks -> Drive Setting -> Enable Write Cache&#xff0c;但在突然断电的情况下可能造成数据丢失。
I/O 调度
SSD 结构不同于传统硬盘&#xff0c;寻址时间短&#xff0c;I/O 调度算法可选择 noop
以降低延迟。以下命令可查看与修改调度器&#xff1a;
cat /sys/block/sdX/queue/scheduler # sdX 指你的设备
sudo tee /sys/block/sdX/queue/scheduler <<< noop
注意以上方法并不持久&#xff0c;重启后会重置。如果 SSD 是系统唯一的存储设备&#xff0c;可考虑通过 elevator&#61;noop
内核参数设置 I/O 调度器。也可使用 udev 规则来修改调度器&#xff0c;对多存储设备同样有效&#xff1a;
/etc/udev/rules.d/60-ssd-scheduler.rules # 创建该文件
文件内容如下&#xff1a;
# set deadline scheduler for non-rotating disks
ACTION&#61;&#61;"add|change", KERNEL&#61;&#61;"sd[a-z]", ATTR{queue/rotational}&#61;&#61;"0", ATTR{queue/scheduler}&#61;"noop"
参考&#xff1a;
- 关于在SSD上使用btrfs文件系统需要做的优化 - akarin.cn
- Solid State Drives - Arch wiki
- SSD Optimization - debian wiki
- Btrfs wiki
- 本文来自云栖社区合作伙伴“Linux中国”&#xff0c;原文发布日期&#xff1a;2015-10-16