我知道ZFS的性能很大程度上取决于可用空间的数量:
将池空间保持在80%以下,以保持池性能。 目前,如果池很满并且文件系统经常更新(例如,在繁忙的邮件服务器上),池性能可能会降低。 完整的池可能会导致性能损失,但没有其他问题。 […]请记住,即使大部分静态内容在95-96%的范围内,写入,读取和重新同步性能可能会受到影响。 ZFS_Best_Practices_Guide,solarisinternals.com
现在,假设我有一个承载ZFS文件系统volume的10T的raidz2池。 现在我创build一个子文件系统volume/test并给它一个5T的保留。
然后,我将每个NFS的两个文件系统安装到某个主机上,并执行一些工作。 我知道我不能写超过5T的volume ,因为剩下的5T被保留给volume/test 。
我的第一个问题是,如果我用〜5T填充我的volume装入点,性能如何下降? 它会下降,因为该文件系统中没有可用空间用于ZFS的“写时复制”和其他元文件? 还是会保持不变,因为ZFS可以在预留volume/test空间内使用空闲空间?
现在是第二个问题 。 如果我按照以下方式更改设置,是否有所作为? volume现在有两个文件系统, volume/test1和volume/test2 。 两者都给予3T的预订(但没有配额)。 现在假设,我写7T到test1 。 两个文件系统的性能是相同的,还是每个文件系统都不一样? 会下降还是保持不变?
谢谢!
是。 你需要保持你的游泳池的自由空间。 主要用于写入时拷贝操作和快照。 性能下降,利用率约为85%。 你可以走得更高,但有一个确定的影响。
不要乱保留。 特别是使用NFS。 这不是必需的。 也许是一个zvol,但不是NFS。
不过,我并没有看到混乱。 如果你有10T,不要用超过85%。 适当调整您的股票,使用配额限制其使用。 或者不要使用任何配额,并监控您的总体使用情况。
当zpool文件非常满或碎片很多时,性能就会降低。 原因是ZFS使用的空闲块发现机制。 与其他文件系统(如NTFS或ext3)相反,没有块位图显示哪些块被占用,哪些是空闲的。 相反,ZFS将你的zvol划分成(通常200个)更大的“metaslabs”区域,并在每个metaslab中存储空闲块信息(space map)的AVL-tree 1 。 平衡的AVL树允许有效地search符合请求大小的块。
虽然这个机制是出于规模的原因select的,不幸的是,当发生高度分散化和/或空间利用时,这也是一个主要的痛苦。 只要所有metaslabs都携带大量的数据,那么当游泳池为空时,您将获得大量的免费区块的小区域,而不是大量的大区域。 如果ZFS需要分配2 MB空间,那么它将开始读取和评估所有metaslabs的空间映射,以便find合适的块或将2 MB分解为更小块的方法。 这当然需要一些时间。 更糟糕的是,由于ZFS确实会读取物理磁盘上的所有空间映射,所以会花费大量的I / O操作。 对于你的任何写道。
performance的下降可能是显着的。 如果你喜欢漂亮的图片,可以看一看Delphix上的博客文章,它有一些数字取而代之 (过于简化但是有效的)zfs池。 我无耻地窃取其中一个图表 – 查看这个图表中的绿色,红色和黄色线条,这些线条代表的吞吐量分别为93%,75%和50%,以写入吞吐量(KB / s)
传统的metaslabdebugging模式(只需在运行时发出echo metaslab_debug/W1 | mdb -kw以便立即改变设置)。 在这种情况下,所有的空间映射将被保存在OS RAM中,从而消除了每次写入操作中过度和昂贵的I / O的需求。 最终,这也意味着你需要更多的内存,特别是对于大型的池,所以它是一种存储马交易的内存。 您的10TB池可能会花费2-4GB的内存2 ,但是您将能够将其驱动到95%的利用率,而没有太多的麻烦。
1有点复杂,如果你有兴趣的话,可以看看Bonwick在空间地图上的文章
2如果您需要一种方法来计算内存的上限,请使用zdb -mm <pool>来检索每个metaslab中当前正在使用的segments的数量,将其除以二来模拟最差情况(每个占用的分段之后是一个空闲的),将它乘以AVL节点的logging大小(两个存储器指针和一个值,假定zfs的128位特性和64位寻址总计为32个字节,尽pipe人们似乎由于某种原因通常假设为64字节)。
zdb -mm tank | awk '/segments/ {s+=$2}END {s*=32/2; printf("Space map size sum = %d\n",s)}'
参考文献: Markus Kovero在zfs-discuss邮件列表中包含了这篇文章的基本概要,尽pipe我相信他在计算中犯了一些错误,我希望在我的文章中纠正错误。