Uso de TRIM y DISCARD con SSD conectados a controladores RAID

Los SSD ahora son comunes y han sido la opción predeterminada para unidades orientadas al rendimiento en entornos comerciales y de consumo durante los últimos años. Los SSD son geniales y rápidos, pero la mayoría de los usuarios de máquinas de gama alta enfrentan este dilema: mi SSD está detrás de un controlador RAID que no expone las capacidades DISCARD o TRIM del dispositivo. ¿Cómo eliminar bloques para mantener el mejor rendimiento de SSD? Aquí tienes un truco para hacerlo sin tener que desmontar tu máquina. Las mejoras recientes en el firmware de SSD han hecho que la necesidad de que las aplicaciones escriban en SSD sea menos estricta para usar DISCARD/TRIM.

En algunos casos, sin embargo, es posible que deba indicarle al sistema de archivos que notifique a la unidad qué bloques ha eliminado. 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 generalmente más costosas (es menos probable que estas últimas experimenten una caída en el rendimiento porque reservan más bloques para ayudarlo con las sobrescrituras cuando la unidad está a plena capacidad). O tal vez ya llenó su SSD al 100% y ahora no puede recuperar el rendimiento / IOPS original.

En la mayoría de los sistemas, restaurar el rendimiento suele ser una simple cuestión de editar un recorte del sistema de archivos (fstrim) ordenó. Aquí hay un ejemplo usando un sistema Red Hat Enterprise Linux (RHEL):

[[email protected]_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
[[email protected]_A ~]#

Sin embargo, hay una condición ...

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

[[email protected]_B ~]# fstrim -av
[[email protected]_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 un SSD (una unidad Samsung EVO 860 de 2 TB) conectado a un conector SATA en un sistema RHEL (llamaremos a este sistema Sistema_A en el resto de este documento):

[[email protected]_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 este sistema Sistema_B en el resto de este documento):

[[email protected]_B ~]# lsscsi 
[0:2:0:0]    disk    DELL     PERC H730P Adp   4.30  /dev/sda 

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

[[email protected]_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 el mismo reproductor (Samsung EVO 860) y el mismo firmware (3B6Q).

Utilizando lsblk, expondremos las capacidades de DESCARTE de estos dos dispositivos:

[[email protected]_A ~]# lsblk -dD
NAME     DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda             0      512B       2G         1
[[email protected]_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 RAID 0 detrás de un PERC H730P en Sistema_B no expone ninguna capacidad de DESCARTE. Esta es la razón porque fstrim a Sistema_B no hizo nada ni rindió nada.

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

[[email protected] ~]# 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 Los sistemas SmartArray (controlador hpsa) y SmartArray (controlador hpsa) sufren este problema. Si desea RECORTAR sus SSD, deberá detenerse Sistema_B, extraiga la unidad, conéctela a un sistema compatible con SAS/SATA y fstrim el.

Por suerte para nosotros, hay un pequeño truco para exponer temporalmente las capacidades nativas y TRIM de su dispositivo. Esto requiere eliminar la aplicación que usa su unidad RAID, pero al menos no requiere que vaya a un centro de datos para eliminar el hardware de un sistema.

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

Hay algunas advertencias:

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

Recorra el proceso

Aquí hay una pequeña presentación creada en un sistema con un Dell PERC H730P y un Samsung SSD. Llamaremos a este sistema Sistema_C.

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

[[email protected]_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 ninguna capacidad de DESCARTE:

[[email protected]_C ~]# lsblk -dD
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
[....]
sdd         0        0B       0B         0

3) Luego cree un grupo de volúmenes (VG), un volumen y un sistema de archivos 128G encima de este dispositivo:

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

A los efectos de esta demostración, copiaremos algunos datos en /mnt.

4) Deje de usar el sistema y exporte el grupo de volúmenes:

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

5) Habilite el modo JBOD en el HBA:

[[email protected]_C ~]# MegaCli -AdpSetProp -EnableJBOD -1 -a0

Adapter 0: Set JBOD to Enable success.

Exit Code: 0x00

6) Elimine la unidad lógica y cree la unidad 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:

[[email protected]_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 afectará a nuestros datos. Sin embargo, primero debe haber escrito el comando utilizado para crear la matriz RAID 0.

[[email protected]_C ~]# MegaCli -CfgLdDel -L3 -a0
                                     
Adapter 0: Deleted Virtual Drive-3(target id-3)

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

Exit Code: 0x00

7) Actualice la vista de discos del kernel e importe sus datos:

[[email protected]_C ~]# partprobe
[[email protected]_C ~]# vgscan 
  Reading volume groups from cache.
  Found exported volume group "testdg" using metadata type lvm2
  Found volume group "rootdg" using metadata type lvm2

[[email protected]_C ~]# vgimport testdg
  Volume group "testdg" successfully imported

[[email protected]_C ~]# vgchange -a y testdg
  1 logical volume(s) in volume group "testdg" now active

[[email protected]_C ~]# mount /dev/testdg/lv_test /mnt

[[email protected]_C ~]# fstrim -v /mnt
/mnt: 125.5 GiB (134734139392 bytes) trimmed

Hemos eliminado bloques vacíos de 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:

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

9) Deshabilite el modo JBOD en el controlador RAID:

[[email protected]_C ~]# MegaCli -AdpSetProp -EnableJBOD -0 -a0

Adapter 0: Set JBOD to Disable success.

Exit Code: 0x00

10) Vuelva a crear su unidad lógica:

[[email protected]_C ~]# MegaCli -CfgLdAdd -r0 [32:2] WB RA CACHED -strpsz 512 -a0

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

[[email protected]_C ~]# partprobe
[[email protected]_C ~]# vgscan 
  Reading volume groups from cache.
  Found exported volume group "testdg" using metadata type lvm2
  Found volume group "rootdg" using metadata type lvm2

[[email protected]_C ~]# vgimport testdg
  Volume group "testdg" successfully imported

[[email protected]_C ~]# vgchange -a y testdg
  1 logical volume(s) in volume group "testdg" now active

[[email protected]_C ~]# mount /dev/testdg/lv_test /mnt

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

Índice

Envoltura

Aquí hay algunas notas adicionales:

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

Artículos de interés

Subir