GNU/Linux >> Linux の 問題 >  >> Linux

RAIDコントローラーに接続されたSSDでTRIMとDISCARDを使用する

SSDは現在では当たり前のことであり、過去数年間、エンタープライズおよびコンシューマー環境でのパフォーマンス指向ディスクのデフォルトの選択肢となっています。 SSDはクールで高速ですが、ハイエンドマシンのほとんどの人は、このジレンマに直面しています。私のSSDは、デバイスのDISCARDまたはTRIM機能を公開しないRAIDコントローラーの背後にあります。最高のSSDパフォーマンスを維持するためにブロックを破棄するにはどうすればよいですか?これは、マシンを分解せずにそれを行うための秘訣です。 SSDファームウェアの最近の改善により、SSDに書き込むアプリケーションがDISCARD/TRIMを使用するための厳格さが緩和されました。

ただし、ファイルシステムに破棄したブロックをドライブに通知させる必要がある場合があります。おそらく、通常はより高価なエンタープライズクラスのSLCまたはMLCドライブの代わりにTLC(セルあたり3ビット)またはQLC(セルあたり4ビット)ドライブを使用します(後者は、支援するためにより多くの追加ブロックを確保するため、パフォーマンス低下の影響を受けにくくなりますドライブが容量に達すると上書きされます)。または、SSDを100%まで満たした後、元のパフォーマンス/IOPSを取り戻すことができない場合もあります。

ほとんどのシステムでは、パフォーマンスを取り戻すには、通常、ファイルシステムトリム(fstrim)を発行するだけです。 ) 指図。 Red Hat Enterprise Linux(RHEL)システムを使用した例を次に示します。

[root@System_A ~]# fstrim -av
/export/home: 130.5 GiB (140062863360 bytes) trimmed
/var: 26.1 GiB (28062511104 bytes) trimmed
/opt: 17.6 GiB (18832797696 bytes) trimmed
/export/shared: 31.6 GiB (33946275840 bytes) trimmed
/usr/local: 5.6 GiB (5959331840 bytes) trimmed
/boot: 678.6 MiB (711565312 bytes) trimmed
/usr: 36.2 GiB (38831017984 bytes) trimmed
/: 3 GiB (3197743104 bytes) trimmed
[root@System_A ~]#

[読者も気に入っています:Linuxハードウェア:デスクトップでのソリッドステートディスク(SSD)への変換]

ただし、1つの問題があります...

SSDがRAIDコントローラー(HPEのSmartArray、DellのPERC、またはLSI / AvagoのMegaRAIDに基づくもの)に接続されたRAIDボリュームの背後にある場合、次のようになります。

[root@System_B ~]# fstrim -av
[root@System_B ~]# 

何もありません。何も起こりません。 SCSI I / Oチェーンの最後では、デバイスの機能はデバイス自体に要約され、ドライブが接続されているRAIDドライバーになります。

よく見てみましょう。これは、RHELシステムのSATAコネクタに接続されたSSD(Samsung EVO 860 2Tbドライブ)です(このシステムに System_Aという名前を付けます。 このドキュメントの残りの部分):

[root@System_A ~]# lsscsi 
[3:0:0:0]    disk    ATA      Samsung SSD 860  3B6Q  /dev/sda 

これは、別のシステム(そのシステムを System_B と呼びましょう)上のRAIDコントローラー(PERC H730P)の背後にある同じドライブ(同じモデル、同じファームウェア)です。 このドキュメントの残りの部分):

[root@System_B ~]# lsscsi 
[0:2:0:0]    disk    DELL     PERC H730P Adp   4.30  /dev/sda 

同じドライブであることをどうやって知ることができますか? megaclisas-status,を使用していただきありがとうございます RAIDHBAを照会できます。これを示しています:

[root@System_B ~]# megaclisas-status
-- Controller information --
-- ID | H/W Model          | RAM    | Temp | BBU    | Firmware     
c0    | PERC H730P Adapter | 2048MB | 60C  | Good   | FW: 25.5.7.0005 

-- Array information --
-- ID | Type   |    Size |  Strpsz |   Flags | DskCache |   Status |  OS Path | CacheCade |InProgress   
c0u0  | RAID-0 |   1818G |  512 KB | ADRA,WB |  Enabled |  Optimal | /dev/sda | None      |None         

