GNU/Linux >> Tutoriales Linux >  >> Linux

Uso de TRIM y DISCARD con SSD conectados a controladores RAID

Los SSD ahora son comunes y han sido la opción predeterminada para discos orientados al rendimiento en entornos empresariales y de consumo durante los últimos años. Los SSD son geniales y rápidos, pero la mayoría de las personas en máquinas de gama alta se enfrentan a este dilema:mi SSD está detrás de un controlador RAID que no expone las capacidades DISCARD o TRIM del dispositivo. ¿Cómo descarto los bloques para mantener el mejor rendimiento de SSD? Aquí hay un truco para hacer precisamente eso sin tener que desarmar su máquina. Las mejoras recientes en el firmware de SSD han hecho que la necesidad de que las aplicaciones escriban en SSD sean menos estrictas para usar DISCARD/TRIM.

Hay, sin embargo, algunos casos en los que puede necesitar que el sistema de archivos informe a la unidad de los bloques que descartó. Tal vez tenga unidades TLC (3 bits por celda) o QLC (4 bits por celda) en lugar de las unidades SLC o MLC de clase empresarial, que suelen ser más caras (estas últimas son menos susceptibles a una caída del rendimiento ya que reservan más bloques adicionales para ayudar con sobrescribe cuando la unidad está al máximo de su capacidad). O tal vez una vez llenó su SSD al 100 % y ahora no puede recuperar el rendimiento/IOPS original.

En la mayoría de los sistemas, recuperar el rendimiento suele ser una simple cuestión de emitir un recorte del sistema de archivos (fstrim ) dominio. Aquí hay un ejemplo usando un sistema 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 ~]#

[ A los lectores también les gustó:Hardware de Linux:conversión a discos de estado sólido (SSD) en el escritorio ]

Sin embargo, hay una trampa...

Si sus SSD están detrás de un volumen RAID conectado a un controlador RAID (SmartArray de HPE, PERC de Dell o cualquier dispositivo basado en LSI/MegaRAID de Avago), esto es lo que sucede:

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

No es nada. Nada pasará. Al final de la cadena de E/S SCSI, las capacidades de un dispositivo se reducen al propio dispositivo y al controlador RAID al que está conectada la unidad.

Miremos más de cerca. Aquí hay una SSD (una unidad Samsung EVO 860 de 2 Tb) conectada a un conector SATA en un sistema RHEL (llamaremos a ese sistema System_A en el resto de este documento):

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

Aquí hay una unidad idéntica (mismo modelo, mismo firmware) detrás de un controlador RAID (un PERC H730P) en un sistema diferente (llamemos a ese sistema System_B en el resto de este documento):

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

¿Cómo sé que es el mismo disco? Gracias al uso de megaclisas-status, se puede consultar el RAID HBA. Muestra esto:

[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   

Sí, es la misma unidad (Samsung EVO 860) y el mismo firmware (3B6Q).

Usando lsblk , expondremos las capacidades de DESCARTE de esos dos dispositivos:

[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

Aquí está el culpable. Todos los valores son cero. El SSD en un RAID 0 detrás de un PERC H730P en System_B no expone ninguna capacidad de DESCARTE. Esta es la razón por la que fstrim en Sistema_B no hizo ni devolvió nada.

Los sistemas HPQ SmartArray se ven afectados de manera similar. Aquí hay un HPE DL360Gen10 con una tarjeta RAID SmartArray de gama alta:

[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

Todo basado en LSI (megaraid_sas controlador) y los sistemas basados ​​en SmartArray (controlador hpsa) sufren este problema. Si desea RECORTAR sus SSD, deberá apagar System_B , extraiga la unidad, conéctela a un sistema compatible con SAS/SATA y fstrim allí.

Afortunadamente para nosotros, hay un pequeño truco para exponer temporalmente las capacidades nativas de su dispositivo y RECORTARLO. Esto requiere desactivar la aplicación que usa su unidad RAID, pero al menos no requiere que camine hasta un centro de datos para extraer hardware de un sistema.

El truco es dejar de usar la unidad RAID a través del controlador RAID, exponer el SSD como un JBOD, volver a montar el sistema de archivos y luego RECORTARLO allí. Una vez que DESCARTE los bloques, simplemente vuelva a poner la unidad en modo RAID, monte el sistema de archivos y luego reinicie sus aplicaciones.

Hay un par de advertencias:

  • El hardware RAID que está utilizando debe permitir que los dispositivos se pongan en modo JBOD.
  • No puede hacer esto en su disco de arranque, ya que requeriría desactivar el sistema operativo.

Recorriendo el proceso

Este es un pequeño recorrido creado en un sistema con un Dell PERC H730P y un Samsung SSD. Llamaremos a este sistema System_C .

1) El SSD está en [32:2] en HBA a0 y crearemos una única unidad RAID 0 a partir de ella:

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

2) La nueva unidad lógica aparece como /dev/sdd y no muestra capacidades de DESCARTE:

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

3) A continuación, cree un grupo de volúmenes (VG), un volumen y un sistema de archivos 128G encima de ese dispositivo:

