
简介这是一份面向存储架构师、分布式系统运维人员及高性能计算学习者的技术方案文档围绕IBM GPFS并行文件系统的原理展开帮助读者建立从历史演进到架构选型的完整认知。内容涵盖GPFS自1993年研发、1995年商用以来的发展脉络SAN、NSD、SNC三种架构的差异以及在线扩展、分布式锁、元数据管理、日志恢复等核心机制并对比NFS与SAN File System的结构特点。资源包内含1个docx文档约495KB以图文结合方式梳理架构示意图与关键概念便于按章节查阅。目前已有350人学习下载适合需要理解并行文件系统底层设计、评估集群存储方案或准备相关技术面试的读者参考。1. GPFS 并行文件系统从一块盘到几百 GB/s 的读写它到底在干什么很多人在 AIX 或 Linux 上第一次碰到 GPFS都是因为一个很具体的场景单机 ext4 或 XFS 已经扛不住训练集加载了几百个进程同时读同一个目录IO 直接跑满iostat里%util长期 100%但吞吐只有几百 MB/s。这时候有人丢过来一句“上 GPFS 吧”然后你就开始查资料发现满屏都是 NSD、quorum node、mmfsd、token manager 这些词越看越像黑匣子。GPFSGeneral Parallel File System现在 IBM 官方叫 Spectrum Scale但一线还是习惯叫 GPFS解决的核心问题只有一个让几十到几千个节点通过并发读写同一份数据把聚合带宽从单机磁盘的瓶颈里解放出来。它不是简单的 NFS 共享也不是把本地盘拼起来而是一套带元数据集群、带分布式锁、带条带化落盘的并行文件系统。适合谁跑 HPC 作业、AI 训练、EDA 仿真、媒体渲染这类“多节点、大文件、高并发”场景的工程师。如果你只是单机跑个小数据库GPFS 的复杂度不值得。2. GPFS 的架构拆解NSD、Token 与元数据节点怎么配合2.1 NSDGPFS 把裸盘抽象成什么GPFS 不直接管/dev/sdb这种块设备它中间加了一层叫 NSDNetwork Shared Disk。NSD 可以理解成“GPFS 眼里的盘”它把物理盘或 LUN 包装成一个带全局名字的对象比如gpfs1nsd。每个 NSD 有一个归属节点NSD server其他节点要读写这块盘得通过 NSD server 转发或者走 RDMA 直连。为什么要有这层因为 GPFS 要跨节点做条带化。一个文件被切成 block默认 1MB可调 256KB 到 16MB按条带策略散到多个 NSD 上。这样 100 个节点同时读一个 1TB 文件每个节点只读自己那块条带聚合带宽就是所有 NSD 后端盘的总和。常见做法是每个存储节点挂 4 到 8 块 SSD 或 NVMe每块盘做一个 NSD然后所有 NSD 组成一个 storage pool。文件系统层面再按 pool 做分层热数据放 SSD pool冷数据放 HDD pool。2.2 Token Manager并发写的锁到底锁在哪并行文件系统最怕的是写冲突。GPFS 用一套分布式锁叫 Token。每个文件、每个目录、甚至每个数据块都有对应的 token。节点要读数据先拿 read token要写先拿 write token。Token 由 token manager 节点统一管理拿到 write token 的节点才能改数据。这里有个关键设计GPFS 的 token 是“可撤销”的。节点 A 拿了 write token 在写节点 B 也要写同一个块token manager 会通知 A 把 token 交出来A 把脏数据刷到 NSD 后再释放。这个过程对应用透明但延迟会抖。所以实际调优时mmchconfig里的maxFilesToCache和pagepool大小很关键pagepool 太小会导致频繁回写token 来回抢吞吐直接掉。2.3 元数据节点与 quorum谁说了算GPFS 集群里有一组 quorum node通常 3 到 5 个负责集群状态仲裁。元数据操作创建、删除、改名、查目录由元数据节点处理但 GPFS 的元数据是分布式的不是单点。每个节点都缓存一部分 inode 和目录项通过 token 保证一致性。如果 quorum 节点挂到只剩一个集群会锁死所有 IO 挂起。这是血泪经验生产环境 quorum 节点必须跨机架、跨电源别省那两台机器。3. 从零搭一个最小 GPFS 集群命令、参数与验证3.1 环境准备与软件安装假设你有 3 台 AIX 或 RHEL 节点每台挂 2 块裸盘做 NSD。先确认内核版本和 RDMA 驱动GPFS 对内核版本很挑5.1.x 和 5.2.x 支持的 kernel 不同。安装包一般叫gpfs.base、gpfs.gpl、gpfs.msg.en_US用installp或rpm装。# RHEL 下安装 GPFS 基础包包名以实际版本为准 rpm -ivh gpfs.base-5.1.5-0.x86_64.rpm rpm -ivh gpfs.gpl-5.1.5-0.x86_64.rpm rpm -ivh gpfs.msg.en_US-5.1.5-0.noarch.rpm # 加载 GPFS 内核模块 /usr/lpp/mmfs/bin/mmfsenv -i modprobe mmfs逻辑说明gpfs.base提供核心二进制和mmfs内核模块gpfs.gpl是 GPL 内核模块源码某些内核需要现场编译。装完必须modprobe mmfs否则mmstartup会报“kernel module not loaded”。参数注意AIX 下用installp -a -d /path/to/package gpfs.base装完跑smitty gpfs做初始配置。AIX 的mmfs是内核扩展不需要 modprobe但需要bosboot更新引导镜像。3.2 创建集群与添加 NSD先在一台节点上创建集群定义 quorum 节点列表。# 创建集群指定集群名和 quorum 节点 mmcrcluster -N node1:quorum-manager,node2:quorum-manager,node3:quorum-manager \ -C gpfs_cluster -r /usr/bin/ssh -R /usr/bin/scp # 启动集群 mmstartup -a # 查看集群状态 mmgetstate -a逻辑说明mmcrcluster的-N参数里quorum-manager表示该节点既是 quorum 又是 manager。-r和-R指定远程执行和拷贝命令生产环境建议配免密 SSH。mmstartup -a启动所有节点上的mmfsd守护进程。参数注意mmgetstate -a输出里active才算正常arbitrating表示还在选主down就要查/var/adm/ras/mmfs.log.latest。接下来把裸盘做成 NSD。# 在 node1 上把 /dev/sdb 和 /dev/sdc 做成 NSD mmcrnsd -F /tmp/nsd.txt # nsd.txt 内容示例 # /dev/sdb:nsd01:dataAndMetadata:node1 # /dev/sdc:nsd02:dataAndMetadata:node2逻辑说明mmcrnsd读取描述文件把块设备注册成 NSD。dataAndMetadata表示这块盘既存数据也存元数据生产环境通常分开元数据放 SSD。node1是 NSD server其他节点通过它访问。参数注意-F文件里每行格式是设备:NSD名:用途:归属节点。NSD 名必须全局唯一建议用nsd01这种带编号的。如果盘之前被用过先dd清头否则mmcrnsd会报“device already belongs to a file system”。3.3 创建文件系统并挂载# 创建 GPFS 文件系统 mmcrfs /gpfs1 gpfs1 -F /tmp/nsd.txt -A yes -B 1M -n 128 # 挂载 mmmount /gpfs1 -a # 验证 df -h /gpfs1 mmdf gpfs1逻辑说明mmcrfs第一个参数是挂载点第二个是文件系统名。-A yes表示自动挂载-B 1M是 block size-n 128是每个节点的 inode 预分配数。mmdf看的是 GPFS 层面的条带分布比df更准。参数注意-B默认 1MB大文件场景可以调到 4MB 或 8MB减少元数据开销小文件多就降到 256KB。-n太小会导致 inode 耗尽创建文件报No space left on device但df看还有空间这是经典坑。4. 性能调优与避坑那些让 GPFS 翻车的参数4.1 pagepool 与 maxFilesToCache 怎么设pagepool是 GPFS 在内存里缓存数据页的大小默认可能只有 1GB 到 2GB。跑大文件顺序读pagepool 太小会导致读一点丢一点反复回盘。经验值每节点 pagepool 设成物理内存的 25% 到 50%但别超过 64GB再大收益递减。# 调整 pagepool 到 16GB mmchconfig pagepool16G -i # 调整 maxFilesToCache mmchconfig maxFilesToCache100000 -i # 重启 mmfsd 生效 mmshutdown -a mmstartup -a逻辑说明mmchconfig改的是集群级配置-i表示立即生效但需要重启mmfsd。maxFilesToCache控制每个节点缓存多少文件句柄小文件多就调大但吃内存。参数注意改完必须mmshutdown -a再mmstartup -a只重启单个节点会导致配置不一致集群可能拒绝该节点加入。4.2 避坑GPFS 最常见的 5 个翻车现场现象一mmmount卡住日志报quorum not reached。原因quorum 节点数不够或者节点间网络不通。 解决mmgetstate -a看哪些节点 down检查/etc/hosts和防火墙GPFS 需要 1191 端口和 RDMA 端口互通。现象二写文件报No space left on device但df显示有空间。原因inode 耗尽-n参数设太小。 解决mmchfs gpfs1 -n 500000动态加 inode但已经写满的目录可能还是要清理。现象三多节点同时写同一文件吞吐骤降。原因token 争抢write token 在节点间来回撤销。 解决应用层尽量让不同节点写不同文件或者用mmchattr把文件设成--data-replication 1减少副本同步开销。现象四mmfsd频繁重启日志报pagepool exhausted。原因pagepool 太小脏页刷不出去。 解决调大 pagepool同时检查后端 NSD 的写带宽是否跑满如果是盘慢加盘或换 SSD。现象五AIX 上mmstartup报mmfs module not found。原因内核扩展没加载或者bosboot没更新。 解决lsdev -Cc disk确认盘识别cfgmgr重新配置然后bosboot -a重建引导。5. 进阶用 mmfsadm 和 mmdiag 做在线诊断与容量规划5.1 mmfsadm不重启看内部状态mmfsadm是 GPFS 的瑞士军刀能 dump 出 token、pagepool、NSD 的实时状态。# 查看 token 统计 mmfsadm dump tokens | head -50 # 查看 pagepool 使用 mmfsadm dump pagepool # 查看 NSD 延迟 mmfsadm dump nsd逻辑说明dump tokens输出里granted和revoked的比例能看出锁竞争程度。如果revoked很高说明多节点在抢同一块数据。dump pagepool看free和dirty页数dirty长期高位就是回写跟不上。参数注意mmfsadm只能在 active 节点上跑输出量大建议重定向到文件再分析。AIX 下路径是/usr/lpp/mmfs/bin/mmfsadm。5.2 容量规划别等满了再扩GPFS 支持在线加 NSD 和扩文件系统但操作顺序错了会翻车。# 添加新 NSD mmcrnsd -F /tmp/new_nsd.txt # 把新 NSD 加入现有文件系统 mmadddisk gpfs1 -F /tmp/new_nsd.txt # 重新平衡数据 mmrestripefs gpfs1 -b逻辑说明mmadddisk只是把 NSD 加入池子已有数据不会自动迁移。mmrestripefs -b触发重新条带化把旧数据按新布局打散。这个过程 IO 很重建议业务低峰做。参数注意mmrestripefs有-b平衡、-r重新复制、-p只打印计划几个模式。先跑-p看计划确认影响范围再执行。如果文件系统很大-b可能跑几天中途别中断否则条带状态不一致。5.3 一个我常用来验证性能的小技巧别一上来就跑fio先用 GPFS 自带的mmperfmon看基线。# 启动性能监控 mmperfmon start # 跑一段业务负载后查看 mmperfmon query -s # 停止 mmperfmon stop逻辑说明mmperfmon采集的是 GPFS 内部指标包括每个 NSD 的 IOPS、延迟、token 等待时间。比iostat更贴近文件系统层。如果某个 NSD 延迟明显高说明那块盘或那个 NSD server 是瓶颈。参数注意mmperfmon有性能开销生产环境别长期开排查问题时开几分钟就够。AIX 下可能需要额外装gpfs.perf包。我自己的习惯是每次扩节点或换盘后先跑一遍mmperfmon加mmfsadm dump nsd把基线记下来。下次再出性能问题直接对比基线比瞎猜快得多。GPFS 这套东西参数多、状态多但只要你把 NSD、token、pagepool 这三样盯住大部分问题都能定位。希望帮到你。本文还有配套的精品资源点击获取