-- Disk information --
-- ID   | Type | Drive Model                                      | Size     | Status          | Speed    | Temp | Slot ID  | LSI ID  
c0u0p0  | SSD  | S3YUNB0KC09340D Samsung SSD 860 EVO 2TB RVT03B6Q | 1.818 TB | Online, Spun Up | 6.0Gb/s  | 23C  | [32:0]   | 0   

はい、同じドライブ(Samsung EVO 860)と同じファームウェア(3B6Q)です。

lsblkの使用 、これら2つのデバイスのDISCARD機能を公開します:

[root@System_A ~]# lsblk -dD
NAME     DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda             0      512B       2G         1
[root@System_B ~]# lsblk -dD
NAME      DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda              0        0B       0B         0

これが犯人です。すべての値はゼロです。 System_B上のPERCH730Pの背後にあるRAID0のSSD DISCARD機能は公開されません。これがfstrimの理由です System_B 何もしなかったか、何も返しませんでした。

HPQSmartArrayシステムも同様の影響を受けます。ハイエンドのSmartArrayRAIDカードを搭載したHPEDL360Gen10は次のとおりです。

[root@dl360gen10 ~]# lsblk -dD
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda         0        0B       0B         0
sdc         0        0B       0B         0
sdd         0        0B       0B         0
sde         0        0B       0B         0
sdf         0        0B       0B         0
sdg         0        0B       0B         0
sdh         0        0B       0B         0

すべてのLSIベース(megaraid_sas ドライバー)およびSmartArrayベース(hpsaドライバー)システムはこの問題に悩まされています。 SSDをトリムする場合は、 System_Bをシャットダウンする必要があります。 、ドライブを引き出し、SAS / SATA対応システムに接続し、fstrim そこに。

幸いなことに、デバイスのネイティブ機能を一時的に公開してトリムするための小さなトリックがあります。これには、RAIDドライブを使用するアプリケーションを停止する必要がありますが、少なくとも、システムからハードウェアを引き出すためにデータセンターに移動する必要はありません。

秘訣は、RAIDドライバーを介したRAIDドライブの使用を停止し、SSDをJBODとして公開し、ファイルシステムを再マウントしてから、そこでトリムすることです。ブロックを破棄したら、ドライブをRAIDモードに戻し、ファイルシステムをマウントしてから、アプリケーションを再起動します。

注意点がいくつかあります:

  • 使用しているRAIDハードウェアでは、デバイスをJBODモードにする必要があります。
  • OSを停止する必要があるため、ブートディスクでこれを行うことはできません。

プロセスをウォークスルーする

これは、DellPERCH730PとSamsungSSDを搭載したシステムで作成された小さなウォークスルーです。このシステムをSystem_Cと呼びます 。

1)SSDはHBA a0の[32:2]にあります 、そしてそこから単一のRAID 0ドライブを作成します:

[root@System_C ~]# MegaCli -CfgLdAdd -r0 [32:2] WB RA CACHED -strpsz 512 -a0

2)新しい論理ドライブが/dev/sddとしてポップアップ表示されます DISCARD機能は表示されません:

[root@System_C ~]# lsblk -dD
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
[....]
sdd         0        0B       0B         0

3)次に、そのデバイス上にボリュームグループ(VG)、ボリューム、および128Gファイルシステムを作成します。

[root@System_C ~]# parted /dev/sdd
[root@System_C ~]# pvcreate /dev/sdd1
[root@System_C ~]# vgcreate testdg /dev/sdd1
[root@System_C ~]# lvcreate -L 128G -n lv_test testdg
[root@System_C ~]# mount /dev/testdg/lv_test /mnt
[root@System_C ~]# mke2fs -t ext4 /dev/testdg/lv_test 
[root@System_C ~]# mount /dev/testdg/lv_test /mnt

このデモンストレーションのために、いくつかのデータを/mntにコピーします。 。

4)システムの使用を停止し、ボリュームグループをエクスポートします:

[root@System_C ~]# umount /mnt
[root@System_C ~]# vgchange -a n testdg
  0 logical volume(s) in volume group "testdg" now active
[root@System_C ~]# vgexport testdg
  Volume group "testdg" successfully exported

5)HBAでJBODモードを有効にします:

[root@System_C ~]# MegaCli -AdpSetProp -EnableJBOD -1 -a0

Adapter 0: Set JBOD to Enable success.

Exit Code: 0x00

