ZFS非常慢

时间:2016-06-14 21:32:16

标签: amazon-ec2 zfs

我是否误解iostat结果,还是每分钟只写3.06 MB?

# zpool iostat -v 60

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zfs-backup   356G   588G    465     72  1.00M  3.11M
  xvdf       356G   588G    465     72  1.00M  3.11M
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zfs-backup   356G   588G    568     58  1.26M  3.06M
  xvdf       356G   588G    568     58  1.26M  3.06M
----------  -----  -----  -----  -----  -----  -----

目前rsync正在从其他HDD(ext4)写入文件。基于我们的文件特征(~50 KB文件),似乎数学是正确的3.06 * 1024 / 58 = 54 KB

记录:

  • primarycache=metadata
  • compression=lz4
  • dedup=off
  • checksum=on
  • relatime=on
  • atime=off

服务器位于EC2,目前是1核,2GB RAM(t2.small),硬盘 - 亚马逊上最便宜的。操作系统 - Debian Jessiezfs-dkmsdebian testing存储库安装。

如果真的那么慢,为什么呢?有没有办法提高性能,而无需全部转移到SSD并添加8 GB的RAM?它可以在VPS上表现良好,还是ZFS设计时考虑到裸机?

修改

我添加了一个5 GB的通用SSD,用作ZIL,正如答案中所建议的那样。这没有多大帮助,因为似乎根本没有使用ZIL。在我的用例中,5 GB应该足够多,因为根据以下Oracle article我应该有1/2大小的RAM。

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zfs-backup   504G   440G     47     36   272K  2.74M
  xvdf       504G   440G     47     36   272K  2.74M
logs            -      -      -      -      -      -
  xvdg          0  4.97G      0      0      0      0
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zfs-backup   504G   440G     44     37   236K  2.50M
  xvdf       504G   440G     44     37   236K  2.50M
logs            -      -      -      -      -      -
  xvdg          0  4.97G      0      0      0      0
----------  -----  -----  -----  -----  -----  -----

修改

dd测试表明速度相当不错。

# dd if=/dev/zero of=/mnt/zfs/docstore/10GB_test bs=1M count=10240
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB) copied, 29.3561 s, 366 MB/s

然而,iostat输出的带宽变化不大。注意更多的写操作。

# zpool iostat -v 10
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zfs-backup   529G   415G      0     40  1.05K  2.36M
  xvdf       529G   415G      0     40  1.05K  2.36M
logs            -      -      -      -      -      -
  xvdg          0  4.97G      0      0      0      0
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zfs-backup   529G   415G      2    364  3.70K  3.96M
  xvdf       529G   415G      2    364  3.70K  3.96M
logs            -      -      -      -      -      -
  xvdg          0  4.97G      0      0      0      0
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zfs-backup   529G   415G      0    613      0  4.48M
  xvdf       529G   415G      0    613      0  4.48M
logs            -      -      -      -      -      -
  xvdg          0  4.97G      0      0      0      0
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zfs-backup   529G   415G      0    490      0  3.67M
  xvdf       529G   415G      0    490      0  3.67M
logs            -      -      -      -      -      -
  xvdg          0  4.97G      0      0      0      0
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zfs-backup   529G   415G      0    126      0  2.77M
  xvdf       529G   415G      0    126      0  2.77M
logs            -      -      -      -      -      -
  xvdg          0  4.97G      0      0      0      0
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zfs-backup   529G   415G      0     29    460  1.84M
  xvdf       529G   415G      0     29    460  1.84M
logs            -      -      -      -      -      -
  xvdg          0  4.97G      0      0      0      0
----------  -----  -----  -----  -----  -----  -----

2 个答案:

答案 0 :(得分:2)

  

它可以在VPS上表现良好,还是ZFS设计时考虑到裸机?

两者都是。

最初它是专为裸机而设计的,那就是你自然会获得最佳性能和完整功能集(否则你必须信任底层存储,例如,如果在请求同步写入时写入真的提交到磁盘)。虽然它非常灵活,因为您的vdev可以包含您可用的任何文件或设备 - 当然,性能只能与底层存储一样好。

需要考虑的一些要点:

  • 在不同的ZFS文件系统之间移动文件始终是完整的复制/删除,而不仅仅是重新排列链接(不适用于您的情况,但可能在将来)
  • 同步写入比异步慢得多(ZFS必须等待提交每个请求,并且不能以通常的方式排队写入*),并且只能通过将ZFS意图日志移动到专用来加速vdev适用于高写入IOPS,低延迟和高耐久性(在大多数情况下,这将是SLC SSD或类似,但它可以是与池中已有设备不同的任何设备)。具有普通磁盘且可以轻松饱和110 MB / s异步的系统可能具有大约0.5到10 MB / s的同步性能(取决于vdev),而无需将ZIL分离到专用SLOG设备上。因此,我不会认为你的价值观与众不同。
  • 即使有良好的硬件,ZFS也不会像简单的文件系统那样快,因为灵活性和安全性的开销。 Sun从一开始就说明了这一点,不应该让你感到惊讶。如果您重视任何表现,请选择其他内容。
  • 相关文件系统的块大小会影响性能,但我手边没有可靠的测试编号。
  • 更多RAM对您没有多大帮助(超过系统本身约1 GB的低阈值),因为它仅用作读取缓存(除非您启用了重复数据删除)

建议:

  • 为池使用更快(虚拟)的磁盘
  • 使用不同的(虚拟)设备将ZIL与普通池分开,最好比池快,但即使是速度相同但未链接到其他设备的设备也会改善您的情况
  • 使用async而不是同步并在您自己的事务(或相当大的块)之后验证它

*)更确切地说:一般来说,在从RAM写入磁盘之前,所有小于一定大小的小同步写入都会在ZIL中收集,每隔五秒或大约4 GB发生一次,以先到者为准(所有那些参数可以修改)。这样做是因为:

  • 每隔5秒从RAM到旋转磁盘的写入可以是连续的,因此比小写入更快
  • 如果突然断电,中止的飞行中交易将保存在ZIL中,并可在重新启动时重新应用。这类似于具有事务日志的数据库,并保证文件系统的一致状态(对于旧数据)以及没有要写入的数据(对于新数据)。

通常ZIL驻留在池本身上,应该使用冗余vdev进行保护,使整个操作对于断电,磁盘崩溃,位错误等非常有弹性。缺点是池磁盘需要随机执行在更高效的连续传输中将相同的数据刷新到磁盘之前的小写入 - 因此建议将ZIL移动到另一个设备上 - 通常称为SLOG设备( S eparate LOG 设备)。这可能是另一个磁盘,但是SSD在这个工作负载下表现得更好(并且会很快磨损,因为大多数事务正在通过它)。如果您从未遇到过崩溃,那么您的SSD将永远不会被阅读,只能写入。

答案 1 :(得分:1)

这个特殊问题可能是由于吵闹的邻居造成的。作为一个t2实例,你将获得最低优先级。在这种情况下,您可以停止/启动实例以获取新主机。

除非您正在使用实例存储(无论如何都不是t2实例的选项),所有磁盘写入都是基本上是SAN卷。 EBS系统的网络接口由同一主机上的所有实例共享。实例的大小将决定实例的优先级。

如果从一个卷写入另一个卷,则通过同一个接口传递所有读写流量。

根据您拥有的卷类型以及您的t2实例上是否还有任何CPU积分,可能还有其他因素在起作用