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 监控工具:
- ZFS on Linux Metrics (ZoL Stats):ZoL Stats 是一个 Grafana 仪表盘,用于显示通过 ZFS on Linux 暴露的度量值。它可以显示存储池和数据集的 IO,以及 ARC(适应性替换缓存)的使用情况等。
- ZFS System Monitor (ZSysMon):ZSysMon 是一个用于监视 ZFS 系统性能的 Shell 脚本。它可以显示存储池的状态,包括读写操作,带宽,等待 I/O,存储池使用等信息。
- Collectd-zfs:这是一个 collectd 插件,可以获取和记录 ZFS 的性能统计信息。Collectd 是一个守护程序,可以收集系统和应用程序的性能指标。使用 collectd-zfs 插件,您可以将 ZFS 的性能数据集成到您的现有的监控系统中。
- Telegraf & InfluxDB:Telegraf 是一个插件驱动的服务器代理,用于收集和报告指标。InfluxDB 是一个用于存储和查询指标和事件的时间序列数据库。Telegraf 有一个 ZFS 插件,可以收集 ZFS 的性能数据,并将其存储在 InfluxDB 中。然后,您可以使用 Grafana 或其他可视化工具来查看这些数据。
这些第三方工具提供了 ZFS 的详细和可视化的性能指标,使您能够深入了解 ZFS 的性能状况,并据此进行优化和故障排除。
写在最后
在 ZFS 系列文章中,我们已经对 ZFS 文件系统进行了全面而深入的探讨,介绍了如何部署 ZFS、如何管理存储池和卷、如何创建和使用快照,以及如何配置和使用 NFS 和 SMB 共享。通过这些文章,我们希望您能对 ZFS 的强大功能和灵活性有一个全面的了解,并能够在您自己的系统中实现和使用这些功能。
变更记录
- 2025-05-26
- 新增【ZFS 内存管理】章节
