我们正在研究在一系列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
- 验证驱动器是否已修剪:
./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
- 查看测试文件是否已从磁盘中删除:
./sectors.pl | tee sectors-$(date +%s)
- 验证TRIM'd块:
diff
两个最新sectors-*
文件
此时,删除前和删除后验证仍然显示正在使用的相同磁盘块。相反,我应该看到正在使用的块数量有所减少。删除测试文件后等待一个小时(如果发出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文件后尝试运行a 。
sync
,删除文件后我尝试运行a ,结果仍然相同。周末结束后我回到办公室时,我会仔细检查。