[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

Por el bien de esta demostración, copiaremos algunos datos a /mnt .

4) Deje de usar el sistema y exporte el grupo de volumen:

[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) Habilite el modo JBOD en el HBA:

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

Adapter 0: Set JBOD to Enable success.

Exit Code: 0x00

6) Elimine la unidad lógica y haga que la unidad sea JBOD. En la mayoría de los controladores RAID, las comprobaciones de seguridad le impiden crear un JBOD con una unidad que forma parte de un volumen lógico:

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

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

Exit Code: 0x01

La solución aquí es eliminar el volumen lógico. Esta es una operación lógica simple, y no tocará nuestros datos. Sin embargo, debe haber escrito el comando utilizado para crear la matriz RAID 0 en primer lugar.

[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) Actualice la vista del núcleo de los discos e importe sus datos:

[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

Hemos descartado los bloques vacíos en nuestro sistema de archivos. Pongámoslo de nuevo en una unidad lógica RAID 0.

8) umount el sistema de archivos y exportar el grupo de volúmenes:

[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) Desactive el modo JBOD en el controlador RAID:

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

Adapter 0: Set JBOD to Disable success.

Exit Code: 0x00

10) Vuelva a crear su unidad lógica:

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

11) Pida al kernel que pruebe los discos y vuelva a montar su sistema de archivos:

[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

Sus datos deberían estar allí y el rendimiento de su SSD debería volver a sus cifras originales.

[ Curso gratuito en línea:Descripción general técnica de Red Hat Enterprise Linux. ] 

Conclusión

Aquí hay algunas notas adicionales:

  • Este procedimiento debe tomarse con cautela y con una gran advertencia:NO realice esto a menos que esté seguro de que puede identificar unidades lógicas y JBOD en un sistema Linux.
  • Solo probé este procedimiento usando unidades lógicas RAID 0. Parece poco probable que funcione para otros tipos de RAID (5, 6, 1+0, etc.) ya que la estructura del sistema de archivos estará oculta para el sistema operativo Linux.
  • No realice este procedimiento sin copias de seguridad verificadas.

Linux
  1. Habilitar TRIM para SSD en Linux

  2. Eliminar archivos con rm usando find y xargs

  3. ¿Cómo rellenar un archivo con FF usando dd?

  4. Problemas relacionados con el uso de sort y comm

  5. ¿Es posible hacer que SSD TRIM (descartar) funcione en ext4 + LVM + software RAID en Linux?

Programar trabajos en Linux con el comando 'at'

Cómo:Programación orientada a objetos:más con clases y objetos

Cómo implementar una aplicación PHP con Nginx y MySQL usando Docker y Docker Compose

Usar Tailscale en Windows para conectarse en red más fácilmente con WSL2 y Visual Studio Code

busque y elimine archivos con espacio usando el comando de búsqueda en Linux

Usar find y tar con archivos con caracteres especiales en el nombre