Stiamo esaminando l'utilizzo di BtrFS su un array di dischi SSD e mi è stato chiesto di verificare che BtrFS esegua effettivamente operazioni TRIM dopo l'eliminazione di un file. Finora non sono stato in grado di verificare che il comando TRIM sia inviato ai dischi.
So che BtrFS non è considerato pronto per la produzione, ma a noi piace il limite, quindi lo sto testando. Il server è Ubuntu 11.04 versione a 64 bit del server (mkfs.btrfs versione 0.19). Ho installato il kernel Linux 3.0.0 poiché il log delle modifiche di BtrFS afferma che il TRIM di massa non è disponibile nel kernel fornito con Ubuntu 11.04 (2.6.38).
Ecco la mia metodologia di test (inizialmente adottata da http://andyduffell.com/techblog/?p=852 , con modifiche per lavorare con BtrFS):
- TRIM manualmente i dischi prima di iniziare:
for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
- Verifica che l'unità sia stata TRIMD:
./sectors.pl |grep + | tee sectors-$(date +%s)
- Partizionare l'unità:
fdisk /dev/sda
- Crea il file system:
mkfs.btrfs /dev/sda1
- Montare:
sudo mount -t btrfs -o ssd /dev/sda1 /mnt
- Crea un file:
dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
- Verifica che il file sia sul disco:
./sectors.pl | tee sectors-$(date +%s)
- Elimina il file di prova:
rm /mnt/testfile
- Verifica che il file di test sia TRIM dal disco:
./sectors.pl | tee sectors-$(date +%s)
- Verifica i blocchi TRIM:
diff
i duesectors-*
file più recenti
A questo punto, le verifiche pre-cancellazione e post-cancellazione mostrano ancora gli stessi blocchi disco in uso. Dovrei invece vedere una riduzione del numero di blocchi in uso. Attendere un'ora (nel caso in cui occorra un po 'di tempo prima che il comando TRIM venga emesso) dopo l'eliminazione del file di test mostra ancora gli stessi blocchi in uso.
Ho anche provato a montare con le -o ssd,discard
opzioni, ma questo non sembra aiutare affatto.
Partizione creata fdisk
dall'alto (mantengo piccola la partizione in modo che la verifica possa andare più veloce):
root@ubuntu:~# fdisk -l -u /dev/sda
Disk /dev/sda: 512.1 GB, 512110190592 bytes
255 heads, 63 sectors/track, 62260 cylinders, total 1000215216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6bb7542b
Device Boot Start End Blocks Id System
/dev/sda1 63 546209 273073+ 83 Linux
La mia sectors.pl
sceneggiatura (so che è inefficiente, ma fa il lavoro):
#!/usr/bin/perl -w
use strict;
my $device = '/dev/sda';
my $start = 0;
my $limit = 655360;
foreach ($start..$limit) {
printf "\n%6d ", $_ if !($_ % 50);
my @sector = `/sbin/hdparm --read-sector $_ $device`;
my $status = '.';
foreach my $line (@sector) {
chomp $line;
next if $line eq '';
next if $line =~ /$device/;
next if $line =~ /^reading sector/;
if ($line !~ /0000 0000 0000 0000 0000 0000 0000 0000/) {
$status = '+';
}
}
print $status;
}
print "\n";
La mia metodologia di test è difettosa? Mi sto perdendo qualcosa qui?
Grazie per l'aiuto.
sync
dopo aver rmming il file.
sync
dopo aver rimosso il file e i risultati erano sempre gli stessi. Lo ricontrollerò comunque quando tornerò in ufficio dopo il fine settimana.