GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden von TRIM und DISCARD mit SSDs, die an RAID-Controller angeschlossen sind

SSDs sind heute weit verbreitet und waren in den letzten Jahren die Standardwahl für leistungsorientierte Festplatten in Unternehmens- und Verbraucherumgebungen. SSDs sind cool und schnell, aber die meisten Leute auf High-End-Maschinen stehen vor diesem Dilemma:Meine SSD befindet sich hinter einem RAID-Controller, der die DISCARD- oder TRIM-Fähigkeiten des Geräts nicht offenlegt. Wie verwerfe ich die Blöcke, um die beste SSD-Leistung zu erhalten? Hier ist ein Trick, um genau das zu tun, ohne Ihre Maschine zerlegen zu müssen. Jüngste Verbesserungen in der SSD-Firmware haben dazu geführt, dass Anwendungen, die auf SSDs schreiben, weniger zwingend DISCARD/TRIM verwenden müssen.

Es gibt jedoch einige Fälle, in denen das Dateisystem das Laufwerk über die verworfenen Blöcke informieren muss. Vielleicht haben Sie TLC- (3 Bit pro Zelle) oder QLC- (4 Bit pro Zelle) Laufwerke anstelle der normalerweise teureren SLC- oder MLC-Laufwerke der Enterprise-Klasse (letztere sind weniger anfällig für einen Leistungsabfall, da sie mehr zusätzliche Blöcke zur Unterstützung beiseite legen). überschreibt, wenn das Laufwerk voll ist). Oder vielleicht haben Sie Ihre SSD einmal zu 100 % gefüllt, und jetzt können Sie die ursprüngliche Leistung/IOPS nicht mehr zurückerhalten.

Auf den meisten Systemen ist die Wiederherstellung der Leistung in der Regel eine einfache Angelegenheit, indem ein Dateisystem-Trim (fstrim ) Befehl. Hier ist ein Beispiel mit einem Red Hat Enterprise Linux (RHEL)-System:

[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 ~]#

[ Den Lesern gefiel auch:Linux-Hardware:Konvertieren in Solid-State-Disks (SSDs) auf dem Desktop ]

Es gibt jedoch einen Haken...

Wenn sich Ihre SSDs hinter einem RAID-Volume befinden, das an einen RAID-Controller angeschlossen ist (SmartArray von HPE, PERC von Dell oder irgendetwas, das auf MegaRAID von LSI/Avago basiert), passiert Folgendes:

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

Gar nichts. Nichts wird passieren. Am Ende der SCSI-E/A-Kette reduzieren sich die Fähigkeiten eines Geräts auf das Gerät selbst und den RAID-Treiber, an den Ihr Laufwerk angeschlossen ist.

Lasst uns genauer hinschauen. Hier ist eine SSD (ein Samsung EVO 860 2-TB-Laufwerk), die an einen SATA-Anschluss eines RHEL-Systems angeschlossen ist (wir nennen dieses System System_A im Rest dieses Dokuments):

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

Hier ist ein identisches Laufwerk (gleiches Modell, gleiche Firmware) hinter einem RAID-Controller (ein PERC H730P) auf einem anderen System (nennen wir dieses System System_B im Rest dieses Dokuments):

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

Woher weiß ich, dass es das gleiche Laufwerk ist? Dank der Verwendung von megaclisas-status, der RAID-HBA kann abgefragt werden. Es zeigt dies:

[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   

Ja, es ist das gleiche Laufwerk (Samsung EVO 860) und die gleiche Firmware (3B6Q).

Verwenden von lsblk , stellen wir die DISCARD-Fähigkeiten dieser beiden Geräte bereit:

[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

Hier ist der Übeltäter. Alle Werte sind Null. Die SSD in einem RAID 0 hinter einem PERC H730P auf System_B stellt keine DISCARD-Fähigkeiten zur Verfügung. Das ist der Grund, warum fstrim auf System_B nichts getan oder zurückgegeben.

HPQ SmartArray-Systeme sind auf ähnliche Weise betroffen. Hier ist ein HPE DL360Gen10 mit einer High-End-SmartArray-RAID-Karte:

[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

Alle LSI-basierten (megaraid_sas Treiber) und SmartArray-basierte (hpsa-Treiber) Systeme leiden unter diesem Problem. Wenn Sie Ihre SSDs trimmen möchten, müssen Sie System_B herunterfahren , ziehen Sie das Laufwerk heraus, verbinden Sie es mit einem SAS/SATA-fähigen System und fstrim dort.

Zum Glück für uns gibt es einen kleinen Trick, um die nativen Funktionen Ihres Geräts vorübergehend freizulegen und es zu TRIM. Dazu müssen Sie die Anwendung herunterfahren, die Ihr RAID-Laufwerk verwendet, aber zumindest müssen Sie nicht zu einem Rechenzentrum gehen, um Hardware aus einem System zu entfernen.

Der Trick besteht darin, die Verwendung des RAID-Laufwerks über den RAID-Treiber einzustellen, die SSD als JBOD verfügbar zu machen, das Dateisystem erneut zu mounten und es dann dort zu TRIM. Sobald die Blöcke verworfen wurden, versetzen Sie das Laufwerk einfach wieder in den RAID-Modus, mounten Sie das Dateisystem und starten Sie Ihre Anwendungen neu.

Es gibt ein paar Vorbehalte:

  • Die von Ihnen verwendete RAID-Hardware muss zulassen, dass Geräte in den JBOD-Modus versetzt werden.
  • Sie können dies nicht auf Ihrer Bootdiskette tun, da dies das Herunterfahren des Betriebssystems erfordern würde.

Gehen Sie durch den Prozess

Hier ist eine kleine Anleitung, die auf einem System mit einem Dell PERC H730P und einer Samsung SSD erstellt wurde. Wir nennen dieses System System_C .

1) Die SSD befindet sich bei [32:2] auf HBA a0 , und wir erstellen daraus ein einzelnes RAID 0-Laufwerk:

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

2) Das neue logische Laufwerk erscheint als /dev/sdd und zeigt keine DISCARD-Fähigkeiten:

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

3) Erstellen Sie als Nächstes eine Volumengruppe (VG), ein Volumen und ein 128G-Dateisystem auf diesem Gerät:

