验证SSD上的BtrFS是否支持TRIM


21

我们正在研究在一系列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";

我的测试方法是否有缺陷?我在这里想念什么吗?

谢谢您的帮助。


1
我完全支持测试最前沿的内容,但是您可以知道,截至目前,btrfs还没有fsck实际上可以解决问题:btrfs.wiki.kernel.org/index.php/Main_Page-因此只是要当心。
马特·西蒙斯

@Matt-关于缺少的fsck的要点。我的理解是,fsck的第一个版本应该在接下来的几周内发布,因此我们应该在将其移交给生产时就涵盖在内。此外,我们将拥有数据的多个副本,因此,如果我们松开一个副本,则至少还有两个副本可用于还原。但是我完全同意,这不是目前拥有不可替代数据的人的文件系统。
Shane Meyers

1
可能什么都不会改变,但是您最好sync在rmming文件后尝试运行a 。
zebediah11年

我想说的是sync,删除文件后我尝试运行a ,结果仍然相同。周末结束后我回到办公室时,我会仔细检查。
Shane Meyers

如果您不介意流血的边缘,您是否考虑过zfsonlinux.org?Linux的本机ZFS(即在内核中,而不是保险丝)。它们接近正式的“发行版”,并且具有可用的RC(包括适用于Ubuntu的PPA-也很容易为debian重建)
cas

Answers:


4

因此,经过几天的努力,我得以证明BtrFS确实使用了TRIM。我无法在将这些SSD部署到的服务器上成功完成TRIM工作。但是,使用笔记本电脑中插入的相同驱动器进行测试时,测试将成功。

用于所有此测试的硬件:

  • 至关重要的m4 SSD 512GB
  • 惠普DL160se G6
  • LSI LSISAS9200-8e HBA
  • 通用SAS机箱
  • 戴尔XPS M1210笔记本电脑

在多次尝试验证服务器上的BtrFS失败之后,我决定使用一台旧笔记本电脑尝试相同的测试(删除RAID卡层)。在笔记本电脑上同时使用Ext4和BtrFS进行此测试的初始尝试失败(数据未经过TRIM处理)。

然后,我将SSD驱动器固件从0001版(出厂时)升级到了0009版。使用Ext4和BtrFS重复了测试,并且两个文件系统都成功地对数据进行了TRIM。

为了确保TRIM命令有时间运行,我rm /mnt/testfile && sync && sleep 120在执行验证之前做了一个。

如果您要尝试相同的测试,请注意一件事:SSD具有可操作的擦除块(我不知道Crucial m4擦除块的大小)。当文件系统将TRIM命令发送到驱动器时​​,驱动器将只擦除一个完整的块;否则,将删除整个块。如果为块的一部分指定了TRIM命令,则由于擦除块中剩余的有效数据,该块将不会被TRIM'd。

因此,以证明我在说什么(sectors.pl上面脚本的输出)。这是SSD上的测试文件。句点是仅包含零的扇区。加号具有一个或多个非零字节。

驱动器上的测试文件:

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

从驱动器中删除测试文件(在之后sync && sleep 120):

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

看起来文件的第一个和最后一个扇区与文件的其余部分位于不同的擦除块内。因此,一些部门保持不变。

一个外卖形式:一些Ext4 TRIM测试说明要求用户仅验证文件中的第一个扇区是否为TRIM。测试人员应查看测试文件的较大部分,以真正查看TRIM是否成功。

现在找出为什么通过RAID卡发送给SSD的手动发出的TRIM命令起作用,而自动TRIM命令却不起作用...


我以为所有HW RAID都吃了修整命令,很高兴看到事情正在慢慢改变。另一方面,对于现代驱动器来说,TRIM的重要性越来越小。
罗纳德·帕托

4

根据我的阅读,您的方法可能存在缺陷。

您假设TRIM将导致您的SSD将已删除的块清零。但是,通常情况并非如此。

仅当SSD实现TRIM以便将丢弃的块归零时。您可以检查设备是否至少知道足以报告discard_zeroes_data:

