📘 openEuler 22.03 NFS + mergerfs 存储池部署与性能调优完整文档


文档概述

本文档基于实际生产环境部署经验,详细记录了在 openEuler 22.03 系统上,使用 NFS + mergerfs 构建超大容量统一存储池的完整流程。特别针对 NFS 写入性能瓶颈 进行了深度排查与优化,最终将 NFS 写入速度从 642 KB/s 提升至 342 MB/s(峰值),并实现了长期稳定运行。

文档结构

  1. 系统架构概述
  2. 存储服务器(NFS 服务端)配置
  3. 客户端服务器(NFS 客户端 + mergerfs)配置
  4. 性能调优(核心章节)
  5. 监控与运维
  6. 常见故障排查
  7. 附录:完整配置清单

1. 系统架构概述

1.1 硬件环境

角色 IP CPU 内存 存储
客户端(合并节点) 192.168.20.3 64核 188GB 本地 138TB(/dev/mapper/vgdata-lvdata)
存储服务器1 192.168.20.14 64核 188GB 本地 139TB(/bak)
存储服务器2 192.168.20.19 64核 188GB 本地 139TB(/bak)
存储服务器N 192.168.20.x 64核 188GB 本地 139TB(/bak)

1.2 软件版本

  • 操作系统:openEuler 22.03 (LTS-SP1)
  • NFS 版本:v4.2(客户端)/ v4.2(服务端)
  • mergerfs 版本:2.40.2

1.3 架构示意图

┌─────────────────────────────────────────────────────────────────┐
│                     客户端服务器 (192.168.20.3)                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │              /bak (mergerfs 统一挂载点)                  │   │
│  │  总容量 = 本地138T + 多个NFS分支(各139T)              │   │
│  └─────────────────────────────────────────────────────────┘   │
│         │              │              │              │          │
│         ▼              ▼              ▼              ▼          │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐       │
│  │localbak  │  │ nfs14    │  │ nfs19    │  │ nfs20    │       │
│  │(本地存储)│  │(NFS挂载) │  │(NFS挂载) │  │(NFS挂载) │       │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘       │
└─────────────────────────────────────────────────────────────────┘
         │              │              │              │
         ▼              ▼              ▼              ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 本地存储设备 │ │192.168.20.14│ │192.168.20.19│ │192.168.20.20│
│ /bak 138T   │ │ /bak 139T   │ │ /bak 139T   │ │ /bak 139T   │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘

2. 存储服务器(NFS 服务端)配置

适用于所有 NFS 服务端(192.168.20.14、192.168.20.19 等)。

2.1 安装 NFS 服务

sudo dnf install -y nfs-utils

2.2 启动并启用服务

sudo systemctl enable rpcbind nfs-server
sudo systemctl start rpcbind
sudo systemctl start nfs-server

2.3 配置共享目录(/etc/exports)

编辑 /etc/exports

sudo vi /etc/exports

添加以下内容(将 192.168.20.3 替换为实际客户端 IP):

/bak 192.168.20.3(rw,async,no_root_squash,no_subtree_check)

⚠️ 关键参数说明

  • async vs syncasync 能大幅提升写入性能(测试中从 6MB/s 提升至 342MB/s),但存在数据丢失风险(服务器意外断电时可能丢失未落盘数据)。sync 数据安全但性能极低。
  • no_root_squash:允许客户端 root 用户保持 root 权限(按需使用,有安全风险)。
  • no_subtree_check:禁用子目录检查,提升性能。

2.4 使配置生效

sudo exportfs -r
sudo exportfs -v   # 验证

2.5 配置防火墙

sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload

