从硬件模拟的层面来看,ZFS可以看做是一个功能丰富、管理操作方便的磁盘阵列卡。
磁盘阵列卡是连接高速的系统"总线“和低速的”磁盘“设备的桥梁,为了平衡”总线“和”磁盘“之间的速度差异,改善磁盘存储系统的性能,效果最显著的解决方案莫过于在阵列卡上添加专用的高速缓存记忆体(RAM/NVRAM)。
ZFS作为一种软件模拟的磁盘阵列卡设备,虽然不能像物理设备那样直接在板卡上焊接内存芯片,但设计中任然充分考虑到了这方面的需求。今天我们就来深入了解下ZFS 的磁盘读写缓存技术。
本文的主要内容翻译自SUN 工程师Claudia Hildebrandt 的一份PDF文档。
![ZFS数据缓存(Part I)_ZFS](https://s2.51cto.com/attachment/201203/134204297.png?x-oss-process=image/resize,m_fixed,w_1184)
ZFS 混合存储池(Hybrid Storage Pools)
从本质上讲,混合存储这个概念不是什么新鲜事物,存储池也不是什么新鲜事物!
我们目前所使用的电子计算机都基于冯.诺依曼提出的计算组成结构的思想,从最快速的CPU的指令寄存器到现在基本已经被淘汰的龟速软盘,组成了一个容量和速度成反比例关系的多个阶梯不同硬件设备和存储介质的混合存储系统。而池的概念可以说是源自多线程编程中的进程数据共享技术,也可以说是源自操作系统的硬件虚拟化技术,磁带备份软件中的循环介质池,应该是我们最经常使用的一种存储池。
所以我们说混合存储池的概念并非是SUN的独家专利,其独到之处就在于通过将物理内存和SSD或NVRAM 用于存储池的读写缓存设备,内存、SSD和普通温切斯特硬盘巧妙得融合于单一文件系统下,提供了一种充分发挥各部分存储介质特性、兼顾性能和容量的廉价存储解决方案。
• Hybrid Storage Pools
> 融合 SSD
> 使用SSD作为ZIL提供独立的日志设备和写闪存加速器——又名Logzilla
> 使用SSD作为读闪存加速器——又名Readzilla
/*老外真是很喜欢搞怪,zilla应该是指怪兽哥斯拉吧,不过就企业级SSD以一当百(1百个15K SAS)的IOPS来说,的确可称之为怪兽!一开始我还以为是用的古吉拉特语。*/
现有OpenStorage产品的配置示例:
> 18 GB Logzilla
> 100 GB Readzilla
Logzilla
• ZFS 使用专门日志(ZIL-ZFS Intent Log)来实现POSIX同步(写)请求。
• ZIL 默认使用从主存储池中分配的数据块。
• 使用独立的ZIL设备将获得更好的性能,例如分配SSD或NVRAM设备作为ZIL。
•为存储池设置独立ZIL设备的命令示例如下:
# zpool add <pool_name> log <log_device1> <log_device2>
• 备注: 建议使用镜像的日志设备,目前尚不支持使用RAIDZ 冗余模式。
Readzilla
• 又名 L2ARC ,是位于内存缓存(ZFS ARC)和磁盘之间的第二级缓存。
• ZFS ARC – ZFS 可调整替代缓存
> 在屋里内存中存储的ZFS数据和来自所有活动存储池的元数据信息。默认得除了为系统保留1GB的内存,ZFS ARC将尽可能多得使用内存空间来缓存数据。
> 只要物理内存有空闲,ZFS ARC就会尽可能长期得消耗空闲内存作为数据缓存,并仅在其他应用程序请求更多内存资源时才会将占有的空闲内存释放交还给系统。
> 通过使用 Readzilla ,内存中的资料可以被移动并尽可能长时间的缓存到磁盘(SSD)上(只要磁盘还有空闲空间)
![ZFS数据缓存(Part I)_休闲_02](https://s2.51cto.com/attachment/201203/133803676.png?x-oss-process=image/resize,m_fixed,w_1184)
ARC 概述及用途
•ZFS 不使用类似UFS系统的页面缓存(例如:mmap(2))
• 活动替代缓存
> 基于FAST 2003上Megiddo & Modha (IBM)的技术论文
– ARC: 是一种能自我校正,低开销的可更换高速缓存技术
>
ZFS ARC 在技术实现上稍有不同
– ZFS: 缓存和数据大小可变,不会有数据溢出的情况
• 数据管理单元(DMU)使用基于设备虚拟地址(DVA)的ARC来缓存数据对象
• 每个系统有一个 ARC
• 2类最近最常使用(LRU)历史数据缓存 LRU
> 最近的(MRU) 和最频繁的(MFU)
– ARC 数据生存期大文件扫描
> 1c 缓存及1c历史数据(c = 缓存大小)
可调整替换缓存 (ARC )
• SPA(Storage Pool Allocator,存储池分配器)集中内存管理
> 能有力缓解系统处理内存缓冲的压力。
• 动态、自适应及自我调整
> 缓存调整基于I/O 负载
• 持久扫描
arc_buf 的6种状态
• ARC_anon :
> 缓存与设备虚拟地址(DVA)无关
> 保持写入存储设备前的藏数据块拷贝
> 被视为ARC_mru的一部分
• ARC_mru : 最近使用,当前已被缓存
• ARC_mru_ghost : 最近使用的,不再缓存
• ARC_mfu : 频繁使用,当前已被缓存
• ARC_mfu_ghost : 频繁被使用,不再缓存
• ARC_l2c_only : 仅存在于L2ARC中
• 影子缓存只包含ARC缓存数据结构头部的内容