ZFS管理手册:第三章ZIL 翻译
最新推荐文章于 2026-07-31 08:06:48 发布
阅读量2.2k
收藏
2
1赞
-
-
Kyle__Shaw
码龄17年
关注
ZFS管理手册:第三章ZIL
术语
在开始之前,我们需要了解一些在论坛、博客帖子、邮件列表和一般性讨论中似乎令人困惑的术语。它把我搞糊涂了,直到我写这篇文章的时候,我才真正的明白。所以,让我们开始吧:
- ZFS Intent Log 或
ZIL: 一种日志记录机制,其中记录着所有要写入的数据,然后以事务的方式写入到存储中,保证了一致性。在功能上类似于日志文件系统的日志,如ext3或ext4。通常它都是存储硬盘上。ZIL由指向记录列表得ZIL头部、zil块和zil尾部组成。ZIL对于不同的写入具有不同的行为。对于小于64KB的写入(默认情况下),ZIL会存储写入的数据。对于较大的写入,写入的数据不存储在ZIL中,而是ZIL在日志记录中维护指向存储中同步数据的指针。 - Separate Intent Log 或
SLOG: 一种单独的日志记录设备,用于在将ZIL的同步部分刷新到较慢的磁盘之前对其进行缓存。在将 ZIL 的同步部分刷新到较慢的磁盘之前缓存它们。这应该用一个电池供电的DRAM驱动器或一个SSD。SLOG只缓存同步数据,不缓存异步数据。异步数据将直接刷新到磁盘。此外,块被作为一个整体一次性写入,而不是作为同步事务写入SLOG。如果slog存在,ZIL将被移到其中,而不是保存在普通的硬盘上。SLOG中的所有内容都将始终保存在系统内存中。
SLOG 设备
哪款设备最适合 SLOG?从最快到最慢的顺序,我的意见如下:
- NVRAM-有备用电源的DRAM驱动器,如STEC的ZeusRAM固态硬盘。这份名单中最快、最可靠的。也是最贵的。
- 固态硬盘-基于NAND闪存的芯片,具有损耗均衡算法。类似于PCI-Express OCZ固态硬盘或英特尔。最好是SLC,尽管SLC和MLC固态硬盘之间的差距正在变小。
- 10K以上SAS驱动器-企业级旋转盘式磁盘。SAS和光纤通道驱动器将IOPS推向吞吐量,速度通常是消费级SATA的两倍。在这份名单中最慢、最不可靠的。也是最便宜的。
重要的是要确定上面列出的所有三种设备都可以在停电期间保持数据持久性。SLOG和ZIL对于将您的数据传输到最终的存储至关重要。如果发生停电,并且您有一个不稳定的工作负载,最糟糕的情况是新数据没有刷新,而您只剩下旧数据。然而,重要的是要注意,在停电的情况下,您不会有损坏的数据,只是丢失了数据。您的数据在磁盘上仍将保持一致。
SLOG 性能
因为Slog是性能很好的存储,所以我可以期望我的应用程序或系统具有什么样的性能呢?那么,您将看到磁盘延迟、磁盘利用率和系统负载的提升。您不会看到的是吞吐量的提高。请记住,SLOG设备仍在每隔5秒将数据刷新到盘片。因此,在添加slog设备之后对磁盘进行基准测试没有多大意义,除非基准测试的目标是测试同步磁盘的写入延迟。所以,我没有那些数字让你去胡思乱想。然而,我手头上只有几张图表。
我有一个写入密集型的虚拟机。它是ZFS dataset 上的GlusterFS复制文件系统上的磁盘映像。我的管理程序中有足够的RAM,一个速度很快的CPU,但SATA磁盘速度很慢。由于该虚拟机上的应用程序希望频繁地将许多图片写入磁盘,随着图片数量的增长,我看到了大约5-10秒的磁盘延迟。磁盘上的吞吐量非常大。因此,在VM中执行任何写入操作都是痛苦的。系统升级,修改配置文件,甚至登录,这一切都变得非常非常缓慢。
因此,我对我的SSD进行了分区,并添加了slog。我的磁盘延迟立即下降到200毫秒左右。磁盘利用率从50%左右下降到5%左右。系统负载从1-2下降到几乎不存在。与磁盘有关的一切都处于更加健康的状态,并且VM也能够正常使用了。作为证据,请看这里从http://zen.ae7.st/munin/ 保存的以下图表
第一个图像从管理程序的角度显示了我的磁盘的使用情况。请注意,每个设备的吞吐量约为800 KBps。添加SSD Slog后,吞吐量降至400 KBps。这意味着池中的底层磁盘执行的工作较少,因此将持续更长时间。

上图显示了管理程序上zpool中的所有4个磁盘的吞吐量。
下一张图从虚拟机的角度显示了我的磁盘。请注意,如上所述,磁盘延迟和利用率是如何下降的,包括系统负载。

