在 SSD 上使用 btrfs 文件系统的相关优化
优化挂载参数 在 Linux 中挂载 SSD 上的 btrfs，可以采用各种参数进行优化： # file system mount point type options dump pass UUID=略 / btrfs defaults,ssd,discard,noatime,compress=lzo,subvol=@ 0 1  这些参数各有优缺点，酌情添加。 ssd btrfs 文件系统有对 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/fs
SSD btrfs
优化挂载参数 在 Linux 中挂载 SSD 上的 btrfs，可以采用各种参数进行优化： # file system mount point type options dump pass UUID=略 / btrfs defaults,ssd,discard,noatime,compress=lzo,subvol=@ 0 1  这些参数各有优缺点，酌情添加。 ssd btrfs 文件系统有对 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/fs
![](/data/attachment/album/201510/15/230357ybnq0nw0bjyjni9i.jpg)


### 优化挂载参数


在 Linux 中挂载 SSD 上的 btrfs，可以采用各种参数进行优化：



```
# <file system> <mount point>   <type>  <options>  <dump>  <pass>
UUID=<略>  /  btrfs defaults,ssd,discard,noatime,compress=lzo,subvol=@ 0   1

```

这些参数各有优缺点，酌情添加。


#### ssd


btrfs 文件系统有对 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 命令](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/ata/libata-core.c#n4227)。以下是 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 规则来修改调度器，对多存储设备同样有效：



```
/etc/udev/rules.d/60-ssd-scheduler.rules # 创建该文件
```

文件内容如下：



```
# set deadline scheduler for non-rotating disks
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"

```

### 参考：


1. [关于在SSD上使用btrfs文件系统需要做的优化 - akarin.cn](http://www.akarin.cn/archives-73.html)
2. [Solid State Drives - Arch wiki](https://wiki.archlinux.org/index.php/Solid_State_Drives_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87))
3. [SSD Optimization - debian wiki](https://wiki.debian.org/SSDOptimization)
4. [Btrfs wiki](https://btrfs.wiki.kernel.org/index.php/FAQ)
