Sprawdź obsługę TRIM za pomocą BtrFS na SSD

21

Rozważamy użycie BtrFS na macierzy dysków SSD i zostałem poproszony o sprawdzenie, czy BtrFS faktycznie wykonuje operacje TRIM po usunięciu pliku. Do tej pory nie byłem w stanie zweryfikować, czy polecenie TRIM zostało wysłane na dyski.

Wiem, że BtrFS nie jest uważany za gotowy do produkcji, ale lubimy najnowocześniejsze rozwiązania, dlatego go testuję. Serwer to wersja 64-bitowa Ubuntu 11.04 (mkfs.btrfs wersja 0.19). Zainstalowałem jądro Linux 3.0.0, ponieważ dziennik zmian BtrFS stwierdza, że ​​luzem TRIM nie jest dostępny w jądrze dostarczanym z Ubuntu 11.04 (2.6.38).

Oto moja metodologia testowania (początkowo przyjęta z http://andyduffell.com/techblog/?p=852 , z modyfikacjami do pracy z BtrFS):

  • Ręcznie PRZYCINUJ dyski przed rozpoczęciem: for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
  • Sprawdź, czy dysk był TRIM'd: ./sectors.pl |grep + | tee sectors-$(date +%s)
  • Podziel dysk na partycje: fdisk /dev/sda
  • Ustaw system plików: mkfs.btrfs /dev/sda1
  • Uchwyt: sudo mount -t btrfs -o ssd /dev/sda1 /mnt
  • Utwórz plik: dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
  • Sprawdź, czy plik znajduje się na dysku: ./sectors.pl | tee sectors-$(date +%s)
  • Usuń plik testowy: rm /mnt/testfile
  • Sprawdź, czy plik testowy ma TRIM z dysku: ./sectors.pl | tee sectors-$(date +%s)
  • Sprawdź bloki TRIM'd: diffdwa najnowsze sectors-*pliki

W tym momencie weryfikacje przed usunięciem i po usunięciu nadal pokazują te same używane bloki dysku. Zamiast tego powinienem zauważyć zmniejszenie liczby używanych bloków. Oczekiwanie godziny (na wypadek, gdy polecenie TRIM zostanie wydane) po usunięciu pliku testowego nadal pokazuje te same używane bloki.

Próbowałem również montażu z -o ssd,discardopcjami, ale to wcale nie pomaga.

Partycja utworzona z fdiskgóry (utrzymuję małą partycję, aby weryfikacja mogła przebiegać szybciej):

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

Mój sectors.plskrypt (wiem, że jest to nieefektywne, ale wykonuje zadanie):

#!/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";

Czy moja metodologia testowania jest wadliwa? Czy coś mi umyka?

Dzięki za pomoc.

Shane Meyers
źródło
1
Całkowicie popieram testowanie najnowocześniejszych rzeczy, ale właśnie dlatego wiesz, że na razie btrfs nie ma fsck, który w rzeczywistości naprawia rzeczy: btrfs.wiki.kernel.org/index.php/Main_Page - więc uważaj na to.
Matt Simmons,
@Matt - Dobra uwaga na temat brakującego fsck. Rozumiem, że pierwsza wersja fsck powinna zostać wysłana w ciągu najbliższych kilku tygodni, więc powinniśmy być objęci czasem, kiedy przeniosiemy ją na produkcję. Ponadto będziemy mieli wiele kopii naszych danych, więc jeśli stracimy jedną kopię, będziemy mieli co najmniej dwie dodatkowe kopie do przywrócenia. Ale w pełni się zgadzam, że nie jest to na razie system plików dla osób z niezastąpionymi danymi.
Shane Meyers,
1
Prawdopodobnie nic nie zmieni, ale równie dobrze możesz spróbować uruchomić plik syncpo zapisaniu pliku.
zebediah49
Chcę powiedzieć, że próbowałem uruchomić syncpo usunięciu pliku i wyniki były nadal takie same. Dokładnie sprawdzę to jednak, gdy w weekend wrócę do biura.
Shane Meyers
jeśli nie masz nic przeciwko krwawej przewadze , czy zastanawiałeś się nad zfsonlinux.org ? natywny (tj. w jądrze, nie w bezpieczniku) ZFS dla Linuxa. są bliskie oficjalnej „wersji” i mają RC dostępne (w tym PPA dla Ubuntu - dość łatwe do odbudowania również dla Debiana)
cas

Odpowiedzi:

4

Po wielu dniach pracy nad tym byłem w stanie wykazać, że BtrFS używa TRIM. Nie mogłem pomyślnie uruchomić TRIM na serwerze, na którym będziemy wdrażać te dyski SSD. Jednak podczas testowania przy użyciu tego samego dysku podłączonego do laptopa testy są udane.

Sprzęt używany do wszystkich tych testów:

  • Crucial m4 SSD 512 GB
  • HP DL160se G6
  • LSI LSISAS9200-8e HBA
  • ogólna obudowa SAS
  • Laptop Dell XPS m1210

Po wielu nieudanych próbach weryfikacji BtrFS na serwerze postanowiłem spróbować tego samego testu na starym laptopie (usuń warstwę karty RAID). Początkowe próby tego testu przy użyciu Ext4 i BtrFS na laptopie kończą się niepowodzeniem (dane nie są TRIM).

Następnie zaktualizowałem oprogramowanie napędu SSD z wersji 0001 (dostarczonej po wyjęciu z pudełka) do wersji 0009. Testy powtórzono z Ext4 i BtrFS, a oba systemy plików pomyślnie TRIM usunęły dane.

Aby mieć pewność, że komenda TRIM ma czas na uruchomienie, zrobiłem rm /mnt/testfile && sync && sleep 120przed sprawdzeniem poprawności.

Należy zwrócić uwagę, jeśli próbujesz wykonać ten sam test: dyski SSD mają bloki usuwania, na których działają (nie znam wielkości bloków usuwania Crucial m4). Gdy system plików wyśle ​​polecenie TRIM do napędu, napęd usunie tylko pełny blok; jeśli dla części bloku podano polecenie TRIM, blok ten nie będzie TRIM z powodu pozostałych ważnych danych w bloku kasowania.

Aby zademonstrować, o czym mówię (wynik sectors.plpowyższego skryptu). Jest to plik testowy na dysku SSD. Okresy to sektory zawierające tylko zera. Plusy mają jeden lub więcej niezerowych bajtów.

Plik testowy na dysku:

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

Plik testowy usunięty z dysku (po a sync && sleep 120):

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

Wygląda na to, że pierwszy i ostatni sektor pliku znajdują się w innym bloku kasowania niż reszta pliku. Dlatego niektóre sektory pozostały nietknięte.

Na wynos z tego: niektóre instrukcje testowania TRIM Ext4 proszą użytkownika, aby tylko sprawdził, czy pierwszy sektor został TRIM usunięty z pliku. Tester powinien wyświetlić większą część pliku testowego, aby naprawdę sprawdzić, czy TRIM się powiodło, czy nie.

Teraz, aby dowiedzieć się, dlaczego ręcznie wydawane polecenia TRIM wysyłane na dysk SSD za pośrednictwem karty RAID działają, ale automatyczne polecenia TRIM nie ...

Shane Meyers
źródło
Myślałem, że wszystkie HW RAID zjadają polecenia przycinania, miło widzieć, że rzeczy powoli się zmieniają. Z drugiej strony, przy dobrych nowoczesnych napędach, TRIM ma coraz mniejsze znaczenie.
Ronald Pottol
4

W oparciu o to, co przeczytałem, może istnieć wada w twojej metodologii.

Zakładasz, że TRIM spowoduje, że Twój dysk SSD wyzeruje bloki, które zostały usunięte. Jednak często tak nie jest.

Dzieje się tak tylko wtedy, gdy SSD implementuje TRIM tak, że zeruje odrzucone bloki. Możesz sprawdzić, czy urządzenie przynajmniej wie wystarczająco dużo, aby zgłosić discard_zeroes_data:

cat / sys / block / sda / queue / discard_zeroes_data

Ponadto, nawet jeśli dysk SSD ma wartość zero, może zająć trochę czasu - znacznie po zakończeniu odrzucania - aby dysk SSD faktycznie wyzerował bloki (dotyczy to dysków SSD o niższej jakości).

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

BTW Szukałem niezawodnego sposobu weryfikacji TRIM i jeszcze go nie znalazłem. Chciałbym wiedzieć, jeśli ktoś znajdzie sposób.

chrishiestand
źródło
3

Oto metodologia testowania dla 10.10 i EXT4. Może to pomoże.

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

Aha i myślę, że potrzebujesz parametru discard na montażu fstab. Nie jestem pewien, czy potrzebny jest parametr SSD, ponieważ uważam, że powinien automatycznie wykryć SSD.

Dave Veffer
źródło
2
Próbowałem postępować zgodnie z instrukcjami weryfikacji dysku SSD Ext4, ale nie działają one z powodu różnic w działaniu BtrFS w porównaniu z innymi systemami plików. Stąd wymyślony przeze mnie przepływ pracy. Użyłem ssdopcji montowania, aby upewnić się, że BtrFS wiedział, że używa kodu specyficznego dla SSD, mimo że powinien automatycznie wykryć. Próbowałem także użyć discard(jak wspomniano powyżej) i to nie pomogło.
Shane Meyers
No cóż. Warto
spróbować
1

W przypadku btrfs potrzebujesz discardopcji włączenia obsługi TRIM.

Bardzo prosty, ale działający test funkcjonalnego TRIM znajduje się tutaj: http://techgage.com/article/enabling_and_testing_ssd_trim_support_under_linux/2

Paweł Brodacki
źródło
1
Jak wspomniałem powyżej, próbowałem przetestować zarówno discardopcję, jak i ssdopcję. Dokumenty BtrFS często wspominają o tej ssdopcji, więc skoncentrowałem się na testowaniu, ale żadna z opcji nie przyniosła oczekiwanego rezultatu. Większość stron, które pokazują, jak przetestować TRIM, jest przeznaczona dla Ext4 i tym podobnych. BtrFS nie może być testowany przy użyciu tych metodologii ze względu na różnicę w konstrukcji systemu plików.
Shane Meyers,
hdparm --fibmapjest FS agnostyczny. Blok pod danym adresem LBA jest wyzerowany lub nie, czy jest to extN, btrfs, xfs, jfs ... ssdopcja nie ma znaczenia dla trim, patrz np. Ta dyskusja na liście mailingowej btrfs: mail-archive.com/linux-btrfs @ vger.kernel.org / msg10932.html .
Paweł Brodacki
Próbowałem użyć, hdparm --fibmapale nie działa na BtrFS. Jeśli spojrzysz na plik README wiper.sh (dystrybuowany wraz z hdparm), wyraźnie stwierdzają, że „wywołania FIEMAP / FIBMAP ioctl () są całkowicie niebezpieczne, gdy są używane w systemie plików btrfs”. Więc hdparm jest niedostępny, co jest zbyt złe, ponieważ znacznie ułatwiłoby testowanie. Nie wiedziałem, że ssdopcja nie miała nic wspólnego z TRIM, ponieważ dokumenty nie są bardzo jasne na temat przydatności opcji.
Shane Meyers
Dziękuję za dodatkowe informacje o ioctls, nie wiedziałem o tym. Myślę, że najlepszym miejscem do poproszenia o dodatkowe informacje może być lista mailingowa btrfs. Otrzymasz stamtąd informacje z pierwszej ręki.
Paweł Brodacki
1

Kilka rzeczy do przemyślenia (aby pomóc odpowiedzieć na pytanie „czy coś mi brakuje?”):

  • czym dokładnie jest / dev / sda? pojedynczy dysk SSD? czy macierz RAID (sprzętowa?) macierzy SSD?

  • jeśli to drugie, to jaki rodzaj kontrolera RAID?

  • i czy twój kontroler RAID obsługuje TRIM?

i w końcu,

  • czy twoja metoda testowania daje ci oczekiwane wyniki, jeśli sformatujesz / dev / sda1 za pomocą czegoś innego niż btrfs?
cas
źródło
1

Praktycznie na wszystkich dyskach SSD z interfejsem SATA działa system plików o strukturze dziennika, który jest całkowicie przed tobą ukryty. Komenda SATA „trim” informuje urządzenie, że blok nie jest już używany i że system plików struktury logów może sflashować go / if / odpowiedni blok kasowania (który może być znacznie większy) / tylko / zawiera bloki oznaczone trimem.

Nie przeczytałem standardowych dokumentów, które są tutaj: http://t13.org/Documents/MinutesDefault.aspx?keyword=trim , ale nie jestem pewien, czy istnieje jakakolwiek standardowa gwarancja na poziomie, którą możesz zobacz wyniki polecenia przycinania. Jeśli widzisz coś zmieniającego się, na przykład pierwsze kilka bajtów jest zerowane na początku bloku kasowania, nie sądzę, że istnieje jakakolwiek gwarancja, która ma zastosowanie do różnych urządzeń, a może nawet wersji oprogramowania układowego.

Jeśli pomyślisz o sposobie implementacji abstrakcji, powinna istnieć możliwość uczynienia wyniku polecenia przycinania całkowicie niewidocznym dla tego, który odczytuje / zapisuje bloki. Ponadto może być trudno stwierdzić, które bloki znajdują się w tym samym bloku kasowania, ponieważ tylko warstwa translacji flash musi o tym wiedzieć i mogła zmienić ich logiczną kolejność.

Być może istnieje polecenie SATA (być może polecenie OEM?) Do pobierania metadanych związanych z warstwą translacji flash dysków SSD?

Joshua Hoblitt
źródło