BtrFS'yi bir dizi SSD disk üzerinde kullanmak istiyoruz ve BtrFS'nin aslında bir dosyayı silerken TRIM işlemleri gerçekleştirdiğini doğrulamam istendi. Şimdiye kadar TRIM komutunun disklere gönderildiğini doğrulayamadım.
BtrFS'nin üretime hazır sayılmadığını biliyorum, ancak kanama kenarını seviyoruz, bu yüzden test ediyorum. Sunucu Ubuntu 11.04 sunucusu 64 bit sürümüdür (mkfs.btrfs versiyon 0.19). BtrFS changelog , toplu TRIM’in Ubuntu 11.04 (2.6.38) ile birlikte gelen çekirdeğe uygun olmadığını belirttiği için Linux 3.0.0 çekirdeğini kurdum.
İşte benim test metodolojim (başlangıçta http://andyduffell.com/techblog/?p=852 adresinden BtrFS ile çalışacak değişiklikler ile benimsendi):
- Başlamadan önce diskleri elle TRIM:
for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
- Sürücünün TRIM'd olduğunu doğrulayın:
./sectors.pl |grep + | tee sectors-$(date +%s)
- Sürücüyü bölümleyin:
fdisk /dev/sda
- Dosya sistemini yapın:
mkfs.btrfs /dev/sda1
- monte:
sudo mount -t btrfs -o ssd /dev/sda1 /mnt
- Bir dosya oluşturun:
dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
- Dosyanın diskte olduğunu doğrulayın:
./sectors.pl | tee sectors-$(date +%s)
- Test dosyasını silin:
rm /mnt/testfile
- Test dosyasının diskten TRIM'd olduğunu görün:
./sectors.pl | tee sectors-$(date +%s)
- TRIM'd bloklarını doğrulayın:
diff
en son ikisectors-*
dosya
Bu noktada, silme öncesi ve silme doğrulamaları hala kullanılan disk bloklarını göstermektedir. Bunun yerine kullanımda blok sayısında bir azalma görmeliyim. Test dosyasının silinmesinden bir saat sonra (TRIM komutunun vermesi biraz zaman alabilir) test silindikten sonra hala kullanılan blokların aynı olduğu görülüyor.
Ayrıca -o ssd,discard
seçeneklerle montaj yapmayı da denedim , ancak bu hiç de yardımcı olmuyor.
fdisk
Yukarıdan oluşturulan bölüm (bölümü daha küçük tutacağım, böylece doğrulama daha hızlı olabilir):
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
Benim sectors.pl
komut dosyası (bu verimsiz olduğunu biliyorum ama bu iş bitmiş olur):
#!/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";
Test metodolojim hatalı mı? Burada bir şey mi eksik?
Yardım için teşekkürler.
sync
dosyayı sıkıştırdıktan sonra çalıştırmayı deneyebilirsiniz .
sync
dosyayı kaldırdıktan sonra çalıştırmayı denediğimi ve sonuçların hala aynı olduğunu söylemek istiyorum . Haftasonu bittikten sonra ofise döndüğümde iki kez kontrol edeceğim.