ZFS性能:我是否需要在池或文件系统中保留可用空间?


17

我知道ZFS的性能在很大程度上取决于可用空间的数量:

保持池空间利用率不超过80%,以保持池性能。当前,当池非常满并且文件系统频繁更新时(例如在繁忙的邮件服务器上),池性能可能会下降。满池可能会导致性能下降,但不会造成其他问题。[...]请记住,即使大多数静态内容在95-96%的范围内,写入,读取和重新同步的性能也可能会受到影响。ZFS_Best_Practices_Guide,solarisinternals.com(archive.org)

现在,假设我有一个10T的raidz2池,托管一个ZFS文件系统volume。现在,我创建一个子文件系统,volume/test并为其保留5T。

然后,我将每个NFS的两个文件系统都安装到某个主机上并执行一些工作。我了解我不能写volume超过5T的字,因为剩余的5T保留给volume/test

我的第一个问题是,如果我的volume装载点达到〜5T ,性能将如何下降?它会丢失,因为该文件系统中没有可用空间来存储ZFS的写时复制和其他元数据吗?还是会保持不变,因为ZFS可以使用为保留的空间中的可用空间volume/test

现在第二个问题。如果按以下方式更改设置,会有所不同吗?volume现在有两个文件系统,volume/test1volume/test2。两者都分别获得3T预订(但没有配额)。假设现在,我将7T写入test1。两个文件系统的性能是否相同,或者每个文件系统的性能都不同?它会下降还是保持不变?

谢谢!

Answers:


9

是。您需要在池中保留可用空间。它主要用于写时复制操作和快照。性能下降时利用率约为85%。您可以走得更高,但是会产生一定的影响。

不要搞定保留。尤其是使用NFS。这不是必需的。也许是zvol,但不是NFS。

不过,我看不到混乱。如果您有10T,请不要使用其中的85%以上。使用配额限制使用量,适当调整份额大小。或者不使用任何配额来监视的整体使用情况。


谢谢!在我们的设置中,使用配额没有公平的方法,因此每个人都使用相同的挂载点并可以填满空间,从而导致性能下降。我的想法是保留一定的可用空间,以使整个系统永远不会变慢。但是IIUC,我可以通过限制volume为8.5T 来获得保证,而再也不必考虑它了。那是对的吗?
帕维尔

你可以..或者只是看。我的意思是,它是NFS ...而不是zvol,因此您可以删除文件以恢复到8.5TB以下。
ewwhite

是的,但是每两周在邮件列表中进行这些“请清理您的sh ..,文件服务器非常慢”的讨论是很痛苦的……
Pavel

解决社会/行政问题的技术解决方案:)您是否聚集了这么多数据?
ewwhite

呵呵,是的,这是我们面临的非常普遍的情况。因此,有这样的说法:“在具有许多文件创建和删除功能的文件系统上,利用率应保持在80%以下以保护性能。” 不精确,因为它实际上是关于池中而不是文件系统中的可用空间的?
帕维尔

21

当您的zpool太满或非常零碎时,就会发生性能下降。这样做的原因是ZFS所采用的自由块发现机制。与其他文件系统(例如NTFS或ext3)相对,没有块位图显示哪些块已占用,哪些块已空闲。相反,ZFS将zvol划分为(通常为200个)较大的区域,称为“元实验室”,并在每个metaslab中存储包含免费块信息(空间图)的AVL树1。平衡的AVL树允许有效搜索适合请求大小的块。

尽管出于规模原因选择了该机制,但是不幸的是,当发生高水平的碎片和/或空间利用时,它也是一个主要的难题。一旦所有metaslab都承载大量数据,您就会获得大量的小块空闲块,而池为空时会获得少量的大块块。如果ZFS随后需要分配2 MB的空间,它将开始读取和评估所有metaslab的空间图,以找到合适的块或将2 MB分成较小块的方法。这当然需要一些时间。更糟糕的是,由于ZFS确实会从物理磁盘读取所有空间映射,因此将花费大量I / O操作。对于您的任何写作。

性能下降可能会很大。如果您喜欢漂亮的图片,请查看Delphix上的博客文章,其中有一些数字摘自(过于简化但有效的)zfs池。我无耻地偷了其中一张图-看这张图中的蓝色,红色,黄色和绿色线,它们分别代表以10%,50%,75%和93%的容量相对于写入吞吐量绘制的池。随着时间的流逝,KB / s变得碎片化: zpool性能下降

传统上,此问题的快速解决方法是metaslab调试模式(echo metaslab_debug/W1 | mdb -kw在运行时发布,可立即更改设置)。在这种情况下,所有空间映射都将保留在OS RAM中,从而消除了每次写入操作时对过多且昂贵的I / O的需求。最终,这还意味着您需要更多的内存,尤其是对于大型池,因此它有点像用于存储交易的RAM。您的10 TB池可能会花费2-4 GB的内存2,但是您可以轻松地将其驱动到95%的利用率。


1比较复杂,如果您有兴趣,请查看Bonwick在空间地图上的帖子以了解详细信息

2如果您需要一种计算内存上限的方法,请使用它zdb -mm <pool>来检索segments每个metaslab 中当前正在使用的数量,将其除以2以模拟最坏的情况(每个占用的段后接一个空闲段) ),将其乘以AVL节点的记录大小(两个内存指针和一个值,考虑到zfs的128位性质和64位寻址的总和为32个字节,尽管人们似乎通常认为某些字节为64个字节原因)。

zdb -mm tank | awk '/segments/ {s+=$2}END {s*=32/2; printf("Space map size sum = %d\n",s)}'

参考:基本概述包含在Markus Kovero在zfs-discuss邮件列表上的帖子中,尽管我相信他在计算中犯了一些错误,我希望可以在我的文章中予以纠正。


syneticon-dj,谢谢您的解释!增大RAM似乎确实有帮助。
帕维尔

BPR(块指针重写)呢?另外,这个blogs.kent.ac.uk/unseenit/2013/10/02/…提到使用SLOG进行ZIL也有帮助。这个家伙nex7.blogspot.com.au/2013/03/readme1st.html说,您只是发送和接收,直到一切正常为止。
CMCDragonkai 2014年

@CMCDragonkai我可以从经验中向您保证,使用单独的ZIL设备对由于空间图碎片导致的性能下降没有任何帮助。但是没有 ZIL设备会增加整体碎片,并且您更有可能在较低的空间利用率百分比上解决此问题。BPR仍然是蒸气软件-不存在可证明的代码,更不用说稳定的实现了。发送/接收周期确实可能有助于获得碎片整理池,但这意味着发送/接收的数据集会停机。
the-wabbit

如果您在发送数据到另一个磁盘之前复制了数据集该怎么办?然后只是旋转每个磁盘的发送-接收周期?
CMCDragonkai 2014年

@CMCDragonkai,您可以通过首先执行完整发送并在此之后使用增量缩短停机时间。但是停机时间仍然存在。如果您碰巧将数据集用作数据库或虚拟化的后端存储,那么即使时间很短,停机时间也会很麻烦。另外,您将需要一个单独的空池才能正常工作。
the-wabbit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.