Scarto in background su partizioni di swap su Linux + SSD


11

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:

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


4
Qual e il punto? La RAM è economica, come stai dimostrando adeguatamente avendo 32 grandi nel tuo server. Disattiva Swap, usa il tuo SSD per qualcosa di utile e smetti di usare il bitfricking.
Tom O'Connor,

3
Lo swap non può essere disabilitato su quei server e hanno un unico disco SSD, non c'è alcuna opzione per ospitare la partizione di swap su un HDD tradizionale. Sono consapevole che mettere lo swap su un disco SSD non è l'opzione migliore, ma mi chiedevo se posso ottenere lo stesso comportamento ext4 "scarta" sulle partizioni di swap, per migliorare il più possibile le prestazioni del disco.
santisaez,

2
Sembra davvero un caso di ottimizzazione prematura.
MikeyB,

"I commenti possono essere modificati solo per 5 minuti" - mi fa bene essere su SF mentre sono al lavoro .... come stavo dicendo; @MikeyB In realtà, ho letto su questo. L'articolo di Wikipedia ha menzionato qualcosa di cui non ero a conoscenza. "A causa della natura del funzionamento della memoria flash, i dati non possono essere sovrascritti direttamente come in un disco rigido." Quindi avrebbe senso che i blocchi precedentemente utilizzati in swap sarebbero vuoti .... ma sembrerebbero "0000" quando santisaez controlla il contenuto dello swap?
Signal15,

Tutto ciò accade a un livello inferiore al sistema operativo. Per quanto riguarda il sistema operativo, i dati su un blocco sono lì fino a quando non vengono riscritti. È responsabilità dell'unità guidare il ciclo di lettura-cancellazione-scrittura.
MikeyB,

Risposte:


1

Sembra che discard_swap_cluster sia chiamato solo da scan_swap_map che a sua volta viene chiamato da get_swap_page o get_swap_page_of_type . Quindi, se ho ragione, lo scarto si verifica solo quando verrà allocata una nuova pagina di scambio, non quando viene liberata una pagina.


Sembra un bug.
Kasperd,

2
Potrebbe non essere un bug. In questo modo Linux può scartare molte pagine contemporaneamente invece di farlo una per una.
lav

1

Potrebbe essere che il tuo sistema abbia --discard=oncecome impostazione predefinita. Hai provato a montare con un'opzione di eliminazione specifica?

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

e forzando in questo modo:

# swapon --discard=pages /dev/sda2

Puoi anche provare a creare un fstrimservizio o configurarlo se è già disponibile.


-1

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.

Il contenuto di swap viene effettivamente "scartato" quando swapon -srestituisce "no swap used". Il sistema non sovrascriverà il contenuto dei blocchi (riempito con "4141") perché è un SSD e scritture eccessive ridurrebbero la durata del SSD. (Almeno, questo è ciò che tolgo dalla documentazione)


5
Se discardsi utilizza l'opzione mount, i comandi TRIM devono essere inviati all'unità a stato solido sottostante per evitare problemi di amplificazione in scrittura sui dischi SSD. Almeno, questo è il modo in cui altri filesystem, come ext4.
santisaez,

Per essere chiari, ciò significherebbe in effetti leggere solo zero con quel comando hdparm, ma solo dopo che il garbage collector dell'SSD ha avuto la possibilità di correre ..
Halfgaar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.