我的 SSD 应该使用 btrfs 还是 Ext4?

Gra*_*ham 16 partitioning ssd btrfs ext4 11.10

我应该为办公机器的 Ubuntu 11.10 (Oneiric) amd64 桌面根分区的 SSD 使用 btrfs(带有丢弃、压缩=lzo 和 space_cache 选项)还是 Ext4(带有丢弃选项)?

/home 将是 HDD,因此 fs 可靠性影响操作系统而不是我的数据。

小智 13

根据phoronix的测试,它总是取决于许多因素。在一种情况下Btrfs会比EXT4读取 SSD 上的大文件要好得多。同样在考虑 Disk 事务性能时,Ext4可以表现得比后者更好。

您可以在此处此处此处查看这些测试(警告:冗长的文章)。

但总而言之,即使在 SSD 模式下使用,Btrfs 现在也不比 EXT4 文件系统具有定量的性能优势

所以你Ext4现在可以选择。

  • 文章分别为2011年9月、2010年8月9日和2009年5月29日。关注最新的,因为我认为 btrfs 会在过去两年中不断发展。第 4 页上的 btrfs+LZO 图表在顺序读写性能方面非常出色,但是 btrfs 在随机写入方面表现不佳,因此对于 DB 和 VM 映像绝对不适合 btrfs。我猜对于根分区,负载主要是随机读取,这并不比 ext4 好多少。 (2认同)

小智 7

对于那些在 2016 年遇到这个问题的人......使用 ext4。我试过 btrfs,差别很大。在 10 天的时间内,向 ext4 写入的 IO 达到 17,800 个扇区。Btrfs?490,400 个扇区。相同的 SSD,相同的文件系统,不同的分区。基本上,相同的工作量。

当驱动器上的写入活动为零时,ext4 和 btrfs 都会“安静”。那挺好的。

Ext4 将写入修改后的数据,加上一些开销。开销与写入的数据有关。4K 写入(1 块)在下一次提交时会推送大约 50-80 块的开销。(ext4 日志已完全启用)

在 btrfs 上修改单个 4K 块,您将在下一次提交时推送 4000-5000 块之间的开销。我相信默认提交是 30 秒。我用了120。

现在,这取决于您如何使用 SSD。作为 root,通常会有相当稳定的低级别写入流在进行。日志文件、ntp 漂移文件、man db 重建、opensm 拓扑更新等。每个事件都会用另外 4000-5000 次写入重击 btrfs 驱动器。

上面的 10 天数字适用于我的“写限制”SSD。这 17,800 个扇区中的大部分是小规模系统更新的结果。一个 btrfs 副本没有受到影响。我的作者正是 ntp 漂移、opensm 拓扑和 man db 更新(每晚)。除了系统升级vim /etc/whatever等主动发起的事情外,没有其他东西会命中该磁盘。

总的来说,SSD 会遭受大量写入,真的。我只是看不出浪费它们的意义,因为新闻媒体正在追逐兔子和彩虹。如果你想为COW支付这个价格,那就去吧。对于“性能”,不是那么多。它是一个 SSD,您可能会在其上放置人类已知的最糟糕的“文件系统”,并且仍然可以获得一定程度的性能 - 仅靠蛮力。到目前为止,Ext4 并不是人类已知的最糟糕的文件系统。

没有每月 fs 检查。试试下面的脚本。这是 100% hack,不适用于 md 挂载点,

#! /bin/bash
dev=`cat /proc/mounts | grep " $1 " | awk '{print $1}'`
x=`basename $dev`
vmnam=`lsblk $dev -o MOUNTPOINT,PKNAME | grep "$1" | awk '{print $2}'`
vmx=`vmstat -d | grep $vmnam | awk '{print $8}'`
lbax=`smartctl -a $dev | grep LBA | awk '{print $10}'`
tmpnam=`mktemp XXX`
echo "Tracking device: $dev, mounted on $1 (vmstat on $vmnam)"
tim=`date +%s`
timx=`date +%s`
while true
do
    vm=`vmstat -d | grep "$vmnam" | awk '{print $8}'`
    lba=`smartctl -a $dev | grep LBA | awk '{print $10}'`
    if [ "$vm" != "$vmx" ]
    then
        tim=`date +%s`
        dif=`dc <<< "$vm $vmx - p"`
        lbad=`dc <<< "$lba $lbax - p"`
        timd=`dc <<< "$tim $timx - p"`
        echo `date` " (sec=$timd) writes=$vm (dif=$dif) (lba=$lbad)"
        vmx="$vm"
        lbax="$lba"
        timx="$tim"
        find "$1" -mount -newer "$tmpnam" -print | grep -v "/tmp"
        touch "$tmpnam" 
    fi
    sleep 1 
done
Run Code Online (Sandbox Code Playgroud)

它会告诉您根据驱动器本身写入了多少块,以及更新了哪些文件。需要root权限。你自己看。我在根文件系统上运行 SSD,并调用脚本 stat.sh。所以...sudo ./stat.sh /

  • 为什么会有这么大的写开销?你说,即使在 ext4 上,1 个块也创建了 50-80 个块——这是需要的 40 倍。为什么? (2认同)