Problema
Quiero habilitar las operaciones TRIM en segundo plano en una partición de intercambio dentro de un disco SSD en Linux. Según varios artículos, por ejemplo, este , el núcleo detecta esta configuración y realiza automáticamente las operaciones de descarte, pero en mis pruebas parece que no funciona, aunque la opción de montaje "descartar" se utiliza para forzar este comportamiento.
Guión
- Debian Wheezy con Linux 3.2.0
- Disco SSD: 1 x 120GB OCZ Vertex 3 MI
- Partición “simple” de intercambio de 2GB, sin otras capas (LVM, RAID, etc.)
Antecedentes
Estos son los pasos que sigo para verificar si TRIM en segundo plano funciona en la partición de intercambio:
Soporte TRIM : verifique si el disco SSD admite comandos TRIM y el núcleo marca el dispositivo como no rotativo:
# 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
Intercambio de relleno : monte la partición, limpie todos los cachés de VM y configure Linux para intercambiar agresivamente estableciendo vm.swappiness en 100. Luego, ejecute un script que asigne toda la memoria disponible y obligue al núcleo a comenzar a intercambiar:
# swapon [--discard] /dev/sda2 # echo 3 > /proc/sys/vm/drop_caches # echo 100 > /proc/sys/vm/swappiness # ./fill-up-memory.up
El script ejecuta un servidor con 32 GB de memoria física + 2 GB de partición de intercambio y crea un objeto de ~ 33.8 GB en la memoria, eso es suficiente para llenar toda la memoria y comenzar a intercambiar. Este es un ejemplo de un script que logra este comportamiento:
#!/usr/bin/python mem = 33.8 testing = 'A' * int(1024 * 1024 * 1024 * mem) raw_input()
Verifique el contenido de intercambio : “swapon -s” muestra que se utiliza el 100% de la memoria de intercambio. Utilizando "hdparm --read-sector" compruebo el contenido sin procesar de los sectores de partición de intercambio y todos los bytes están configurados en "4141", la notación hexadecimal correspondiente para el carácter "A", todo funciona como se esperaba. Este es un script de ejemplo para leer sector por sector el contenido de la partición de intercambio:
#!/bin/bash for sector in `seq 194560 4100095` ; do hdparm --read-sector $sector /dev/sda done
NOTA: puede obtener el sector de inicio / finalización de la partición de intercambio utilizando parted, cfdisk, etc.
Cuando detengo el script, libera toda la memoria, incluidas las asignaciones de intercambio, "swapon -s" no devuelve ningún uso de intercambio en el sistema. En este punto, se espera que Linux comience a descartar el contenido de la partición de intercambio en segundo plano, pero no funciona , el contenido de los sectores sigue siendo "4141", incluso varias horas después.
He realizado varias pruebas y parece que Linux solo realiza un descarte completo cuando la partición se habilita mediante una swapon()
llamada al sistema, pero nunca en segundo plano, aunque las opciones de montaje "descartar" están habilitadas en / etc / fstab.
Investigación adicional: blkdev_issue_discard () es la función del núcleo encargada de enviar comandos TRIM a los dispositivos SSD subyacentes, hay dos referencias únicas a esta función en mm/swapfile.c
:
discard_swap()
se llama durante el proceso swapon (), si la opción de montaje "descartar" está habilitada, descarta todo el contenido, esto funciona como se esperaba.discard_swap_cluster()
debería descartar el contenido de un intercambio de clúster, pero parece que nunca realiza un comando TRIM.
Pregunta: ¿cuál es el comportamiento esperado de Linux en dispositivos swap + SSD? ¿Debería descartar todos los sectores / páginas libres o solo emitir un descarte completo inicial cuando la partición se habilita durante el proceso de arranque? Gracias.
Respuestas:
Parece que discard_swap_cluster solo se llama desde scan_swap_map, que a su vez se llama desde get_swap_page o get_swap_page_of_type . Entonces, si estoy en lo correcto, el descarte solo ocurre cuando se va a asignar una nueva página de intercambio, no cuando se libera una página.
fuente
Podría ser que su sistema tenga
--discard=once
por defecto. ¿Has intentado montar con una opción de descarte específica?y forzando así:
# swapon --discard=pages /dev/sda2
También puede intentar hacer un
fstrim
servicio o configurarlo si ya está disponible.fuente
El contenido del intercambio se descarta efectivamente "cuando
swapon -s
devuelve" no se utiliza el intercambio ". El sistema no va a sobrescribir el contenido de los bloques (rellenado con" 4141 ") porque es un SSD y las escrituras excesivas acortarían la vida útil del SSD. (Al menos, eso es lo que quito de la documentación)fuente
discard
se utiliza la opción de montaje, los comandos TRIM deben enviarse a la unidad de estado sólido subyacente para evitar problemas de amplificación de escritura en discos SSD. Al menos, esta es la forma en que otros sistemas de archivos, como ext4.