DIY NAS系列11 — ZFS 性能监控与管理

ZFS 内存管理

ZFS (Zettabyte File System) 中,ZFS 本身并没有提供一个直接的命令来查看 “ZFS 内存占用”。但实际 ZFS 在 Linux 或 FreeBSD 系统上,通常主要消耗内存部分在于 ARC(Adaptive Replacement Cache),即:自适应替换高速缓存
我们可以通过控制 ARC 来实现对于 ZFS 内存限制。

ZFS 的 ARC 利用内存作为缓存,提高读写效率。您可以通过如下命令查看 ARC 的内存使用情况:

# 单位字节
❯ cat /proc/spl/kstat/zfs/arcstats | grep '^size '
size                            4    1071237456

# 转换成 GB,实际就是 1GB 内存
❯ awk '/^size / {printf "%.2f GB\n", $3/1024/1024/1024}' /proc/spl/kstat/zfs/arcstats
0.99 GB

# 可以通过 arc_summary 命令,查看缓存命中情况
❯ arc_summary
------------------------------------------------------------------------
ZFS Subsystem Report                            Mon May 26 14:43:03 2025
Linux 5.14.0-503.40.1.el9_5.x86_64                              2.1.16-1
Machine: nas (x86_64)                                           2.1.16-1

ARC status:                                                      HEALTHY
        Memory throttle count:                                         0 # 内存受限次数,受内存压力时计数,0 表示没有被限流

ARC size (current):                                   99.9 %  1023.2 MiB # 当前 ARC 实际占用内存
        Target size (adaptive):                       100.0 %    1.0 GiB # 自适应目标 ARC 大小
        Min size (hard limit):                         47.5 %  486.6 MiB # ARC 最小限制大小
        Max size (high water):                            2:1    1.0 GiB # ARC 最大限制大小(即 max cache size),1.0 GiB;2:1 指上限与下限比例
        Most Frequently Used (MFU) cache size:         59.4 %  491.9 MiB # MFU 区域大小,缓存最常用数据
        Most Recently Used (MRU) cache size:           40.6 %  335.9 MiB # MRU 区域大小,缓存最近使用数据
        Metadata cache size (hard limit):              75.0 %  768.0 MiB # 元数据缓存最大可用大小
        Metadata cache size (current):                 44.5 %  341.4 MiB # 当前元数据缓存实际大小
        Dnode cache size (hard limit):                 10.0 %   76.8 MiB # dnode 缓存上限
        Dnode cache size (current):                   129.9 %   99.8 MiB # 当前 dnode 缓存大小(数据块索引结构)

ARC hash breakdown:
        Elements max:                                             215.0k
        Elements current:                              18.1 %      38.9k
        Collisions:                                               339.1k
        Chain max:                                                     4
        Chains:                                                      365

ARC misc:
        Deleted:                                                    2.7M
        Mutex misses:                                                575
        Eviction skips:                                             2.5k
        Eviction skips due to L2 writes:                               0
        L2 cached evictions:                                     0 Bytes
        L2 eligible evictions:                                 279.1 GiB
        L2 eligible MFU evictions:                     40.7 %  113.5 GiB
        L2 eligible MRU evictions:                     59.3 %  165.7 GiB
        L2 ineligible evictions:                                11.6 GiB

ARC total accesses (hits + misses):                                66.0M # 总访问次数
        Cache hit ratio:                               95.9 %      63.3M # 缓存命中率
        Cache miss ratio:                               4.1 %       2.7M # 缓存未命中率
        Actual hit ratio (MFU + MRU hits):             95.8 %      63.3M # 实际命中率 (分区合计)
        Data demand efficiency:                        96.7 %      22.1M # 需求(主动)读取数据的有效命中率
        Data prefetch efficiency:                       2.1 %       1.3M # 预取(预测/批量)数据的有效命中率
......(略)

总结:

  • ARC 当前大小与目标 max size 基本一致,运行充分(利用率高)。
  • 缓存命中率非常高(>95%),说明 ARC 内存配置较合适。
  • 元数据和 dnode 缓存正常,dnode 涨到上限可能略有压力,但无明显异常。
  • 未启用 L2ARC(次级缓存),数据全部靠 ARC 内存一级缓存。
  • 数据预取效能较低,对于重批量顺序读取场景,可以考虑优化。

