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:
diff
dwa najnowszesectors-*
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,discard
opcjami, ale to wcale nie pomaga.
Partycja utworzona z fdisk
gó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.pl
skrypt (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.
sync
po zapisaniu pliku.
sync
po usunięciu pliku i wyniki były nadal takie same. Dokładnie sprawdzę to jednak, gdy w weekend wrócę do biura.