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など)で機能する可能性は低いようです。
- 検証済みのバックアップなしでこの手順を実行しないでください。