Chapter 21. Solid-State Disk Deployment Guidelines Solid-state disks (SSD) are storage devices that use NAND flash chips to persistently store data. This sets them apart from generations of disks, which store data in rotating, magnetic platters. In an SSD, the access time for data across the full Logical Block Address (LBA) range is constant; whereas with older disks that use rotating media, access patterns that span large address ranges incur seek costs. As such, SSD devices have better latency and throughput. Performance degrades as the number of used blocks approaches the disk capacity. The degree of performance impact varies greatly by vendor. However, all devices experience some degradation. To address the degradation issue, the host system (for example, the Linux kernel) may use discard requests to inform the storage that a given range of blocks is no longer in use. An SSD can use this information to free up space internally, using the free blocks for wear-leveling. Discards will only be issued if the storage advertises support in terms of its storage protocol (be it ATA or SCSI). Discard requests are issued to the storage using the negotiated discard command specific to the storage protocol ( TRIM command for ATA, and WRITE SAME with UNMAP set, or UNMAP command for SCSI). Enabling discard support is most useful when the following points are true: Free space is still available on the file system. Most logical blocks on the underlying storage device have already been written to. For more information about UNMAP , see the section 4.7.3.4 of the SCSI Block Commands 3 T10 Specification . Note Not all solid-state devices in the market have discard support. To determine if your solid-state device has discard support, check for /sys/block/sda/queue/discard_granularity , which is the size of internal allocation unit of device. Deployment Considerations Because of the internal layout and operation of SSDs, it is best to partition devices on an internal erase block boundary . Partitioning utilities in Red Hat Enterprise Linux 7 chooses sane defaults if the SSD exports topology information. However, if the device does not export topology information, Red Hat recommends that the first partition should be created at a 1MB boundary. SSD has various types of TRIM mechanism depending on the vendors choice. The early versions of disks improved the performance by compromising possible data leakage after the read command. Following are the types of TRIM mechanism: Non-deterministic TRIM Deterministic TRIM (DRAT) Deterministic Read Zero after TRIM (RZAT) The first two types of TRIM mechanism can cause data leakage as the read command to the LBA after a TRIM returns different or same data. RZAT returns zero after the read command and Red Hat recommends this TRIM mechanism to avoid data leakage. It is affected only in SSD. Choose the disk which supports RZAT mechanism. Type of TRIM mechanism used depends on hardware implementation. To find the type of TRIM mechanism on ATA, use the hdparm command. See the following example to find the type of TRIM mechanism: For more information, see man hdparm . The Logical Volume Manager (LVM), the device-mapper (DM) targets, and MD (software raid) targets that LVM uses support discards. The only DM targets that do not support discards are dm-snapshot, dm-crypt, and dm-raid45. Discard support for the dm-mirror was added in Red Hat Enterprise Linux 6.1 and as of 7.0 MD supports discards. Using RAID level 5 over SSD results in low performance if SSDs do not handle discard correctly. You can set discard in the raid456.conf file, or in the GRUB2 configuration. For instructions, see the following procedures. Procedure 21.1. Setting discard in raid456.conf The devices_handle_discard_safely module parameter is set in the raid456 module. To enable discard in the raid456.conf file: Verify that your hardware supports discards: If the returned value is 1 , discards are supported. If the command returns 0 , the RAID code has to zero the disk out, which takes more time. Create the /etc/modprobe.d/raid456.conf file, and include the following line: Use the dracut -f command to rebuild the initial ramdisk ( initrd ). Reboot the system for the changes to take effect. Procedure 21.2. Setting discard in the GRUB2 Configuration The devices_handle_discard_safely module parameter is set in the raid456 module. To enable discard in the GRUB2 configuration: Verify that your hardware supports discards: If the returned value is 1 , discards are supported. If the command returns 0 , the RAID code has to zero the disk out, which takes more time. Add the following line to the /etc/default/grub file: The location of the GRUB2 configuration file is different on systems with the BIOS firmware and on systems with UEFI. Use one of the following commands to recreate the GRUB2 configuration file. On a system with the BIOS firmware, use: On a system with the UEFI firmware, use: Reboot the system for the changes to take effect. Note In Red Hat Enterprise Linux 7, discard is fully supported by the ext4 and XFS file systems only. In Red Hat Enterprise Linux 6.3 and earlier, only the ext4 file system fully supports discard. Starting with Red Hat Enterprise Linux 6.4, both ext4 and XFS file systems fully support discard. To enable discard commands on a device, use the discard option of the mount command. For example, to mount /dev/sda2 to /mnt with discard enabled, use: By default, ext4 does not issue the discard command to, primarily, avoid problems on devices which might not properly implement discard. The Linux swap code issues discard commands to discard-enabled devices, and there is no option to control this behavior. Performance Tuning Considerations For information on performance tuning considerations regarding solid-state disks, see the Solid-State Disks section in the Red Hat Enterprise Linux 7 Performance Tuning Guide .

Commands:
hdparm -I /dev/sda | grep TRIM Data Set Management TRIM supported (limit 8 block) Deterministic read data after TRIM
cat /sys/block/ disk-name /queue/discard_zeroes_data
options raid456 devices_handle_discard_safely=Y
cat /sys/block/ disk-name /queue/discard_zeroes_data
raid456.devices_handle_discard_safely=Y
grub2-mkconfig -o /boot/grub2/grub.cfg
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
mount -t ext4 -o discard /dev/sda2 /mnt