固态磁盘(SSD)是使用NAND闪存芯片持久存储数据的存储设备。这使它们有别于前几代磁盘,前几代磁盘将数据存储在旋转的磁盘上。在SSD中,跨整个逻辑块地址(LBA)范围的数据访问时间是恒定的;而对于使用旋转介质的较旧磁盘,跨越大地址范围的访问模式会招致寻道成本。因此,SSD设备具有更好的延迟和吞吐量。
随着使用的块数接近磁盘容量,性能会下降。 对性能的影响程度因供应商而异。 但是,所有设备都会出现一些性能下降。
为了解决性能下降问题,主机系统(例如,Linux内核)可以使用discard请求来通知存储,不再使用给定范围的块。 SSD可以使用这些信息来释放内部空间,并使用空闲块进行损耗平衡。 仅当存储声明其存储协议(ATA或SCSI)支持时,才会发出discard。 使用特定于存储协议的协商的discard命令(ATA使用TRIM命令,SCSI使用带有UNMAP的WRITE SAME或UNMAP命令)向存储发出discard请求。
当满足以下几点时,启用discard支持最有用:
- 文件系统上仍然有可用空间。
- 底层存储设备上的大多数逻辑块已写入。
有关TRIM的更多信息,请参阅数据集管理T13规范。
有关UNMAP的更多信息,请参见SCSI块命令3 T10规范的4.7.3.4节。
注
并非市场上所有的固态设备都支持discard。 要确定您的固态设备是否支持,请检查 /sys/block/sda/queue/discard_granularity,它是设备内部分配单元的大小。
部署注意事项
由于SSD的内部布局和操作,最好在内部 erase block boundary上分区设备。 如果SSD导出拓扑信息,则Red Hat Enterprise Linux 7中的分区实用程序选择合理的默认值。 但是,如果设备不导出拓扑信息,则Red Hat建议在1MB边界上创建第一个分区。
根据供应商的选择,固态硬盘有各种类型的TRIM机制。早期版本的磁盘通过降低读命令后可能发生的数据泄漏来提高性能。
以下是TRIM机制的类型:
- 非确定性TRIM
- 确定性TRIM(DRAT)
- TRIM(RZAT)之后确定性读零
前两种TRIM机制可能会导致数据泄漏,因为在TRIM返回不同或相同的数据之后,read命令会被发送到LBA。RZAT在read命令之后返回零,Red Hat建议使用这种TRIM机制来避免数据泄漏。它只在SSD中受影响。选择支持RZAT机制的磁盘。
使用的TRIM机制的类型取决于硬件实现。 要在ATA上找到TRIM机制的类型,请使用hdparm命令。 请参见以下示例以查找TRIM机制的类型:
# hdparm -I /dev/sda |grep TRIM
* Data Set Management TRIM supported (limit 4 blocks)
* Deterministic read ZEROs after TRIM
有关更多信息,请参见man hdparm。
LVM使用的逻辑卷管理器(LVM),设备映射器(DM)目标和MD(软件突袭)目标均支持discards。 唯一不支持discards的DM目标是dm-snapshot,dm-crypt和dm-raid45。 在Red Hat Enterprise Linux 6.1中添加了对dm-mirror的discards支持,从7.0开始,MD支持discards。
如果SSD无法正确处理discard,则在SSD上使用RAID5将导致性能降低。 您可以在raid456.conf文件或GRUB2配置中设置discard。 有关说明,请参阅以下过程。
过程 在raid456.conf中设置discard
devices_handle_discard_safely模块参数在raid456模块中设置。 要在raid456.conf文件中启用discard:
-
验证硬件是否支持discard:
# cat /sys/block/disk-name/queue/discard_zeroes_data
如果返回值为1,则支持discard。 如果命令返回0,则RAID代码必须将磁盘输出清零,这需要更多时间。
-
创建**/etc/modprobe.d/raid456.conf**文件,并包含以下行:
options raid456 devices_handle_discard_safely=Y
-
使用dracut -f命令重建初始ramdisk(initrd)。
-
重新启动系统以使更改生效。
过程 在GRUB2配置中设置discard
devices_handle_discard_safely模块参数在raid456模块中设置。要在GRUB2配置中启用discard,请执行以下操作:
-
验证硬件是否支持discard:
# cat /sys/block/disk-name/queue/discard_zeroes_data
如果返回值为1,则支持discard。 如果命令返回0,则RAID代码必须将磁盘输出清零,这需要更多时间。
-
将以下行添加到/etc/default/grub文件中:
raid456.devices_handle_discard_safely=Y
-
在使用BIOS固件的系统和使用UEFI的系统上,GRUB2配置文件的位置不同。使用以下命令之一重新创建GRUB2配置文件。
- 在使用了BIOS固件的系统上,使用:
# grub2-mkconfig -o /boot/grub2/grub.cfg
-
在使用了UEFI固件的系统上,使用:
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
-
重新启动系统以使更改生效。
注
在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选项。 例如,要在启用discard的情况下将/dev/sda2挂载到/mnt,请使用:
# mount -t ext4 -o discard /dev/sda2 /mnt
缺省情况下,ext4不会发出discard命令,主要是为了避免在可能未正确实现discard的设备上出现问题。 Linux swap代码向以启用discard的设备发出discard命令,并且没有控制该行为的选项。
性能调优注意事项
有关固态磁盘性能调整注意事项的信息,请参阅《 Red Hat Enterprise Linux 7性能调整指南》中的“固态磁盘”部分。