猫/ sys / block / sda / queue / discard_zeroes_data

同样,即使SSD归零,也可能需要一些时间-丢弃完成后很长时间-实际上将SSD归零(某些质量较低的SSD确实如此)。

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

顺便说一句,我一直在寻找一种可靠的方法来验证TRIM,但还没有找到。我很想知道是否有人找到方法。


3

这是10.10和EXT4的测试方法。也许会有所帮助。

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

哦,我认为您确实需要在fstab挂载上使用丢弃参数。不确定是否需要SSD参数,因为我认为它应该自动检测SSD。


2
我尝试遵循Ext4 SSD验证说明,但是由于与其他文件系统相比BtrFS的工作方式不同,因此它们无法正常工作。因此,我想到了工作流程。我使用ssdmount选项来确保BtrFS即使应该自动检测,也知道使用其SSD特定的代码。我也尝试使用discard(如上所述),但没有帮助。
Shane Meyers

那好吧。值得一

1

对于btrfs,您需要discard选择启用TRIM支持。

功能TRIM的一个非常简单但有效的测试在这里:http : //techgage.com/article/enabling_and_testing_ssd_trim_support_under_linux/2


1
如前所述,我同时尝试了discard选项和ssd选项。BtrFS文档ssd大量提到了该选项,因此我将测试重点放在了该位置上,但是没有一个选项产生了预期的结果。大多数显示如何测试TRIM的网页都针对Ext4等。由于文件系统设计的差异,无法使用这些方法来测试BtrFS。
Shane Meyers

hdparm --fibmap与FS无关。给定的LBA地址处的块是否被清零,是否为extN,btrfs,xfs,jfs ... ssd选项与修剪无关,请参见例如有关btrfs邮件列表的讨论:mail-archive.com/linux-btrfs @ vger.kernel.org / msg10932.html
帕维尔Brodacki

我尝试使用,hdparm --fibmap但在BtrFS上不起作用。如果您查看一下wiper.sh自述文件(与hdparm一起分发),它们会明确指出“在btrfs文件系统上使用FIEMAP / FIBMAP ioctl()调用是完全不安全的。” 因此hdparm失效了,这太糟糕了,因为这会使测试变得容易得多。我不知道该ssd选项与TRIM无关,因为文档对于该选项的用途尚不十分清楚。
Shane Meyers

感谢您提供有关ioctls的额外信息,我不知道。我认为询问其他信息的最佳地点可能是btrfs邮件列表。您将从那里获得第一手信息。
帕维尔Brodacki

1

需要考虑的一些事情(以帮助回答“我是否缺少某些东西?”问题):

  • / dev / sda到底是什么?一个固态硬盘?还是(硬件?)SSD RAID阵列?

  • 如果是后者那又是什么样的RAID控制器?

  • 您的RAID控制器是否支持TRIM?

最后,

  • 如果使用btrfs以外的格式设置/ dev / sda1的格式,您的测试方法是否可以提供预期的结果?

1

几乎所有具有SATA接口的SSD都运行某种完全对您隐藏的日志结构文件系统。SATA'trim'命令告诉设备该块已不再使用,并且底层日志结构文件系统可以/ if /刷新相应的擦除块(可能更大)/ only /包含标有trim的块。

我还没有阅读标准文档,这些文档位于:http : //t13.org/Documents/MinutesDefault.aspx?keyword=trim,但是我不确定是否有任何标准级别的保证可以查看修剪命令的结果。如果您看到一些变化,例如在擦除块的开头将前几个字节清零,那么我认为没有任何保证可适用于不同的设备甚至固件版本。

如果您考虑实现抽象的方式,那么应该有可能使trim命令的结果对于只读/写块的用户完全不可见。此外,由于只有闪存转换层必须知道这些块,并且可能已经对其进行了逻辑上的重新排序,因此很难确定哪些块位于同一擦除块中。

也许有一个SATA命令(也许是OEM命令?)来获取与SSD闪存转换层相关的元数据?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.