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 statuspool: tankstate: ONLINEscan: scrub repaired 0 in 1h8m with 0 errors on Sun Dec  2 01:08:26 2012
config:NAME                                              STATE     READ WRITE CKSUMpool                                              ONLINE       0     0     0raidz1-0                                        ONLINE       0     0     0sdd                                           ONLINE       0     0     0sde                                           ONLINE       0     0     0sdf                                           ONLINE       0     0     0sdg                                           ONLINE       0     0     0logsmirror-1                                        ONLINE       0     0     0ata-OCZ-REVODRIVE_OCZ-69ZO5475MT43KNTU-part1  ONLINE       0     0     0ata-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 tankcapacity     operations    bandwidth
tank                                              alloc   free   read  write   read  write
------------------------------------------------  -----  -----  -----  -----  -----  -----
tank                                               839G  2.81T     76      0  1.86M      0raidz1                                           839G  2.81T     73      0  1.81M      0sdd                                               -      -     52      0   623K      0sde                                               -      -     47      0   620K      0sdf                                               -      -     50      0   623K      0sdg                                               -      -     47      0   620K      0
logs                                                  -      -      -      -      -      -mirror                                          1.46M  3.72G     20      0   285K      0ata-OCZ-REVODRIVE_OCZ-69ZO5475MT43KNTU-part1      -      -     20      0   285K      0ata-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。我将在下一篇文章中讨论。

ZFS管理手册:第三章ZIL相关推荐

  1. MySQL 5.6 手册 第三章 目录

    Chapter 3 Tutorial 第三章 辅导教程 Table of Contents 目录   3.1 Connecting to and Disconnecting from the Serv ...

  2. Android 渗透测试学习手册 第三章 Android 应用的逆向和审计

    第三章 Android 应用的逆向和审计 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 在本章中,我们将查看 Android 应用程序或.apk文件,并了解其不同的 ...

  3. C# 线程手册 第三章 使用线程 实现一个数据库连接池(实战篇)

    在企业级软件开发过程中,为了改善应用程序的性能需要通常使用对象池来控制对象的实例化.例如,在我们每次需要连接一个数据库时都需要创建一个数据库连接,而数据库连接是非常昂贵的对象.所以,为了节省为每次数据 ...

  4. C# 线程手册 第三章 使用线程

    概要 在之前章节,我们已经讨论过线程在开发多用户应用程序时扮演的重要角色.我们已经使用线程来解决一些重要的问题,比如让多个用户或者客户端在同一时间访问同一个资源.然而,在学习过程中我们忽略了一个问题, ...

  5. Linux/Unix系统编程手册 第三章:系统编程概念

    本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...

  6. Hazelcast IMDG参考中文版手册-第三章-概述

    Hazelcast是一个开源的内存数据网格(IMDG).它提供弹性可扩展的分布式内存计算,被广泛认为是应用程序性能最快,最具扩展性的方法.Hazelcast在开源中做到这一点.更重要的是,Hazelc ...

  7. GNU make 中文手册 第三章:Makefile 总述

    一.Makefile 总述 3.1 Makefile 的内容 在一个完整的 Makefile 中,包含了 5 个东西:显式规则.隐含规则.变量定义.指示符和注释.关于"规则".&q ...

  8. C# 线程手册 第三章 使用线程 Monitor.TryEnter()

    Monitor 类的TryEnter() 方法在尝试获取一个对象上的显式锁方面和 Enter() 方法类似.然而,它不像Enter()方法那样会阻塞执行.如果线程成功进入关键区域那么TryEnter( ...

  9. [云炬创业管理笔记]第三章打造优秀创业团队讨论4

最新文章

  1. 一般筛法求素数+快速线性筛法求素数
  2. 【css】padding 和 margin的区别
  3. 北斗三号系统第九、十颗组网卫星三大看点
  4. Android开发--Wifi的操作
  5. java中ssh如何理解
  6. 元宇宙iwemeta: 2021年云计算行业发展研究报告
  7. fastjson的@JSONField注解
  8. CDN技术之--流媒体CDN系统的组成
  9. ansible软件部署
  10. 支付宝上线新功能:家长们放心了!
  11. 为什么 Python 不用设计模式?
  12. 数据库表迁移到阿里云的方法有哪些
  13. linux杂谈(十七):iscsi存储分离技术
  14. 修改Win10系统文件夹C:\Users\下用户名为中文方法
  15. 小功能⭐️U3D异步加载功能
  16. 如何避免成为背锅侠?
  17. http-proxy-middleware
  18. Centos7安装MySql8出现失败处理
  19. 【硬件】如何使用MOS管作为开关控制?如何看懂参数?如何MOS管选型?(从原理上分析)
  20. 通信原理(5)—— 数字带通传输系统(ASK/FSK/PSK/DPSK)

热门文章

  1. 学计算机用什么笔记本电脑,办公学习笔记本电脑怎么选择 数码师精选推荐
  2. python 二维列表(数组)赋值问题
  3. ios7再现大bug:iPhone大面积“激活出错”
  4. Python 教程之 Pandas(10)—— 访问 series 的元素
  5. Unity中基于三角剖分 实现三维城市实时构建
  6. 计算机控制面板的字体在哪里,控制面板中哪里有字体文件夹?
  7. knockout.js实例二~购物车
  8. SpringBoot thymeleaf页面下拉框使用枚举类
  9. 《大数据》“数据立法”专题征文(截止日期:2023年6月30日)
  10. 轻轻回首,重重抬眸,只做自己——2021,QGIS课堂和你在一起