Hola.
Quiero habilitar las operaciones de
TRIM/discard en background en particiones swap sobre discos SSD. Según varias referencias, por ejemplo
esta de Red Hat, Linux detecta que la partición swap está sobre un disco SSD y automáticamente hace el "discard". Pero tras hacer varias pruebas parece que NO funciona así, incluso forzando a montar la partición swap con el parámetro de "discard" en
/etc/fstab.
Estos son los pasos que estoy siguiendo para comprobar si el TRIM está funcionando:
- Comprobar que el SSD soporta las operaciones de TRIM y Linux detecta el disco como no-rotacional, todo OK:
Código:
# hdparm -I /dev/sda | grep TRIM
* Data Set Management TRIM supported (limit 1 block)
* Deterministic read data after TRIM
# cat /sys/block/sda/queue/rotational
0
- Montar la partición swap, vaciar todas las caches de la VM, poner vm.swappiness a 100 para que Linux sea más agresivo con el uso de swap y ejecutar un script que usa toda la memoria:
Código:
# swapon [--discard] /dev/sda2
# echo 3 > /proc/sys/vm/drop_caches
# echo 100 > /proc/sys/vm/swappiness
# ./fill-up-memory.up
El servidor tiene 32GB de memoria física y 2GB de swap, el script crea un objeto en memoria que ocupa ~34GB de memoria por lo que fuerza a usar y llenar la swap:
Código:
#!/usr/bin/python
mem = 33.8
testing = 'A' * int(1024 * 1024 * 1024 * mem)
raw_input()
- "swapon -s" indica que la swap está al 100% de uso. Utilizo "hdparm --read-sector" para ver el contenido de la swap y veo que todos los sectores están a "41 41", el código hexadecimal del carácter "A", lo que estaba escribiendo el script en memoria, hasta aquí todo según lo esperado.
Código:
#!/bin/bash
for sector in `seq 194560 4100095` ; do
hdparm --read-sector $sector /dev/sda
done
Cuando se para el script se libera toda la memoria, incluida la swap. A partir de aquí se supone que Linux debería hacer TRIM de los sectores que quedan vacíos, pero no llega a funcionar. Examinando el contenido de la swap con "hdparm --read-sector" el contenido sigue siendo "41 41" en lugar de "00 00", el esperado si el "discard" estaría funcionado.
Tras hacer varias pruebas he visto que solo se hace un "discard" inicial en toda la partición al hacer el swapon (al montar la partición por primera vez) solo si la opción "discard" está puesta en el /etc/fstab, pero nunca se mandan TRIMs en background. Esto sería lo deseable para evitar el problema de
write-amplification, aunque sea una pequeña parte del disco SSD.
¿Alguien se ha encontrado con este problema con swap sobre discos SSD?
NOTA: he hecho esta misma pregunta en ServerFault.com, el post incluye algún detalle adicional como un pequeño análisis de la parte de código que se encarga de esta parte:
http://serverfault.com/q/530652
Saludos,