我有一个基于Solaris 11 ZFS的NAS设备,配有12x1TB的7.2k rpm SATA驱动器。
它提供了来自同一池的两项服务 – 一个用于小型VM场的NFS服务器和一个用于承载共享文件的小型团队的CIFS服务器。 ZFS已经删除了cif文件,而NFS ZFS文件系统已经删除了。 压缩到处都是。 我每天快照每个文件系统并保留最近的14个快照。
如果我正在移动,复制或删除大量数据,而直接SSH进入NAS,则会遇到性能问题。 基本上,这个过程似乎阻止了所有其他的IO操作,甚至是由于它们接收到磁盘超时而导致虚拟机停滞。
我有几个理论,为什么应该这样,但是我希望能够对下一步可能做的事情有所了解。
或者:
1)硬件不够好。 我不太确信 – 这个系统是一个带有30GB RAM的HP X1600(单Xeon CPU)。 虽然驱动器只有7.2k SATA,但每个驱动器最多可以推送80个IOPS,这应该足够了。 很高兴被certificate是错误的。
2)我configuration错了 – 更可能。 是否值得在任何地方进行去除? 我正在假设RAM =有利于重复数据删除,因此给予了合理的内存分配。
3)Solaris在调度IO方面很愚蠢。 是否有可能本地rm命令完全阻止IO到nfsd? 如果是这样,我该如何改变呢?
选项#2是最有可能的原因。 当重复数据删除表(DDT)完全适合内存时,重复数据删除效果最佳。 如果没有,那么它会溢出到磁盘上,并且必须到磁盘的DDT查找速度非常慢,并且会产生阻塞行为。
我认为30G的RAM很多,但是DDT的大小直接取决于被删除的数据量以及重复数据删除的效果。 重复数据删除属性设置在数据集级别,但查找是在整个池中完成的,所以只有一个池级别的DDT。
在计算DDT大小时,请参阅此zfs-discuss线程 。 本质上,它是池中每个唯一块的一个DDT条目,所以如果您有大量数据但重复数据比率较低,则意味着更多独特的块,从而产生更大的DDT。 系统试图将DDT保存在RAM中,但是如果应用程序需要内存,则可能会将其中的一部分驱逐出去。 拥有L2ARCcaching可以帮助防止DDT进入主池磁盘,因为它将被从主内存(ARC)逐出到L2ARC。
有一点需要记住,ZFS和快照是没有任何东西是免费的,当你删除大量的数据,并期望快照继续为你保留这些数据,特别是当你有大量的快照时你的删除,快照必须相应地更新,以反映文件系统的变化。 我假设你有6个VDEV,基本上6个镜像在池中,这意味着你实际上必须针对所有磁盘执行这些改变,因为数据在每个VDEV上都是相当均匀的。 随着去除,情况变得更复杂,特别是如果比例好,如果比例不好,不要使用它。 从本质上讲,如果比例是好的或好的,那么就有大量的引用,所有这些都是元数据,它们都需要更新,以及快照和快照相关的元数据。 如果你的文件系统有小块,情况会变得更加复杂,因为文件的数量。 对于4K块数据集与128K数据集相比要大得多。
基本上,你可以做的事情很less,除了:1)添加高性能SSD作为caching设备,并调整文件系统使用caching设备,除了元数据外,2)减less大的删除/销毁操作,3)考虑使用重复数据删除。 但是,您不能简单地禁用池或文件系统上的重复数据删除。 如果在整个池中启用,则必须重新创build池,或者如果在单个文件系统上设置销毁和重新创build文件系统将解决问题。
在Nexenta,当我们向客户推荐重复数据删除时,我们非常谨慎。 有很多情况下,这是一个辉煌的解决scheme,客户不能没有它。 而在这种情况下,我们经常有客户使用96GB或更多的RAM,以维护更多的元数据,并将DDT存储在RAM中。 一旦滴滴涕元数据被推到旋转媒体上,一切就会停止。 希望这可以帮助。