我们可以通过手动调整 ZFS ARC 内存占有量,来控制 ZFS 内存占用。

# 临时生效,将 ARC 的最大占用限制为 4GB(4294967296 字节)
echo 4294967296 > /sys/module/zfs/parameters/zfs_arc_max

# 永久生效
echo "options zfs zfs_arc_max=4294967296" >> /etc/modprobe.d/zfs.conf

ZFS 内置监控工具

ZFS 是一种高度先进的文件系统,它内置了一些强大的工具来帮助我们监控和管理其性能。以下是一些您可能会发现有用的工具。

zpool iostat

zpool iostat 是一个用于实时监控 ZFS 存储池 I/O 活动的工具。它可以显示每个存储池的读取、写入和操作的带宽,以及待处理的读取和写入操作的数量。

您可以使用以下命令来运行 zpool iostat

zpool iostat -v

-v 选项可以显示每个存储池中的每个磁盘的详细信息。

zpool status

zpool status 命令显示 ZFS 存储池的健康状况和状态信息。您可以使用此命令来检查存储池是否有故障,并查看关于故障的详细信息。

您可以使用以下命令来运行 zpool status

zpool status

zfs get all

zfs get all 命令显示 ZFS 文件系统的所有属性,包括当前使用的磁盘空间、可用磁盘空间、数据压缩比率等等。

您可以使用以下命令来运行 zfs get all

zfs get all

下面我们将以 zpool iostat 命令为例,详细介绍一下使用方法。zpool iostat 是一个内建的监视工具,可以实时显示池 I/O 统计信息。要实现持续监视,可以在上面命令后面跟一个数字(刷新间隔,以秒为单位),可以指定刷新间隔,按 Ctrl+C 停止,还可以再跟一个数字指定一共显示多少条记录。

[root@localhost /]# zpool iostat
              capacity     operations     bandwidth 
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
SSD         74.7G  4.46T      0     29  57.6K   195K

# 每隔两秒显示一条,共显示5条
[root@localhost /]# zpool iostat 2 5
              capacity     operations     bandwidth 
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
SSD         74.7G  4.46T      0     29  57.6K   195K
SSD         74.7G  4.46T      0      0      0      0
SSD         74.7G  4.46T      0      0      0      0
SSD         74.7G  4.46T      0    100      0   478K
SSD         74.7G  4.46T      0      0      0      0

# 使用-v参数可以显示详细信息,池里的每个设备占一行
[root@localhost /]# zpool iostat -v
                                             capacity     operations     bandwidth 
pool                                       alloc   free   read  write   read  write
-----------------------------------------  -----  -----  -----  -----  -----  -----
SSD                                        74.7G  4.46T      0     29  57.6K   195K
  scsi-0ATA_SanDisk_SDSSDH31_180546800457  14.9G   913G      0      5  11.5K  39.0K
  scsi-0ATA_SanDisk_SDSSDH31_181290801368  15.0G   913G      0      5  11.6K  38.9K
  scsi-0ATA_SanDisk_SDSSDH31_180546801146  15.0G   913G      0      6  11.6K  39.1K
  scsi-0ATA_SanDisk_SDSSDH31_181325802022  14.9G   913G      0      5  11.5K  39.0K
  scsi-0ATA_SanDisk_SDSSDH31_180546801835  14.9G   913G      0      5  11.5K  39.0K
-----------------------------------------  -----  -----  -----  -----  -----  -----

# 持续监控
[root@localhost /]# zpool iostat -v 2 3
                                             capacity     operations     bandwidth 
pool                                       alloc   free   read  write   read  write
-----------------------------------------  -----  -----  -----  -----  -----  -----
SSD                                        74.7G  4.46T      0     29  57.6K   195K
  scsi-0ATA_SanDisk_SDSSDH31_180546800457  14.9G   913G      0      5  11.5K  39.0K
  scsi-0ATA_SanDisk_SDSSDH31_181290801368  15.0G   913G      0      5  11.6K  38.9K
  scsi-0ATA_SanDisk_SDSSDH31_180546801146  15.0G   913G      0      6  11.6K  39.1K
  scsi-0ATA_SanDisk_SDSSDH31_181325802022  14.9G   913G      0      5  11.5K  39.0K
  scsi-0ATA_SanDisk_SDSSDH31_180546801835  14.9G   913G      0      5  11.5K  39.0K