[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

Für diese Demonstration kopieren wir einige Daten nach /mnt .

4) Verwenden Sie das System nicht mehr und exportieren Sie die Datenträgergruppe:

[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) Aktivieren Sie den JBOD-Modus auf dem HBA:

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

Adapter 0: Set JBOD to Enable success.

Exit Code: 0x00

6) Löschen Sie das logische Laufwerk und machen Sie das Laufwerk zu JBOD. Bei den meisten RAID-Controllern hindern Sie Sicherheitsprüfungen daran, ein JBOD mit einem Laufwerk zu erstellen, das Teil eines logischen Volumes ist:

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

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

Exit Code: 0x01

Die Lösung besteht hier darin, das logische Volume zu löschen. Dies ist eine einfache logische Operation, die unsere Daten nicht berührt. Allerdings müssen Sie sich vorher den Befehl notiert haben, der zum Erstellen des RAID 0-Arrays verwendet wurde.

[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) Aktualisieren Sie die Ansicht des Kernels auf die Festplatten und importieren Sie Ihre Daten:

[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

Wir haben die leeren Blöcke in unserem Dateisystem verworfen. Legen wir es wieder in ein logisches RAID 0-Laufwerk.

8) umount das Dateisystem und exportieren Sie die Volumengruppe:

[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) Deaktivieren Sie den JBOD-Modus auf dem RAID-Controller:

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

Adapter 0: Set JBOD to Disable success.

Exit Code: 0x00

10) Erstellen Sie Ihr logisches Laufwerk neu:

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

11) Bitten Sie den Kernel, die Festplatten zu prüfen und Ihr Dateisystem neu zu mounten:

[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

Ihre Daten sollten da sein und die Leistung Ihrer SSD sollte wieder auf die ursprünglichen Werte zurückfallen.

[ Kostenloser Online-Kurs:Technischer Überblick zu Red Hat Enterprise Linux. ] 

Abschluss

Hier sind ein paar zusätzliche Hinweise:

  • Dieses Verfahren sollte mit Vorsicht und mit einer großen Warnung betrachtet werden:Führen Sie dies NICHT durch, es sei denn, Sie sind sicher, dass Sie logische Laufwerke und JBODs auf einem Linux-System identifizieren können.
  • Ich habe dieses Verfahren nur mit logischen RAID 0-Laufwerken getestet. Es scheint unwahrscheinlich, dass es für andere RAID-Typen (5, 6, 1+0 usw.) funktionieren würde, da die Struktur des Dateisystems vor dem Linux-Betriebssystem verborgen wird.
  • Bitte führen Sie dieses Verfahren nicht ohne verifizierte Sicherungen durch.

Linux
  1. Farben mit printf verwenden

  2. Suchen und entfernen Sie Dateien mit Leerzeichen mit dem Befehl find unter Linux

  3. Entfernen von Dateien mit rm unter Verwendung von find und xargs

  4. Verwendung von find und tar mit Dateien mit Sonderzeichen im Namen

  5. Probleme bei der Verwendung von sort und comm

Planen Sie Jobs in Linux mit dem Befehl 'at'

Gewusst wie:Objektorientierte Programmierung – Mehr mit Klassen und Objekten

So stellen Sie eine PHP-Anwendung mit Nginx und MySQL mit Docker und Docker Compose bereit

Verwenden von Tailscale unter Windows für eine einfachere Vernetzung mit WSL2 und Visual Studio Code

Wie fülle ich eine Datei mit FF mit dd auf?

Ist es möglich, SSD TRIM (discard) auf ext4 + LVM + Software-RAID unter Linux zum Laufen zu bringen?