2.6 优化 NFS 服务线程数(关键!

编辑 /etc/nfs.conf

sudo vi /etc/nfs.conf

[nfsd] 段添加:

[nfsd]
threads=128

重启服务:

sudo systemctl restart nfs-server

验证:

cat /proc/net/rpc/nfsd | grep th
# 应显示 th 128 ...

说明:默认线程数仅为 8,对于 64 核 CPU 严重不足。调高至 128 后,并发处理能力大幅提升。

2.7 优化内核脏页参数(用于 async 模式性能调优

编辑 /etc/sysctl.conf

sudo vi /etc/sysctl.conf

添加:

vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_expire_centisecs = 1000

生效:

sudo sysctl -p

参数说明

  • dirty_background_ratio=5:脏页占内存 5% 时,后台开始刷盘。
  • dirty_ratio=10:脏页占内存 10% 时,前台写入被阻塞,强制刷盘。
  • dirty_expire_centisecs=1000:脏页存活超过 10 秒后强制刷盘。

3. 客户端服务器配置(192.168.20.3)

3.1 安装 NFS 客户端和 mergerfs

# 安装 NFS 客户端
sudo dnf install -y nfs-utils

# 安装 mergerfs(以 2.40.2 为例)
wget https://github.com/trapexit/mergerfs/releases/download/2.40.2/mergerfs-2.40.2-1.el8.x86_64.rpm
sudo dnf install -y ./mergerfs-2.40.2-1.el8.x86_64.rpm

3.2 准备挂载点

# 本地存储挂载点
sudo mkdir -p /mnt/localbak

# 远程 NFS 挂载点
sudo mkdir -p /mnt/nfs14 /mnt/nfs19 /mnt/nfs20   # 按需添加

# mergerfs 合并挂载点
sudo mkdir -p /bak

3.3 挂载本地存储

# 假设本地存储设备为 /dev/mapper/vgdata-lvdata
sudo mount /dev/mapper/vgdata-lvdata /mnt/localbak

3.4 挂载远程 NFS(性能优化版)

挂载参数说明:

  • rsize=4194304,wsize=4194304:读写块大小设为 4MB,提升大文件吞吐量。
  • vers=4.2:使用 NFSv4.2,支持 nconnect 特性。
  • nconnect=8:为单个挂载点建立 8 个 TCP 连接,充分利用多核 CPU。
  • noatime,nodiratime:禁用访问时间更新,减少元数据开销。
sudo mount -t nfs -o rw,hard,intr,rsize=4194304,wsize=4194304,noatime,nodiratime,vers=4.2,nconnect=8 192.168.20.14:/bak /mnt/nfs14

sudo mount -t nfs -o rw,hard,intr,rsize=4194304,wsize=4194304,noatime,nodiratime,vers=4.2,nconnect=8 192.168.20.19:/bak /mnt/nfs19

验证挂载:

df -h /mnt/nfs14 /mnt/nfs19

3.5 配置 mergerfs 合并存储池

sudo mergerfs -o defaults,allow_other,category.create=mfs,minfreespace=10240G /mnt/localbak:/mnt/nfs14:/mnt/nfs19 /bak

验证:

df -h /bak
# 应显示总容量约为 138T + 139T + 139T = 416T

4. 开机自动挂载(systemd + fstab)

4.1 配置 /etc/fstab

编辑 /etc/fstab

sudo vi /etc/fstab

添加:

# 本地存储(挂载到 /mnt/localbak)
/dev/mapper/vgdata-lvdata /mnt/localbak xfs defaults 0 0

# 远程 NFS 存储
192.168.20.14:/bak /mnt/nfs14 nfs rw,hard,intr,rsize=4194304,wsize=4194304,noatime,nodiratime,vers=4.2,nconnect=8,_netdev 0 0
192.168.20.19:/bak /mnt/nfs19 nfs rw,hard,intr,rsize=4194304,wsize=4194304,noatime,nodiratime,vers=4.2,nconnect=8,_netdev 0 0

测试 fstab:

sudo mount -a

4.2 创建 systemd 服务

编辑 /etc/systemd/system/mergerfs-bak.service

sudo vi /etc/systemd/system/mergerfs-bak.service

写入:

[Unit]
Description=Mergerfs pool for /bak
Requires=network-online.target
After=network-online.target remote-fs.target
Wants=remote-fs.target

[Service]
Type=simple
ExecStartPre=/bin/mount -a
ExecStart=/usr/bin/mergerfs -f -o defaults,allow_other,category.create=mfs,minfreespace=10240G /mnt/localbak:/mnt/nfs14:/mnt/nfs19 /bak
ExecStop=/bin/umount /bak
Restart=on-failure

[Install]
WantedBy=multi-user.target

启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable mergerfs-bak.service
sudo systemctl start mergerfs-bak.service
sudo systemctl status mergerfs-bak.service

5. 性能调优(核心章节)

5.1 排查过程总结

阶段 操作 速度结果 说明
初始状态 服务端 sync + 默认参数 642 KB/s 极慢,无法接受
调整服务端线程数 threads=128 6.2 MB/s 提升 10 倍,但仍不理想
服务端改为 async syncasync 342 MB/s(峰值) 瓶颈解除,性能飞跃
长期持续写入 100GB 持续写入 ~80 MB/s 受限于物理磁盘速度
内核参数调优 dirty_ratio=10% 稳定运行 防止内存溢出

5.2 关键优化点

优化 1:服务端 /etc/exports — sync 改为 async
# 修改前
/bak 192.168.20.3(rw,sync,no_subtree_check,no_root_squash)

# 修改后
/bak 192.168.20.3(rw,async,no_subtree_check,no_root_squash)
优化 2:服务端 NFS 线程数
# /etc/nfs.conf
[nfsd]
threads=128
优化 3:客户端挂载参数
mount -t nfs -o rw,hard,intr,rsize=4194304,wsize=4194304,noatime,nodiratime,vers=4.2,nconnect=8 IP:/bak /mountpoint
优化 4:服务端内核脏页参数
# /etc/sysctl.conf
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_expire_centisecs = 1000

5.3 性能验证命令

写入测试(客户端)
# 10GB 写入测试
dd if=/dev/zero of=/mnt/nfs14/test.dd bs=1M count=10240 oflag=direct status=progress

# 100GB 持续写入测试
dd if=/dev/zero of=/mnt/nfs14/longtest.dd bs=1M count=102400 oflag=direct status=progress
读取测试(客户端)
dd if=/mnt/nfs14/test.dd of=/dev/null bs=1M count=10240 iflag=direct status=progress
网络带宽测试
# 服务端
iperf3 -s

# 客户端
iperf3 -c 192.168.20.14

6. 热添加新 NFS 分支(在线扩容)

当需要添加新的存储服务器(如 192.168.20.20)时:

6.1 挂载新 NFS

sudo mkdir -p /mnt/nfs20
sudo mount -t nfs -o rw,hard,intr,rsize=4194304,wsize=4194304,noatime,nodiratime,vers=4.2,nconnect=8 192.168.20.20:/bak /mnt/nfs20

6.2 热添加到 mergerfs

echo "add /mnt/nfs20" | sudo tee /bak/.mergerfs/ctl

6.3 验证扩容

df -h /bak

6.4 持久化配置

更新 /etc/fstab 和 systemd 服务的 ExecStart 分支列表。


7. 监控与运维

7.1 监控命令

查看脏页状态(服务端)
watch -n 2 'cat /proc/meminfo | grep -E "Dirty|Writeback|DirtyThreshold"'
查看 NFS 统计信息
nfsstat -c   # 客户端
nfsstat -s   # 服务端
查看 NFS 服务线程数(服务端)
cat /proc/net/rpc/nfsd | grep th
查看磁盘 I/O
iostat -x 1
查看 mergerfs 状态(客户端)
mount | grep mergerfs
df -h /bak

7.2 服务管理

# 启动/停止/重启 mergerfs 服务
sudo systemctl start mergerfs-bak.service
sudo systemctl stop mergerfs-bak.service
sudo systemctl restart mergerfs-bak.service

# 查看服务状态和日志
sudo systemctl status mergerfs-bak.service
sudo journalctl -xeu mergerfs-bak.service -n 50

7.3 取消 mergerfs 恢复原始挂载

# 停止服务
sudo systemctl stop mergerfs-bak.service
sudo systemctl disable mergerfs-bak.service

# 卸载 mergerfs 挂载点
sudo umount /bak

# 恢复本地存储到 /bak
sudo mount /dev/mapper/vgdata-lvdata /bak

8. 常见故障排查

问题现象 可能原因 解决方案
NFS 写入速度极慢(<1MB/s) 服务端 /etc/exports 使用了 sync 改为 async(注意数据风险)
NFS 服务启动失败 线程数配置错误或端口冲突 检查 /etc/nfs.conf 语法,查看 systemctl status nfs-server
mergerfs 服务启动后立即退出 systemd 服务类型错误或缺少 -f 参数 确保 Type=simpleExecStart 包含 -f
umount: target is busy 有进程正在使用挂载点 使用 sudo fuser -km /bak 强制终止,或 cd / 后重试
热添加失败(No such file or directory mergerfs 控制接口未启用 删除 /bak/.mergerfs 文件,重新挂载 mergerfs
写入速度波动大,间歇性卡顿 脏页阈值设置不合理 调整 dirty_ratiodirty_background_ratio
网络带宽不足 物理链路或交换机限制 使用 iperf3 测试,检查网卡速率和 MTU

9. 附录

9.1 最终配置文件清单

服务端(192.168.20.x)
  • /etc/exports
    /bak 192.168.20.3(rw,async,no_root_squash,no_subtree_check)
    
  • /etc/nfs.conf
    [nfsd]
    threads=128
    
  • /etc/sysctl.conf(追加):
    vm.dirty_background_ratio = 5
    vm.dirty_ratio = 10
    vm.dirty_expire_centisecs = 1000
    
客户端(192.168.20.3)
  • /etc/fstab
    /dev/mapper/vgdata-lvdata /mnt/localbak xfs defaults 0 0
    192.168.20.14:/bak /mnt/nfs14 nfs rw,hard,intr,rsize=4194304,wsize=4194304,noatime,nodiratime,vers=4.2,nconnect=8,_netdev 0 0
    192.168.20.19:/bak /mnt/nfs19 nfs rw,hard,intr,rsize=4194304,wsize=4194304,noatime,nodiratime,vers=4.2,nconnect=8,_netdev 0 0
    
  • /etc/systemd/system/mergerfs-bak.service
    [Unit]
    Description=Mergerfs pool for /bak
    Requires=network-online.target
    After=network-online.target remote-fs.target
    Wants=remote-fs.target
    
    [Service]
    Type=simple
    ExecStartPre=/bin/mount -a
    ExecStart=/usr/bin/mergerfs -f -o defaults,allow_other,category.create=mfs,minfreespace=10240G /mnt/localbak:/mnt/nfs14:/mnt/nfs19 /bak
    ExecStop=/bin/umount /bak
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    

9.2 性能基准参考

场景 速度
服务端本地磁盘写入 80 MB/s(物理磁盘极限)
NFS 写入(峰值,async + 内存缓存) 342 MB/s
NFS 写入(持续稳定) 80 MB/s
网络带宽(iperf3) 8.79 Gbits/sec
mergerfs 写入(底层 NFS 优化后) ≈ NFS 写入速度

9.3 参考文档


文档版本:2.0 | 最后更新:2026-07-14 | 适用环境:openEuler 22.03

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