Descarte en segundo plano en particiones de intercambio en Linux + SSD

11

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:

  1. 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
    
  2. 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()
    
  3. 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.

santisaez
fuente
44
¿Cuál es el punto de? La RAM es barata, ya que está probando adecuadamente al tener 32 grandes en su servidor. Desactiva Swap, usa tu SSD para algo útil y deja de molestar.
Tom O'Connor
3
El intercambio no se puede desactivar en esos servidores y tienen un disco SSD único, no hay opción para alojar la partición de intercambio en un HDD tradicional. Soy consciente de que poner el intercambio en un disco SSD no es la mejor opción, pero me preguntaba si puedo lograr el mismo comportamiento de "descarte" ext4 en las particiones de intercambio, para mejorar el rendimiento del disco tanto como sea posible.
santisaez
2
Esto REALMENTE suena como un caso de optimización prematura.
MikeyB
"Los comentarios solo pueden editarse durante 5 minutos": me sirve estar en SF mientras estoy en el trabajo ... como decía; @MikeyB En realidad, he estado leyendo sobre esto. El artículo de wikipedia menciona algo de lo que no estaba al tanto. "Debido a la naturaleza de la operación de la memoria flash, los datos no se pueden sobrescribir directamente como se puede en un disco duro". Por lo tanto, tendría sentido que los bloques utilizados anteriormente en el intercambio estuvieran vacíos ... pero ¿se verían como "0000" cuando santisaez verifique el contenido del intercambio?
Señal15
Todo eso sucede en una capa debajo del sistema operativo. En lo que respecta al sistema operativo, los datos en un bloque están allí hasta que se reescriben. Es responsabilidad del disco manejar el ciclo de lectura-borrado-escritura.
MikeyB

Respuestas:

1

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.

lav
fuente
Eso suena como un error.
kasperd
2
Puede que no sea un error. De esta forma, Linux puede descartar muchas páginas a la vez en lugar de hacerlo una por una.
lav
1

Podría ser que su sistema tenga --discard=oncepor defecto. ¿Has intentado montar con una opción de descarte específica?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

y forzando así:

# swapon --discard=pages /dev/sda2

También puede intentar hacer un fstrimservicio o configurarlo si ya está disponible.

kgizdov
fuente
-1

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.

El contenido del intercambio se descarta efectivamente "cuando swapon -sdevuelve" 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)

Señal15
fuente
55
Si discardse 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.
santisaez
Para ser claros, eso de hecho resultaría en leer solo ceros con ese comando hdparm, pero solo después de que el recolector de basura del SSD tuviera la oportunidad de ejecutarse ...
Halfgaar