Problema
Voglio abilitare le operazioni TRIM in background su una partizione di swap all'interno di un disco SSD su Linux. Secondo diversi articoli, ad esempio questo , il kernel rileva questa configurazione ed esegue automaticamente le operazioni di scarto, ma sui miei test sembra che non funzioni sebbene l'opzione di montaggio "scarta" sia usata per forzare questo comportamento.
Scenario
- Debian Wheezy con Linux 3.2.0
- Disco SSD: 1 x 120 GB OCZ Vertex 3 MI
- Scambio di 2 GB "semplice" partizione, senza altri livelli (LVM, RAID, ecc.)
sfondo
Questi sono i passaggi che seguo per verificare se TRIM in background funziona sulla partizione di swap:
Supporto TRIM : controlla se il disco SSD supporta i comandi TRIM e il kernel contrassegna il dispositivo come non rotazionale:
# 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
Scambia riempimento : monta la partizione, pulisce tutte le cache VM e configura Linux per scambiare in modo aggressivo l'impostazione vm.swappiness su 100. Quindi, esegui uno script che alloca tutta la memoria disponibile e imponga al kernel di iniziare lo scambio:
# swapon [--discard] /dev/sda2 # echo 3 > /proc/sys/vm/drop_caches # echo 100 > /proc/sys/vm/swappiness # ./fill-up-memory.up
Lo script esegue un server on con 32 GB di memoria fisica + 2 GB di partizione di swap e crea un oggetto di ~ 33,8 GB in memoria, sufficiente per riempire tutta la memoria e iniziare a scambiare. Questo è un esempio di uno script che ottiene questo comportamento:
#!/usr/bin/python mem = 33.8 testing = 'A' * int(1024 * 1024 * 1024 * mem) raw_input()
Controlla il contenuto dello swap : "swapon -s" indica che viene utilizzato il 100% della memoria di swap. Usando "hdparm --read-sector" controllo il contenuto non elaborato dei settori della partizione di swap e tutti i byte sono impostati su "4141", la corrispondente notazione esadecimale per il carattere "A", tutto funziona come previsto. Questo è uno script di esempio per leggere settore per settore il contenuto della partizione di swap:
#!/bin/bash for sector in `seq 194560 4100095` ; do hdparm --read-sector $sector /dev/sda done
NOTA: è possibile ottenere il settore iniziale / finale della partizione di swap utilizzando parted, cfdisk, ecc.
Quando interrompo lo script rilascia tutta la memoria comprese le allocazioni di swap, "swapon -s" non restituisce alcun utilizzo di swap nel sistema. A questo punto, si prevede che Linux inizi a scartare il contenuto della partizione di swap in background, ma non funziona , il contenuto dei settori è ancora "4141", anche diverse ore dopo.
Ho fatto diversi test e sembra che Linux esegua uno scarto completo solo quando la partizione è abilitata usando la swapon()
chiamata di sistema, ma mai in background, anche se le opzioni di montaggio "discard" sono abilitate su / etc / fstab.
Ulteriori ricerche: blkdev_issue_discard () è la funzione del kernel incaricata di inviare comandi TRIM ai dispositivi SSD sottostanti, ci sono due riferimenti unici a questa funzione su mm/swapfile.c
:
discard_swap()
viene chiamato durante il processo di swapon (), se l'opzione di montaggio "discard" è abilitata, scarta tutto il contenuto, funziona come previsto.discard_swap_cluster()
dovrebbe scartare il contenuto di uno scambio di cluster, ma sembra che non esegua mai un comando TRIM.
Domanda: qual è il comportamento previsto di Linux su dispositivi swap + SSD? Dovrebbe eliminare tutti i settori / pagine liberi o emettere uno scarto completo iniziale solo quando la partizione è abilitata durante il processo di avvio? Grazie.