Oracle® Solaris 11.2 可调参数参考手册

退出打印视图

更新时间: 2014 年 12 月
 
 

确保闪存设备和 NVRAM 存储设备具有正确的高速缓存刷新行为

ZFS 设计为与管理磁盘级高速缓存的存储设备一起使用。通常,ZFS 会通过请求高速缓存刷新来要求存储设备确保已将数据安全地放置到稳定的存储器上。对于 JBOD 存储而言,这种方式符合预期且不会出现任何问题。对于许多基于 NVRAM 的存储阵列而言,如果此类阵列接受高速缓存刷新请求并实际做出相应的操作而不是忽略该请求,则可能会出现性能问题。一些存储阵列会应要求刷新其大型高速缓存,而不考虑 NVRAM 保护使这些高速缓存与稳定存储器一样稳定的事实。

当 uberblock 更新后,ZFS 会以较低的频率发出刷新(如每 5 秒)。由于刷新频率很低,所以此处不需要考虑进行调优。ZFS 还会在每次应用程序请求同步写入(O_DSYNCfsync、NFS 提交等)时发出刷新。应用程序将等待此类刷新完成,因而会影响性能。实际上,影响就是这么大。从性能的角度来看,这抵消了采用基于 NVRAM 的存储的优点。

最近有证据表明,当闪存设备用作日志设备时,高速缓存刷新调优有助于提高闪存设备性能。当向 ZFS 公开的所有 LUN 均来自受 NVRAM 保护的存储阵列,并且有措施确保将来不会添加任何不受保护的 LUN 时,可以通过设置 zfs_nocacheflush 将 ZFS 调优为不发出刷新请求。如果向 ZFS 公开的一些 LUN 不受 NVRAM 保护,则此调优操作可能会导致数据丢失、应用程序级别的损坏,甚至池损坏。在某些受 NVRAM 保护的存储阵列中,高速缓存刷新命令是一个空操作,因此这种情况下的调优操作不会对性能产生任何影响。

最近的 OS 更改是:刷新请求语义能够指示存储设备忽略请求(如果它们具有适当的保护)。此更改要求修复磁盘驱动程序,以使 NVRAM 设备支持更新的语义。如果 NVRAM 设备不识别此改进,请使用以下说明来告知 Solaris OS 不要向阵列发送任何同步高速缓存命令。如果要使用这些说明,请确保所有目标 LUN 确实受 NVRAM 保护。

有时,闪存设备和 NVRAM 设备未正确地向 OS 通告它们为非易失性设备,且无需刷新高速缓存。高速缓存刷新操作会消耗很多资源。在某些情况下,不必要的刷新会极大地影响性能。

在应用下面的调优项之前,请查看以下 zfs_nocacheflush 语法限制:

  • 下面的调优语法可以包含在 sd.conf 中,但每个供应商/产品只能有一个 sd-config-list 条目。

  • 如果需要多个设备条目,可以使用以下语法在同一行上指定多对供应商 ID 和 sd 调优字符串:

    #              "012345670123456789012345","tuning    ",
    sd-config-list="|-VID1-||-----PID1-----|","param1:val1, param2:val2",
                   "|-VIDN-||-----PIDN-----|","param1:val1, param3:val3";

    确保供应商 ID (VID) 字符串填充为 8 个字符,产品 ID (PID) 字符串填充为 16 个字符,如上例所示。


Caution

注意  -  设备将忽略所有高速缓存同步命令。使用时需自担风险。


  1. 使用 format 实用程序对存储阵列中的 LUN 运行 inquiry 子命令。例如:

    # format
    .
    .
    .
    Specify disk (enter its number): x
    format> inquiry
    Vendor:   ATA
    Product:  Marvell
    Revision: XXXX
    format>
  2. 基于您的体系结构选择以下操作之一:

    • 对于所有设备,将文件 /kernel/drv/sd.conf 复制到 /etc/driver/drv/sd.conf 文件。

    • 对于 F40 闪存设备,将以下项添加到 /kernel/drv/sd.conf 中。在下面的项中,确保 ATA 填充为 8 个字符,3E128-TS2-550B01 包含 16 个字符。字符串总长度为 24 个字符。

      sd-config-list="ATA  3E128-TS2-550B01","disksort:false, cache-nonvolatile:true, physical-block-size:4096";
    • 对于 F80 闪存设备,将以下项添加到 /kernel/drv/sd.conf 中。确保 ATA 填充为 8 个字符,3E128-TS2-550B01 包含 16 个字符。字符串总长度为 24 个字符。

      sd-config-list="ATA  2E256-TU2-510B00","disksort:false, cache-nonvolatile:true, physical-block-size:4096";
      
    • 对于 F20 和 F5100 闪存设备,基于您的体系结构选择以下操作之一。在下面的项中,ATA 填充为 8 个字符,MARVELL SD88SA02 包含 16 个字符。字符串总长度为 24 个字符。

    • 将以下项添加到 /etc/driver/drv/sd.conf

      sd-config-list="ATA  MARVELL SD88SA02","throttle-max:32, disksort:false, cache-nonvolatile:true";
  3. 如上所示,在 sd-config-list 条目中,小心地添加空格,使供应商 ID (VID) 长度为 8 个字符(此处为 ATA),并使产品 ID (PID) 长度为 16 个字符(此处为 MARVELL)。

  4. 重新引导系统。

    可将 zfs_nocacheflush 调整回其缺省值 (0),而不会对性能造成不利影响。

  5. 确认刷新行为正确。

    使用Appendix A, 系统检查脚本中提供的脚本进行验证。