6)論理ドライブを削除し、ドライブをJBODにします。ほとんどのRAIDコントローラーでは、安全性チェックにより、論理ボリュームの一部であるドライブを使用してJBODを作成できません。

[root@System_C ~]# MegaCli -PDMakeJBOD -PhysDrv[32:2] -a0

Adapter: 0: Failed to change PD state at EnclId-32 SlotId-2.

Exit Code: 0x01

ここでの解決策は、論理ボリュームを削除することです。これは単純な論理操作であり、データに影響を与えることはありません。ただし、最初にRAID0アレイを作成するために使用したコマンドを書き留めておく必要があります。

[root@System_C ~]# MegaCli -CfgLdDel -L3 -a0
                                     
Adapter 0: Deleted Virtual Drive-3(target id-3)

Exit Code: 0x00
[root@System_C ~]# MegaCli -PDMakeJBOD -PhysDrv[32:2] -a0
                                     
Adapter: 0: EnclId-32 SlotId-2 state changed to JBOD.

Exit Code: 0x00

7)ディスクのカーネルビューを更新し、データをインポートします:

[root@System_C ~]# partprobe
[root@System_C ~]# vgscan 
  Reading volume groups from cache.
  Found exported volume group "testdg" using metadata type lvm2
  Found volume group "rootdg" using metadata type lvm2

[root@System_C ~]# vgimport testdg
  Volume group "testdg" successfully imported

[root@System_C ~]# vgchange -a y testdg
  1 logical volume(s) in volume group "testdg" now active

[root@System_C ~]# mount /dev/testdg/lv_test /mnt

[root@System_C ~]# fstrim -v /mnt
/mnt: 125.5 GiB (134734139392 bytes) trimmed

ファイルシステム上の空のブロックを破棄しました。 RAID0論理ドライブに戻しましょう。

8)umount ファイルシステムとボリュームグループのエクスポート:

[root@System_C ~]# umount /mnt
[root@System_C ~]# vgchange -a n testdg
  0 logical volume(s) in volume group "testdg" now active
[root@System_C ~]# vgexport testdg
  Volume group "testdg" successfully exported

9)RAIDコントローラーでJBODモードを無効にします:

[root@System_C ~]# MegaCli -AdpSetProp -EnableJBOD -0 -a0

Adapter 0: Set JBOD to Disable success.

Exit Code: 0x00

10)論理ドライブを再作成します:

[root@System_C ~]# MegaCli -CfgLdAdd -r0 [32:2] WB RA CACHED -strpsz 512 -a0

11)カーネルにディスクをプローブしてファイルシステムを再マウントするように依頼します:

[root@System_C ~]# partprobe
[root@System_C ~]# vgscan 
  Reading volume groups from cache.
  Found exported volume group "testdg" using metadata type lvm2
  Found volume group "rootdg" using metadata type lvm2

[root@System_C ~]# vgimport testdg
  Volume group "testdg" successfully imported

[root@System_C ~]# vgchange -a y testdg
  1 logical volume(s) in volume group "testdg" now active

[root@System_C ~]# mount /dev/testdg/lv_test /mnt

データがそこにあり、SSDのパフォーマンスが元の数値に戻っている必要があります。

[無料のオンラインコース:Red HatEnterpriseLinuxの技術概要。 ]

まとめ

ここにいくつかの追加のメモがあります:

  • この手順は、一粒の塩と大きな警告を伴って実行する必要があります。Linuxシステムで論理ドライブとJBODを識別できると確信できる場合を除いて、これを実行しないでください。
  • この手順は、RAID0論理ドライブを使用してのみテストしました。ファイルシステムの構造がLinuxOSから隠されるため、他のタイプのRAID(5、6、1 + 0など)で機能する可能性は低いようです。
  • 検証済みのバックアップなしでこの手順を実行しないでください。

Linux
  1. Linuxでの印刷にCUPSを使用するためのヒントとコツ

  2. find と xargs を使用して rm でファイルを削除する

  3. ddを使用してFFでファイルをパディングする方法は?

  1. LinuxでSSDのTRIMを有効にする

  2. LvmとDm-cryptでトリミングしますか?

  3. 「でスクリプトを実行します。 」と「ソース」で?

  1. Notify-Send With Cronを使用していますか?

  2. 大きなファイルにSedとParallelを使用して、行を別のコンテンツに置き換えますか?

  3. Mcでワードラップを使用していますか?