Condividi tramite


La nuova API consente alle app di inviare hint "TRIM e Unmap" ai supporti di archiviazione

Piattaforme

client - Windows 8
Server - Windows Server 2012

Descrizione

Gli hint TRIM notificano all'unità che determinati settori che in precedenza sono stati allocati non sono più necessari per l'app e possono essere eliminati. Questo viene in genere usato quando un'app effettua allocazioni di spazio di grandi dimensioni tramite un file e quindi gestisce automaticamente le allocazioni al file (ad esempio, file del disco rigido virtuale).

Che cos'è TRIM?

Le unità SSD (Solid State Drive) sono in genere dispositivi in memoria flash cancellati; Ciò significa che quando i dati vengono scritti nell'unità SSD, non possono essere sovrascritto sul posto e devono essere scritti altrove finché il blocco non può essere sottoposto a Garbage Collection. Poiché l'unità SSD non ha alcun meccanismo interno per determinare che determinati blocchi vengono rimossi e altri sono necessari. L'unica volta che l'unità SSD può contrassegnare un settore "dirty" è quando viene sovrascritto. In altri casi, ad esempio quando un file viene eliminato, l'unità SSD mantiene questi settori perché l'eliminazione viene eseguita solo come tabella di file master (MFT) e non come operazione per tutti i settori del file. In Windows 7 è stato introdotto un modo standard per comunicare con unità SSD sui settori che non sono più necessari. Questo comando è definito nella specifica T13 come comando TRIM; NTFS invia il comando TRIM per alcune normali operazioni inline, ad esempio "deletefile".

Altri usi di TRIM nel mondo di archiviazione

Come le unità SSD, le reti di archiviazione (SAN) e le nuove implementazioni di Spazi software di Windows 8 usano hint per i comandi TRIM per gestire gli spazi in ambienti con thin provisioning. Le reti SAN e Spazi software allocano aree di archiviazione di dimensioni maggiori di settori o cluster (da 1 MB a 1 GB). Quando ricevono hint TRIM per le dimensioni di allocazione (o maggiori delle dimensioni di allocazione), la san/ssd può de-allocare un'area per liberare spazio per altri file. In genere passano tutti gli hint TRIM al supporto sottostante (SSD o HDD) in modo che possano utilizzare lo spazio liberato in base alle esigenze. In genere non spostano i dati in aree di deallocamento, né tengono traccia delle aree TRIM alle aree deallocate (quando l'area è vuota).

Le san san con thin provisioning usano gli hint TRIM passati per ridurre il footprint complessivo dell'archiviazione fisica, riducendo quindi i costi. La specifica SCSI T10 definisce il comando "Unmap" (simile al comando TRIM); in questo caso il comando è applicabile a tutti i tipi di archiviazione, inclusi dischi RIGIDI, unità SSD e altri. Il comando UnMap consente di rimuovere blocchi fisici dall'allocazione della rete SAN.

Come usare la nuova API

#define FSCTL_FILE_LEVEL_TRIM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 130, METHOD_BUFFERED, FILE_WRITE_DATA)

Where 
typedef struct _EXTENT_PAIR {
    ULONGLONG Offset;
    ULONGLONG Length;
} EXTENT_PAIR, *PEXTENT_PAIR;

typedef struct _FILE_LEVEL_TRIM {
    //
    // A count of how many Offset:Length pairs are given
    //
    DWORD PairCount;
    //
    // All the pairs.
    //
    EXTENT_PAIR Pairs[1];
} FILE_LEVEL_TRIM, *PFILE_LEVEL_TRIM;

Il file TRIM viene passato tramite il buffer, se possibile o asincrono (non memorizzato nel buffer) al comando DSM IOCTL del dispositivo TRIM. Viene eseguito il mapping al comando TRIM per i dispositivi ATA e il comando UnMap per i dispositivi SCSI. Il codice TRIM del file invia le aree una alla volta, come specificato dagli extent precedenti.

Il file TRIM non attende i ritorni dal dispositivo, perché i comandi TRIM e Unmap sono definiti come hint per il supporto di archiviazione sottostante e i codici restituiti non sono previsti.

flusso di lavoro end-to-end :

  1. Call File Trim
    1. File TRIM esamina gli input per individuare gli errori
    2. File TRIM suddivide gli extent nelle aree LCN
    3. Il file TRIM arrotonda verso l'alto e verso il basso per le aree allineate in modo non allineato che vengono passate in TRIM
    4. Il file TRIM elimina le voci nella cache correlate alle aree TRIM
    5. Il file TRIM passa IOCTL_DSM (Trim) per area
  2. File TRIM restituisce o errori
    1. Il controllo degli errori viene eseguito alla validità dell'input
    2. Se solo alcuni extent sono validi, viene restituito un errore per la chiamata API completa

casi d'uso

disco rigido virtuale consumer montato in un'unità SSD:

Il disco rigido virtuale viene inizialmente montato su supporti inutilizzati "puliti". Quando viene usato il disco rigido virtuale, il disco rigido virtuale utilizza parti del supporto di archiviazione per i file e così via. Quando elimina i file nel supporto di archiviazione, questi file non vengono rimossi dall'unità SSD perché il disco rigido virtuale completo viene archiviato come file nell'unità SSD. L'ambiente Hyper-V chiama File TRIM per tutte le aree eliminate quando si verifica l'eliminazione di file nell'ambiente VHD. Il File_TRIMs viene convertito nell'unità SSD in modo che le prestazioni dell'unità SSD possano essere ottimizzate.

VHD consumer montato in una san con thin provisioning:

Il disco rigido virtuale viene inizialmente montato su una lastra minima di un ambiente con thin provisioning. Man mano che i file vengono archiviati nel disco rigido virtuale, il footprint di archiviazione del disco rigido virtuale aumenta in multipli di lastre. Quando i file vengono rimossi nel disco rigido virtuale, il Hyper-V chiama File_TRIM alla SAN con thin provisioning sottostante. Se le macchine virtuali sono maggiori della granularità SLAB, la san può ora rimuovere un SLAB e quindi ridurre il footprint del disco rigido virtuale in tale SAN.

Se il disco rigido virtuale si trova in un server basato su Windows 8, Storage Optimizer invierà anche le macchine virtuali per ridurre il footprint della lastra del disco rigido virtuale dall'interno del disco rigido virtuale montato.

Test

Non esistono API confrontabili nelle versioni precedenti del sistema operativo. Non dovrebbe esserci alcun impatto sulle prestazioni dell'API effettiva, anche se il supporto di archiviazione (se implementato correttamente) può mostrare prestazioni di scrittura migliori. L'API deve essere usata con molta attenzione; solo gli extent che non sono più necessari devono essere passati perché tali extent verranno rimossi definitivamente dal supporto di archiviazione.

Risorse