蚊章汇 - '@alim0x'
type: channel
link: https://linuxcn.bwsl.wang/author/246/
description: '@alim0x'
items: 在 SSD 上使用 btrfs 文件系统的相关优化

在 SSD 上使用 btrfs 文件系统的相关优化
type: item
date: 2015-10-16T15:41:00+08:00
description: 优化挂载参数在 Linux 中挂载 SSD 上的 btrfs，可以采用各种参数进行优化：# <file system> <mount point> <type> <options> <dump> <pass> UUID=<略> / btrfs defaults,ssd,discard,noatime,compress=lzo,subvol=@ 0 1 这些参数各有优缺点，酌情添加。ssdbtrfs 文件系统有对 SSD 进行优化，在挂载参数中加入 ssd 即可。该参数不会自动启用 TRIM/discard。discard可以通过以下命令确认 SSD 是否支持 TRIM：sudo hdparm -I /dev/sdX | grep TRIM * Data Set Management TRIM supported (limit 8 blocks) 若 SSD 支持 TRIM 命令，可以在 /etc/fstab 中启用 discard 参数。建议将 discard 挂载参数作为首选。据 debian wiki 所述，包括三星，镁光，英睿达在内的一些 SSD 在 discard/TRIM 上有问题，不能合适地处理 TRIM 命令。以下是 linux 内核相关处源代码 (2015/10/15)：/* devices that don'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't properly handle TRIM commands */ { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, }, 该参数不是必需的，也可以自定义周期性运行 fstrim 命令来取代该参数，使用该命令前要确认 SSD 支持 TRIM，否则可能造成数据丢失。当 SSD 有足够的空余空间或（未分配的）可用空间时不需要该参数。noatime挂载参数可以加入 noatime，通过禁止更新访问记录来减少不必要的写操作以提高性能。该选项对 HDD 同样有性能提升。btrfs 的默认配置为 relatime。compress打开压缩功能在通常情况下有利于提高传输性能（并非绝对），也可以节省存储空间。加入以下挂载参数：compress=lzo 或 compress=zlib lzo 速度更快，zlib 压缩率更高。注意确认 SSD 主控是否是非压缩主控，若为压缩主控不建议加入该参数。写缓存若 SSD 带有缓存，启用 Write Cache 可以提高性能：Disks -> Drive Setting -> Enable Write Cache，但在突然断电的情况下可能造成数据丢失。I/O 调度SSD 结构不同于传统硬盘，寻址时间短，I/O 调度算法可选择 noop 以降低延迟。以下命令可查看与修改调度器：cat /sys/block/sdX/queue/scheduler # sdX 指你的设备 sudo tee /sys/block/sdX/queue/scheduler <<< noop 注意以上方法并不持久，重启后会重置。如果 SSD 是系统唯一的存储设备，可考虑通过 elevator=noop 内核参数设置 I/O 调度器。也可使用 udev 规则来修改调度器，对…