上图显示了虚拟机系统负载和利用率的变化。
就在几天前,我在博客 http://pthree.org/2012/12/03/how-a-zil-improves-disk-latencies/ 上写了一篇关于文章专门解析这个现象。
添加SLOG
警告:某些主板在重新启动后会以不同方式向Linux内核注册磁盘。因此,在一次引导时标识为/dev/sda的磁盘在下一次引导时可能是/dev/sdb。对于存储数据的主池,这不是问题,因为ZFS可以根据元数据拓扑信息重建VDEV。然而,对于您的L2ARC和SLOG设备,不存在这样的元数据。所以与其通过它们的/dev/sdX将它们添加到池中,更应该使用/dev/disk/by-id/里的设备(实际上这是一个符号连接,指向/dev/sdX) ,把它添加到对应的Zpool中。如果您不注意此警告,您的slog设备可能根本没有添加到您的混合池中,您只能在后续把设备重新加入到池中。是否存在性能很好的SLOG,将很大程度的影响到应用程序的性能。
将slog添加到已有zpool并不困难。但是,mirror slog被认为是最佳做法。因此,在本例中,我将遵循最佳实践。假设我的池中有4个硬盘,以及一个向系统提供两个60 GB驱动器的OCZ RevoDrive SSD。我将对SSD上的驱动器进行5 GB的分区,然后将分区以mirror的方式组成SLOG设备。这就是如何将slog添加到池中。在这里,我首先使用GNU parted创建在SSD上分区,然后把SSD的分区添加到池中。/dev/disk/by-id/中的设备实际上是指向/dev/sda和/dev/sdb。
# parted /dev/sda mklabel gpt mkpart primary zfs 0 5G
# parted /dev/sdb mklabel gpt mkpart primary zfs 0 5G
# zpool add tank log mirror \
/dev/disk/by-id/ata-OCZ-REVODRIVE_OCZ-69ZO5475MT43KNTU-part1 \
/dev/disk/by-id/ata-OCZ-REVODRIVE_OCZ-9724MG8BII8G3255-part1
# zpool status
pool: tank
state: ONLINE
scan: scrub repaired 0 in 1h8m with 0 errors on Sun Dec 2 01:08:26 2012
config:
NAME STATE READ WRITE CKSUM
pool ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
sdg ONLINE 0 0 0
logs
mirror-1 ONLINE 0 0 0
ata-OCZ-REVODRIVE_OCZ-69ZO5475MT43KNTU-part1 ONLINE 0 0 0
ata-OCZ-REVODRIVE_OCZ-9724MG8BII8G3255-part1 ONLINE 0 0 0
SLOG预期寿命
由于您可能会在GNU/Linux服务器中使用消费级SSD作为你的SLOG,因此我们需要考虑SSD在写入密集型场景中的损耗。当然,这在很大程度上会根据制造商的不同而有所不同,但我们可以考虑一下常见的情况。
首先也是最重要的是,ZFS拥有先进的损耗均衡算法,可以均匀地固态硬盘上的每个芯片。它实际上是支持对所有对象进行垃圾收集,因此它不需要支持Trim。由于文件系统的写入时复制特性,ZFS的损耗平衡是内部已实现的。
其次,不同的驱动器将采用不同的纳米工艺。纳米工艺越小,固态硬盘的寿命就越短。例如,Intel 320是一款25纳米的MLC 300 GB固态硬盘,额定值约为5000个P/E周期。这意味着如果使用磨损均衡算法,您可以向整个SSD写入5000次。这将产生1500000 GB的总写入数据,即1,500 TB。我的ZIL每秒维护大约3MB的数据。因此,我每年可以维护大约95 TB的写入数据。这让我的英特尔固态硬盘的寿命大约为15年。
然而,Intel 335是一款20纳米的MLC 240 GB固态硬盘,其额定值约为3000个P/E周期。使用磨损均衡,这意味着您可以对整个SSD进行3000次写入,从而产生720 TB的总写入数据。对于我的3 Mbps zil来说,这只有7年的时间,不到Intel 320预期寿命的一半。重点是,当你计划你的池时,你需要注意这些东西。
现在,如果您使用的是有备用电源的DRAM驱动器,则损耗均衡不是问题,并且DIMM可以持续工作到服务器关机前的最后一刻。10k+的SAS或FC驱动器可能也是如此。
容量
简单地说,你可能不需要很大的ZIL。我只用4 GB的可用空间作为我的SLOG,而实际上只用到了其中了1-2 MB。我把我的所有虚拟机放在同一个管理程序上,运行操作系统升级,同时他们也在做大量的工作,并且只看到ZIL大约只有100MB的缓存数据。我无法想象您的ZIL需要什么样的工作负荷才能使用超过1 GB的缓存空间,更不用说我分区出的4 GB空间了。您可以运行下面的命令来检查ZIL的大小:
# zpool iostat -v tank
capacity operations bandwidth
tank alloc free read write read write
------------------------------------------------ ----- ----- ----- ----- ----- -----
tank 839G 2.81T 76 0 1.86M 0
raidz1 839G 2.81T 73 0 1.81M 0
sdd - - 52 0 623K 0
sde - - 47 0 620K 0
sdf - - 50 0 623K 0
sdg - - 47 0 620K 0
logs - - - - - -
mirror 1.46M 3.72G 20 0 285K 0
ata-OCZ-REVODRIVE_OCZ-69ZO5475MT43KNTU-part1 - - 20 0 285K 0
ata-OCZ-REVODRIVE_OCZ-9724MG8BII8G3255-part1 - - 20 0 285K 0
------------------------------------------------ ----- ----- ----- ----- ----- -----
总结
快速SLOG可以为需要较低同步事务延迟的应用程序性能有惊人的提升。这对于对时间更敏感的数据库服务器或其他应用程序非常有效。但是,将Slog添加到您的池中会增加成本。电池供电的DRAM芯片非常非常昂贵。通常每8 GB DDR3 DIMM的价格约为2,500美元,其中40 GB MLC固态硬盘的价格仅为100美元,而600 GB 15k SAS驱动器的价格为200美元。尽管如此,容量确实不是问题,而性能才是问题。我会选择更快的IOPS,更小容量的的SSD作为SLOG。这里有一个好的提议,你可以对它进行分区,并在同一个驱动器上共享L2ARC。我将在下一篇文章中讨论。


发送