Wir prüfen die Verwendung von BtrFS auf einem Array von SSD-Festplatten und wurden gebeten zu überprüfen, ob BtrFS beim Löschen einer Datei tatsächlich TRIM-Vorgänge ausführt. Bisher konnte ich nicht überprüfen, ob der TRIM-Befehl an die Datenträger gesendet wurde.
Ich weiß, dass BtrFS nicht als produktionsbereit gilt, aber wir mögen die neuesten Entwicklungen, deshalb teste ich es. Der Server ist die 64-Bit-Version des Ubuntu 11.04-Servers (mkfs.btrfs Version 0.19). Ich habe den Linux 3.0.0-Kernel installiert, da das BtrFS-Changelog angibt, dass Bulk-TRIM im mit Ubuntu 11.04 (2.6.38) gelieferten Kernel nicht verfügbar ist.
Hier ist meine Testmethode (ursprünglich von http://andyduffell.com/techblog/?p=852 übernommen , mit Änderungen für die Arbeit mit BtrFS):
- TRIMMEN Sie die Festplatten manuell, bevor Sie beginnen:
for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
- Vergewissern Sie sich, dass das Laufwerk auf TRIM eingestellt ist:
./sectors.pl |grep + | tee sectors-$(date +%s)
- Partitionieren Sie das Laufwerk:
fdisk /dev/sda
- Machen Sie das Dateisystem:
mkfs.btrfs /dev/sda1
- Montieren:
sudo mount -t btrfs -o ssd /dev/sda1 /mnt
- Erstellen Sie eine Datei:
dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
- Stellen Sie sicher, dass sich die Datei auf dem Datenträger befindet:
./sectors.pl | tee sectors-$(date +%s)
- Löschen Sie die Testdatei:
rm /mnt/testfile
- Stellen Sie sicher, dass die Testdatei von der Festplatte abgeschnitten wurde:
./sectors.pl | tee sectors-$(date +%s)
- Überprüfen Sie die TRIM-Blöcke:
diff
die beiden neuestensectors-*
Dateien
Zu diesem Zeitpunkt zeigen die Überprüfungen vor und nach dem Löschen immer noch dieselben verwendeten Plattenblöcke an. Ich sollte stattdessen eine Reduzierung der Anzahl der verwendeten Blöcke sehen. Warten Sie eine Stunde (falls es eine Weile dauert, bis der TRIM-Befehl ausgegeben wird), nachdem die Testdatei gelöscht wurde, werden immer noch dieselben Blöcke verwendet.
Ich habe auch versucht, mit den -o ssd,discard
Optionen zu montieren, aber das scheint überhaupt nicht zu helfen.
Partition, die von fdisk
oben erstellt wurde (ich halte die Partition klein, damit die Überprüfung schneller gehen kann):
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
Mein sectors.pl
Skript (ich weiß, dass dies ineffizient ist, aber es erledigt die Arbeit):
#!/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";
Ist meine Testmethode fehlerhaft? Vermisse ich hier etwas?
Danke für die Hilfe.
sync
nach dem Rmmlen der Datei eine auszuführen.
sync
nach dem Entfernen der Datei eine auszuführen und die Ergebnisse immer noch die gleichen waren. Ich werde das noch einmal überprüfen, wenn ich nach dem Wochenende wieder im Büro bin.