Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第 21 章 固态磁盘部署指南

固态磁盘 (SSD)是使用 NAND 闪存芯片来持久存储数据的存储设备。这样可将其与之前生成的磁盘外设置,后者将数据存储在旋转、大体上手中。在 SSD 中,完整逻辑块地址(LBA)范围的数据访问时间是恒定的;而对于使用旋转介质的旧磁盘,跨越大型地址范围的访问模式会导致成本。因此,SSD 设备具有更好的延迟和吞吐量。
性能降低,因为已用块的数量接近磁盘容量。性能影响的程度因供应商而异。但是,所有设备都出现某种降级。
要解决降级的问题,主机系统(如 Linux 内核)可以使用丢弃的请求来告知存储给定范围的块不再使用。SSD 可以使用此信息在内部释放空间,使用空闲块进行磨损均衡。只有存储宣传支持其存储协议(ATA 或 SCSI)时,才会发出丢弃。使用特定于存储协议的协商 discard 命令(用于 ATA 的TRIM 命令和带有 UNMAP 集的 WRITE SAME 或 SCSI 的 UNMAP 命令)向存储发出丢弃请求。
当以下点为 true 时启用 丢弃 支持最有用:
  • 可用空间仍可在文件系统中可用。
  • 底层存储设备上的大多数逻辑块已被写入。
有关 TRIM 的更多信息,请参阅 数据集管理 T13 规范
有关 UNMAP 的更多信息,请参阅 SCSI 块命令 3 T10 规范 的 4.7.3.4 部分。
注意
不是市场中的所有固态设备 都支持。要确定您的固态设备是否支持 丢弃,请检查 /sys/block/sda/queue/discard_granularity,这是设备的内部分配单元的大小。

部署注意事项

由于 SSD 的内部布局和操作,最好在内部 擦除块边界 上对设备进行分区。如果 SSD 导出拓扑信息,Red Hat Enterprise Linux 7 中的分区工具会选择 sane 默认值。但是,如果设备 没有 导出拓扑信息,红帽建议在 1MB 边界下创建第一个分区。
SSD 有不同的 TRIM 机制,具体取决于供应商选择。早期版本的磁盘通过在 read 命令后影响数据泄漏来提高性能。
以下是 TRIM 机制的类型:
  • 非确定的 TRIM
  • 确定性 TRIM (DRAT)
  • TRIM (RZAT)后确定性读零
TRIM 返回不同或相同数据后,前两种 TRIM 机制可能会导致数据泄漏,因为 read 命令会泄漏到 LBA。RZAT 在 read 命令后返回零,红帽建议这种 TRIM 机制以避免数据泄露。它只在 SSD 中受到影响。选择支持 RZAT 机制的磁盘。
使用的 TRIM 机制类型取决于硬件实现。要在 ATA 上查找 TRIM 机制的类型,请使用 hdparm 命令。请参阅以下示例来查找 TRIM 机制的类型:
# hdparm -I /dev/sda | grep TRIM
Data Set Management TRIM supported (limit 8 block)
Deterministic read data after TRIM
如需更多信息,请参阅 man hdparm
LVM 使用的逻辑卷管理器(LVM)、设备映射器(DM)目标和 MD (软件 raid)目标。不支持丢弃的唯一 DM 目标是 dm-snapshot、dm-crypt 和 dm-raid45。在 Red Hat Enterprise Linux 6.1 中添加了对 dm-mirror 的丢弃支持,在 7.0 MD 中支持丢弃。
如果 SSD 无法正确处理 丢弃,则使用 RAID 5 与 SSD 的性能会较低。您可以在 raid456.conf 文件中设置 discard,或者在 GRUB2 配置中设置 discard。具体步骤请查看以下步骤。

过程 21.1. 在 raid456.conf 中设置 discard

devices_handle_discard_safely 模块参数在 raid456 模块中设置。在 raid456.conf 文件中启用丢弃:
  1. 验证您的硬件支持丢弃:
    # cat /sys/block/disk-name/queue/discard_zeroes_data
    如果返回的值是 1,则支持丢弃。如果命令返回 0, RAID 代码必须归零磁盘,这需要更长的时间。
  2. 创建 /etc/modprobe.d/raid456.conf 文件,并包含以下行:
    options raid456 devices_handle_discard_safely=Y
    
  3. 使用 dracut -f 命令重建初始 ramdisk (initrd)。
  4. 重启系统以使更改生效。

过程 21.2. 在 GRUB2 配置中设置 discard

devices_handle_discard_safely 模块参数在 raid456 模块中设置。在 GRUB2 配置中启用丢弃:
  1. 验证您的硬件支持丢弃:
    # cat /sys/block/disk-name/queue/discard_zeroes_data
    如果返回的值是 1,则支持丢弃。如果命令返回 0, RAID 代码必须归零磁盘,这需要更长的时间。
  2. /etc/default/grub 文件中添加以下行:
    raid456.devices_handle_discard_safely=Y
    
  3. 在使用 BIOS 固件以及带有 UEFI 的系统中,GRUB2 配置文件的位置有所不同。使用以下命令之一重新创建 GRUB2 配置文件。
    • 在带有 BIOS 固件的系统中,使用:
      # grub2-mkconfig -o /boot/grub2/grub.cfg
    • 在具有 UEFI 固件的系统中,使用:
      # grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
  4. 重启系统以使更改生效。
注意
在 Red Hat Enterprise Linux 7 中,仅 ext4 和 XFS 文件系统完全支持 discard。
在 Red Hat Enterprise Linux 6.3 及更早版本中,只有 ext4 文件系统完全支持 discard。从 Red Hat Enterprise Linux 6.4 开始,ext4 和 XFS 文件系统都完全支持 discard。要在设备上启用 discard 命令,请使用 mount 命令的 discard 选项。例如:要将 /dev/sda2 挂载到启用了 discard 的 /mnt 中,请使用:
# mount -t ext4 -o discard /dev/sda2 /mnt
默认情况下,ext4 不会发出 discard 命令,主要避免了可能无法正确实现丢弃的设备出现问题。Linux swap 代码为启用丢弃的设备发出丢弃命令,没有控制此行为的选项。

性能调优注意事项

有关固态磁盘性能调优注意事项的详情,请查看 Red Hat Enterprise Linux 7 性能调节指南 中的 Solid-State 磁盘 部分。