-----------------------------------------  -----  -----  -----  -----  -----  -----
                                             capacity     operations     bandwidth 
pool                                       alloc   free   read  write   read  write
-----------------------------------------  -----  -----  -----  -----  -----  -----
SSD                                        74.7G  4.46T      0      0      0      0
  scsi-0ATA_SanDisk_SDSSDH31_180546800457  14.9G   913G      0      0      0      0
  scsi-0ATA_SanDisk_SDSSDH31_181290801368  15.0G   913G      0      0      0      0
  scsi-0ATA_SanDisk_SDSSDH31_180546801146  15.0G   913G      0      0      0      0
  scsi-0ATA_SanDisk_SDSSDH31_181325802022  14.9G   913G      0      0      0      0
  scsi-0ATA_SanDisk_SDSSDH31_180546801835  14.9G   913G      0      0      0      0
-----------------------------------------  -----  -----  -----  -----  -----  -----
                                             capacity     operations     bandwidth 
pool                                       alloc   free   read  write   read  write
-----------------------------------------  -----  -----  -----  -----  -----  -----
SSD                                        74.7G  4.46T      0     83      0   319K
  scsi-0ATA_SanDisk_SDSSDH31_180546800457  14.9G   913G      0      7      0  78.4K
  scsi-0ATA_SanDisk_SDSSDH31_181290801368  15.0G   913G      0     22      0  77.2K
  scsi-0ATA_SanDisk_SDSSDH31_180546801146  15.0G   913G      0      9      0  35.7K
  scsi-0ATA_SanDisk_SDSSDH31_181325802022  14.9G   913G      0     20      0  43.2K
  scsi-0ATA_SanDisk_SDSSDH31_180546801835  14.9G   913G      0     23      0  84.9K
-----------------------------------------  -----  -----  -----  -----  -----  -----

ZFS 第三方监控工具

ZFS 除了其内置的性能监控工具外,还有许多第三方工具可以帮助您更好地监控和理解 ZFS 的性能。下面是一些常见的第三方 ZFS 监控工具:

  1. ZFS on Linux Metrics (ZoL Stats):ZoL Stats 是一个 Grafana 仪表盘,用于显示通过 ZFS on Linux 暴露的度量值。它可以显示存储池和数据集的 IO,以及 ARC(适应性替换缓存)的使用情况等。
  2. ZFS System Monitor (ZSysMon):ZSysMon 是一个用于监视 ZFS 系统性能的 Shell 脚本。它可以显示存储池的状态,包括读写操作,带宽,等待 I/O,存储池使用等信息。
  3. Collectd-zfs:这是一个 collectd 插件,可以获取和记录 ZFS 的性能统计信息。Collectd 是一个守护程序,可以收集系统和应用程序的性能指标。使用 collectd-zfs 插件,您可以将 ZFS 的性能数据集成到您的现有的监控系统中。
  4. Telegraf & InfluxDB:Telegraf 是一个插件驱动的服务器代理,用于收集和报告指标。InfluxDB 是一个用于存储和查询指标和事件的时间序列数据库。Telegraf 有一个 ZFS 插件,可以收集 ZFS 的性能数据,并将其存储在 InfluxDB 中。然后,您可以使用 Grafana 或其他可视化工具来查看这些数据。

这些第三方工具提供了 ZFS 的详细和可视化的性能指标,使您能够深入了解 ZFS 的性能状况,并据此进行优化和故障排除。

写在最后

在 ZFS 系列文章中,我们已经对 ZFS 文件系统进行了全面而深入的探讨,介绍了如何部署 ZFS、如何管理存储池和卷、如何创建和使用快照,以及如何配置和使用 NFS 和 SMB 共享。通过这些文章,我们希望您能对 ZFS 的强大功能和灵活性有一个全面的了解,并能够在您自己的系统中实现和使用这些功能。

变更记录

  • 2025-05-26
    • 新增【ZFS 内存管理】章节
Avatar photo

关于 木子

Email: [email protected] 微信:rockylinuxcn QQ: 2306867585
Founder of the Rocky Linux Chinese community, MVP、VMware vExpert、TVP, advocate for cloud native technologies, with over ten years of experience in site reliability engineering (SRE) and the DevOps field. Passionate about Cloud Computing、Microservices、CI&CD、DevOps、Kubernetes, currently dedicated to promoting and implementing Rocky Linux in Chinese-speaking regions.
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