SSDディスクのアレイでBtrFSを使用することを検討しており、BtrFSが実際にファイルの削除時にTRIM操作を実行することを確認するように求められました。これまでのところ、TRIMコマンドがディスクに送信されたことを確認できませんでした。
BtrFSは本番環境とは見なされていませんが、私たちは最先端を好むので、テストしています。サーバーはUbuntu 11.04サーバー64ビットリリース(mkfs.btrfsバージョン0.19)です。Linux 3.0.0カーネルをインストールしました。BtrFSの変更ログには、Ubuntu 11.04(2.6.38)に同梱されているカーネルではバルクTRIMを使用できないことが示されているためです。
これが私のテスト方法です(最初はhttp://andyduffell.com/techblog/?p=852から採用され、BtrFSで動作するように修正されています):
- 開始する前にディスクを手動でトリムします。
for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
- ドライブがTRIMされたことを確認します。
./sectors.pl |grep + | tee sectors-$(date +%s)
- ドライブをパーティション分割します。
fdisk /dev/sda
- ファイルシステムを作成します。
mkfs.btrfs /dev/sda1
- マウント:
sudo mount -t btrfs -o ssd /dev/sda1 /mnt
- ファイルを作成します。
dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
- ファイルがディスク上にあることを確認します。
./sectors.pl | tee sectors-$(date +%s)
- テストファイルを削除します。
rm /mnt/testfile
- テストファイルがディスクからTRIMされていることを確認します。
./sectors.pl | tee sectors-$(date +%s)
- TRIMされたブロックの確認:
diff
最新の2つのsectors-*
ファイル
この時点で、削除前と削除後の検証では、使用中の同じディスクブロックが引き続き表示されます。代わりに、使用中のブロックの数が減少するはずです。テストファイルが削除されてから1時間待機すると(TRIMコマンドの発行に時間がかかる場合)、使用中の同じブロックが表示されます。
私も-o ssd,discard
オプションでマウントしようとしましたが、それはまったく役に立たないようです。
fdisk
上から作成されたパーティション(検証が速くなるようにパーティションを小さくします):
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
私のsectors.pl
スクリプト(これは非効率的ですが、仕事は完了します):
#!/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";
テスト方法に欠陥はありますか?ここに何かが足りませんか?
助けてくれてありがとう。
sync
、ファイルをrmmingした後にを実行してみてください。
sync
ファイルを削除してからを実行してみたが、結果は同じままだったと言いたい。週末が終わった後、私がオフィスに戻ったとき、私はそれを再確認します。