Überprüfen Sie die TRIM-Unterstützung mit BtrFS auf der SSD

21

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: diffdie beiden neuesten sectors-*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,discardOptionen zu montieren, aber das scheint überhaupt nicht zu helfen.

Partition, die von fdiskoben 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.plSkript (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.

Shane Meyers
quelle
1
Ich unterstütze das Testen von hochaktuellen Dingen voll und ganz, aber nur damit Sie wissen, dass btrfs derzeit kein Fsck hat, das tatsächlich Dinge behebt: btrfs.wiki.kernel.org/index.php/Main_Page - also achte nur darauf.
Matt Simmons
@Matt - Guter Punkt zum fehlenden fsck. Meines Wissens nach sollte die erste Version eines fsck in den nächsten Wochen ausgeliefert werden, sodass wir über die Zeit, in der wir dieses Produkt in die Produktion verlagern, informiert sein sollten. Darüber hinaus verfügen wir über mehrere Kopien unserer Daten. Wenn wir also eine Kopie verlieren, müssen mindestens zwei weitere Kopien wiederhergestellt werden. Ich stimme jedoch voll und ganz zu, dass dies derzeit nicht das Dateisystem für Benutzer mit unersetzbaren Daten ist.
Shane Meyers
1
Wahrscheinlich ändert sich nichts, aber Sie können auch versuchen, syncnach dem Rmmlen der Datei eine auszuführen.
Zebediah49
Ich möchte sagen, dass ich versucht habe, syncnach 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.
Shane Meyers
Wenn es Ihnen nichts ausmacht, haben Sie an zfsonlinux.org gedacht ? Natives (dh im Kernel, nicht in Fuse) ZFS für Linux. sie sind in der Nähe einer offiziellen „Release“ und haben RCs zur Verfügung (darunter ein PPA für Ubuntu - leicht genug für debian wieder aufbauen zu)
cas

Antworten:

4

Nachdem ich viele Tage daran gearbeitet hatte, konnte ich zeigen, dass BtrFS TRIM verwendet. Ich konnte TRIM nicht erfolgreich auf dem Server ausführen, auf dem diese SSDs bereitgestellt werden sollen. Wenn Sie jedoch mit demselben Laufwerk testen, das an einen Laptop angeschlossen ist, sind die Tests erfolgreich.

Für all diese Tests verwendete Hardware:

  • Entscheidend m4 SSD 512 GB
  • HP DL160se G6
  • LSI LSISAS9200-8e HBA
  • generisches SAS-Gehäuse
  • Dell XPS m1210 Laptop

Nach vielen fehlgeschlagenen Versuchen, BtrFS auf dem Server zu überprüfen, habe ich beschlossen, denselben Test mit einem alten Laptop durchzuführen (entfernen Sie die RAID-Kartenschicht). Die ersten Versuche dieses Tests mit Ext4 und BtrFS auf dem Laptop schlagen fehl (Daten nicht TRIM'd).

Anschließend habe ich die Firmware des SSD-Laufwerks von Version 0001 (im Auslieferungszustand) auf Version 0009 aktualisiert. Die Tests wurden mit Ext4 und BtrFS wiederholt, und beide Dateisysteme haben die Daten erfolgreich TRIMMEN lassen.

Um sicherzustellen, dass der TRIM-Befehl ausgeführt werden konnte, habe ich rm /mnt/testfile && sync && sleep 120vor der Validierung eine ausgeführt.

Eine Sache, die Sie beachten sollten, wenn Sie denselben Test versuchen: SSDs haben Löschblöcke, mit denen sie arbeiten (ich kenne die Größe der Crucial m4-Löschblöcke nicht). Wenn das Dateisystem den Befehl TRIM an das Laufwerk sendet, löscht das Laufwerk nur einen vollständigen Block. Wenn der TRIM-Befehl für einen Teil eines Blocks angegeben wird, wird dieser Block aufgrund der verbleibenden gültigen Daten im Löschblock nicht TRIM-fähig.

Also um zu demonstrieren, wovon ich spreche (Ausgabe des sectors.plobigen Skripts). Dies ist mit der Testdatei auf der SSD. Perioden sind Sektoren, die nur Nullen enthalten. Pluszeichen haben ein oder mehrere Bytes ungleich Null.

Testdatei auf Laufwerk:

24600 .......................................+++++++++++
24650 ++++++++++++++++++++++++++++++++++++++++++++++++++
24700 ++++++++++++++++++++++++++++++++++++++++++++++++++
    -- cut --
34750 ++++++++++++++++++++++++++++++++++++++++++++++++++
34800 ++++++++++++++++++++++++++++++++++++++++++++++++++
34850 +++++++++++++++++++++++++++++.....................

Testdatei vom Laufwerk gelöscht (nach a sync && sleep 120):

24600 .......................................+..........
24650 ..................................................
24700 ..................................................
    -- cut --
34750 ..................................................
34800 ..................................................
34850 ......................+++++++.....................

Es scheint, dass sich der erste und der letzte Sektor der Datei innerhalb eines anderen Löschblocks als der Rest der Datei befinden. Daher blieben einige Sektoren unberührt.

Dies ist ein Hinweis: Einige Ext4 TRIM-Testanweisungen fordern den Benutzer auf, nur zu überprüfen, ob der erste Sektor aus der Datei TRIM-bearbeitet wurde. Der Tester sollte einen größeren Teil der Testdatei anzeigen, um wirklich zu sehen, ob das TRIM erfolgreich war oder nicht.

Um herauszufinden, warum manuell über die RAID-Karte an die SSD gesendete TRIM-Befehle funktionieren, aber automatische TRIM-Befehle nicht ...

Shane Meyers
quelle
Ich dachte, dass alle HW-RAID-Befehle Trimm aßen, schön zu sehen, dass sich die Dinge langsam ändern. Andererseits spielt TRIM bei guten modernen Antrieben immer weniger eine Rolle.
Ronald Pottol
4

Nach dem, was ich gelesen habe, liegt möglicherweise ein Fehler in Ihrer Methodik vor.

Sie gehen davon aus, dass TRIM dazu führt, dass Ihre SSD die gelöschten Blöcke auf Null setzt. Dies ist jedoch häufig nicht der Fall.

Dies ist nur der Fall, wenn die SSD TRIM implementiert, sodass die verworfenen Blöcke auf Null gesetzt werden. Sie können überprüfen, ob das Gerät mindestens über ausreichende Kenntnisse verfügt, um discard_zeroes_data zu melden:

cat / sys / block / sda / queue / discard_zeroes_data

Auch wenn die SSD auf Null gesetzt ist, kann es einige Zeit dauern, bis die SSD die Blöcke tatsächlich auf Null gesetzt hat (dies gilt für einige SSDs mit geringerer Qualität).

http://www.redhat.com/archives/linux-lvm/2011-April/msg00048.html

Übrigens habe ich nach einem zuverlässigen Weg gesucht, um TRIM zu verifizieren, und noch keinen gefunden. Ich würde gerne wissen, ob jemand einen Weg findet.

chrishiestand
quelle
3

Hier finden Sie eine Testmethode für 10.10 und EXT4. Vielleicht hilft es.

/ubuntu/18903/how-to-enable-trim

Oh, und ich denke, Sie brauchen den discard-Parameter auf dem fstab-Mount. Ich bin mir nicht sicher, ob SSD-Parameter benötigt werden, da ich denke, dass SSD automatisch erkannt werden sollte.

Dave Veffer
quelle
2
Ich habe versucht, die Anweisungen zur Überprüfung von Ext4-SSDs zu befolgen, sie funktionieren jedoch nicht, da sich die Funktionsweise von BtrFS im Vergleich zu anderen Dateisystemen unterscheidet. Daher der Workflow, den ich mir ausgedacht habe. Ich habe die ssdMount-Option verwendet, um sicherzustellen, dass BtrFS den SSD-spezifischen Code verwendet, obwohl er automatisch erkannt werden sollte. Ich habe auch versucht discard(wie oben erwähnt) und es hat nicht geholfen.
Shane Meyers
Naja. Worth a shot :)
Dave Veffer
1

Für btrfs benötigen Sie die discardOption, um die TRIM-Unterstützung zu aktivieren.

Ein sehr einfacher, aber funktionsfähiger Test für TRIM ist hier: http://techgage.com/article/enabling_and_testing_ssd_trim_support_under_linux/2

Paweł Brodacki
quelle
1
Wie oben erwähnt, habe ich meine Tests sowohl mit der discardOption als auch mit der ssdOption versucht . In den BtrFS-Dokumenten wird die ssdOption häufig erwähnt, daher habe ich mich auf das Testen konzentriert, aber keine der Optionen führte zu dem von mir erwarteten Ergebnis. Die meisten Webseiten, die zeigen, wie TRIM getestet wird, sind für Ext4 und dergleichen. BtrFS kann aufgrund des unterschiedlichen Designs des Dateisystems nicht mit diesen Methoden getestet werden.
Shane Meyers
hdparm --fibmapist FS-Agnostiker. Ein Block an einer bestimmten LBA-Adresse wird entweder auf Null gesetzt oder nicht, unabhängig davon, ob die Option extN, btrfs, xfs, jfs ... ssdfür das Zuschneiden irrelevant ist @ vger.kernel.org / msg10932.html .
Paweł Brodacki
Ich habe versucht mit, hdparm --fibmapaber es funktioniert nicht auf BtrFS. Wenn Sie sich die README-Datei wiper.sh (zusammen mit hdparm verteilt) ansehen, wird explizit angegeben, dass "FIEMAP / FIBMAP ioctl () -Aufrufe bei Verwendung in einem btrfs-Dateisystem völlig unsicher sind." Hdparm ist also raus, was zu schade ist, da dies das Testen viel einfacher machen würde. Ich wusste nicht, dass die ssdOption nichts mit TRIM zu tun hat, da in den Dokumenten nicht klar ist, wie nützlich die Option ist.
Shane Meyers
Vielen Dank für die zusätzlichen Informationen zu ioctls, ich wusste es nicht. Ich denke, der beste Ort, um zusätzliche Informationen anzufordern, könnte die btrfs-Mailingliste sein. Dort erhalten Sie Informationen aus erster Hand.
Paweł Brodacki
1

Einige Dinge, über die Sie nachdenken sollten (um Ihre Frage "Vermisse ich etwas?" Zu beantworten):

  • Was genau ist / dev / sda? eine einzelne SSD? oder ein (Hardware?) RAID-Array von SSDs?

  • Wenn letzteres dann welche Art von RAID-Controller?

  • und unterstützt Ihr RAID-Controller TRIM?

und schlussendlich,

  • Gibt Ihre Testmethode die Ergebnisse aus, die Sie erwarten, wenn Sie / dev / sda1 mit etwas anderem als btrfs formatieren?
cas
quelle
1

Praktisch alle SSDs mit einer SATA-Schnittstelle führen eine Art Protokollstruktur-Dateisystem aus, das für Sie völlig unsichtbar ist. Der SATA-Befehl 'trim' teilt dem Gerät mit, dass der Block nicht mehr verwendet wird und dass das zugrunde liegende Protokollstruktur-Dateisystem ihn flashen kann / falls / der entsprechende Löschblock (der möglicherweise wesentlich größer ist) / nur / Blöcke enthält, die mit trim markiert sind.

Ich habe die Standarddokumente hier nicht gelesen: http://t13.org/Documents/MinutesDefault.aspx?keyword=trim , bin mir aber nicht sicher, ob es eine Standardgarantie gibt, die Sie in der Lage wären Die Ergebnisse eines Trimmbefehls anzeigen. Wenn sich etwas ändert, z. B. wenn die ersten paar Bytes zu Beginn eines Löschblocks auf Null gesetzt werden, gibt es meines Erachtens keine Garantie dafür, dass dies für verschiedene Geräte oder möglicherweise sogar für die Firmware-Version gilt.

Wenn Sie darüber nachdenken, wie die Abstraktion implementiert werden könnte, sollte es möglich sein, das Ergebnis des Befehls trim für denjenigen, der nur Blöcke liest / schreibt, vollständig unsichtbar zu machen. Darüber hinaus kann es schwierig sein, festzustellen, welche Blöcke sich im selben Löschblock befinden, da dies nur der Flash-Übersetzungsebene bekannt sein muss und diese möglicherweise logisch neu angeordnet hat.

Vielleicht gibt es einen SATA-Befehl (OEM-Befehl vielleicht?) Zum Abrufen von Metadaten im Zusammenhang mit der Flash-Übersetzungsschicht der SSDs?

Joshua Hoblitt
quelle