我正在为我工作的小型企业构建一个简单的 ZFS 文件服务器。该服务器是 Dell Poweredge 840,具有 1GB RAM。操作系统(OpenSolaris 2009.06)安装在一个 SATA 驱动器上,并且安装了另外三个用于存储的 SATA 驱动器:1x1TB、1x1.5TB 和 1x2TB。当我将这三个驱动器添加到一个 raidz zpool 时,吞吐量不是很好:
#zpool create -m /export/pool pool raidz c7d1 c8d0 c8d1
#zfs create pool/fs
#time dd if=/dev/zero of=/export/pool/fs/zerofile bs=1048576 count=1024
1024+0 records in
1024+0 records out
real 0m12.539s
user 0m0.002s
sys 0m0.435s
这大约是 81.6 MB/s。这并不可怕,但我尝试创建一个仅由其中一个驱动器组成的池:
#zpool create -m /export/disk-c7d1 disk-c7d1 c7d1
#zfs create disk-c7d1/fs
#time dd if=/dev/zero of=/export/disk-c7d1/fs/zerofile bs=1048576 count=1024
1024+0 records in
1024+0 records out
real 0m21.251s
user 0m0.002s
sys 0m0.552s
好吧,对一个驱动器进行顺序写入的吞吐量为 48.19 MB/s?这似乎相当低。特别是当我将驱动器格式化为 UFS 并尝试相同的写入时:
#newfs /dev/dsk/c7d1s2
<snip>
#mount /dev/dsk/c7d1s2 /mnt/c7d1
# time dd if=/dev/zero of=/mnt/c7d1/zeroes bs=1048576 count=1024
1024+0 records in
1024+0 records out
real 0m10.372s
user 0m0.002s
sys 0m1.720s
这几乎是速度的两倍,达到 98.73 MB/s。这更接近我对这些驱动器的期望(尽管它们只是廉价的 SATA 驱动器)。
我在这里做错了什么?我知道使用 RAIDZ 写入奇偶校验数据会产生开销,但是从单个驱动器创建池不应该使吞吐量减半,对吗?这似乎很糟糕。
谢谢大家。
答案1
通过添加读写缓存 SSD,可以大大提高 ZFS 的性能(我知道它们很贵)查看此链接以获取更多信息。
答案2
答案3
请记住,使用 ZFS 时,每次写入都会有更多内容,因为部分数据是元数据。有趣的是,如果您使用 dd 异步写入,则性能应该会更好,因为应该有一些缓存在进行。当您开始扩展池时,您将看到性能的改进,如果您通过 SSD 作为缓存设备以及作为 ZIL 设备(假设您有大量同步写入)来实现,这肯定会令人惊叹。缓存 SSD 是您的读取缓存,而 ZIL SSD 是您的同步写入缓存。我会尝试的第一件事是使用与您的文件系统的块大小相匹配的块大小,这可能是 128K,尽管您的设置显然不是理想的。看看它会是什么样子。
最后,不要将 ZFS 和 UFS 进行比较 - 苹果和橘子。其他人在这次交流中提供了很好的参考。绝对值得一读。