第21章 ソリッドステートディスクの導入ガイドライン

ソリッドステートディスク (SSD) とは、永続的なデータの格納に NAND フラッシュチップを使用するストレージデバイスを指します。今までのディスクとは大きく異なり、回転する円盤状の磁気記憶媒体にデータを格納します。SSD では、論理ブロックアドレス (LBA) 全体における、データへのアクセス時間は一定になります。一方、回転媒体を使用するこれまでのディスクでは、広範囲のアドレスにまたがるデータにアクセスするため時間がかかります。このように、SSD デバイスの方が待ち時間やスループットに優れています。
使用中のブロック数がディスクの最大容量に近づくにつれ、パフォーマンスが低下してきます。パフォーマンス低下の度合いはデバイスのベンダーごとに大きく異なりますが、いずれのデバイスにもある程度のパフォーマンス低下が見られます。
パフォーマンス低下の問題に対応するため、ホストシステム (Linux カーネルなど) では、特定のブロック範囲が使用されなくなっていることをストレージに知らせる discard 要求を使用できます。SSD はこの情報に基づいて領域を内部で解放し、解放した空きブロックをウェアレベリングに使用することができます。discard 要求が実行できるのは、そのストレージが、ストレージプロトコル (ATA または SCSI) に対応している場合のみです。discard の要求は、ストレージプロトコル固有のネゴシエート済みの discard コマンドによって、ストレージに対して発行します (ATA の場合は TRIM コマンド、SCSI の場合は WRITE SAME (UNMAP を設定)、または UNMAP コマンドになります)。
以下の条件を満たす場合は、discard のサポートを有効にすると大変便利です。
  • ファイルシステムに空き容量がある場合。
  • 基盤のストレージデバイスの論理ブロックが、ほぼ書き込み済みである場合。
TRIM の詳細は、「Data Set Management T13 Specifications」を参照してください。
UNMAP の詳細は、「SCSI Block Commands 3 T10 Specification」のセクション 4.7.3.4 を参照してください。

注記

市販のソリッドステートデバイスのすべてが discard に対応しているわけではありません。お使いのソリッドステートデバイスが discard に対応しているかどうかを調べるには、デバイスの内部割り当て単位のサイズである /sys/block/sda/queue/discard_granularity を確認します。

導入に関する考慮事項

SSD の内部レイアウトと動作上の理由から、内部 erase block boundary 上でデバイスのパーティション設定を行うことが最適です。Red Hat Enterprise Linux 7 のパーティションユーティリティは、SSD がトポロジー情報をエクスポートする場合に適切なデフォルトを選択します。ただし、デバイスが not トポロジー情報をエクスポートする場合、Red Hat では、最初のパーティションを 1MB 境界で作成することを推奨しています。
SSD には、ベンダーによってさまざまなタイプの TRIM メカニズムがあります。ディスクの初期バージョンは、読み込みコマンドの後にデータの漏洩の可能性を妥協することでパフォーマンスを向上していました。
以下は、TRIM メカニズムのタイプです。
  • 非決定性 TRIM
  • 決定性 TRIM (DRAT)
  • 決定性 Read Zero after TRIM (RZAT)
最初の 2 種類の TRIM メカニズムは、TRIM が別のデータまたは同じデータを返すと、read コマンドとして LBA に対してデータ漏洩を引き起こす可能性があります。Red Hat では、データの漏洩を防ぐためにも、この 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)、device-mapper (DM) ターゲット、および MD (ソフトウェア RAID) は discard 要求をサポートします。discard 要求に対応しない DM ターゲットは dm-snapshot、dm-crypt、dm-raid45 です。dm-mirror では、Red Hat Enterprise Linux 6.1 で discard 要求に対応するようになり、MD は、バージョン 7.0 以降で discard 要求に対応するようになりました。
SSD で RAID レベル 5 を使用する場合は、SSD で discard が適切に処理されないとパフォーマンスが低下します。discard は、raid456.conf ファイルまたは GRUB2 設定にします。手順については、以下を参照してください。

手順21.1 raid456.conf に discard の設定

devices_handle_discard_safely モジュールパラメーターが raid456 モジュールに設定されています。raid456.conf ファイルで discard を有効にするには、以下の手順を行います。
  1. ハードウェアが discard をサポートするかどうかを確認するには、以下のコマンドを実行します。
    # cat /sys/block/disk-name/queue/discard_zeroes_data
    戻り値が 1 の場合は discard が有効です。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 設定で discard を有効にするには、以下を行います。
  1. ハードウェアが discard をサポートするかどうかを確認するには、以下のコマンドを実行します。
    # cat /sys/block/disk-name/queue/discard_zeroes_data
    戻り値が 1 の場合は discard が有効です。0 が返った場合は、RAID コードがディスクを取り除く必要があるため、さらに時間がかかります。
  2. /etc/default/grub ファイルに次の行を追加します。
    raid456.devices_handle_discard_safely=Y
  3. GRUB2 設定ファイルの場所は、システムが BIOS ファームウェアか UEFI を使っているかで異なります。次のいずれかのコマンドを実行し、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 オプションを使用します。たとえば、discard を有効にして /dev/sda2/mnt にマウントするには、以下のコマンドを実行します。
# mount -t ext4 -o discard /dev/sda2 /mnt
ext4 は、デフォルトでは discard コマンドを発行しません。discard コマンドを正しく実装しないデバイスで問題が発生するのを回避するためです。Linux の swap コードは、discard を有効にしたデバイスに対して discard コマンドを発行するため、この動作を制御するオプションはありません。

パフォーマンスチューニングに関する注意点

ソリッドステートディスクでのパフォーマンスチューニングに関する詳細は、『Red Hat Enterprise Linux 7 パフォーマンスチューニングガイド』の「ソリッドステートディスク」セクションを参照してください。