openEuler 22.03 NFS + mergerfs 存储池部署与性能调优完整文档
·
📘 openEuler 22.03 NFS + mergerfs 存储池部署与性能调优完整文档
文档概述
本文档基于实际生产环境部署经验,详细记录了在 openEuler 22.03 系统上,使用 NFS + mergerfs 构建超大容量统一存储池的完整流程。特别针对 NFS 写入性能瓶颈 进行了深度排查与优化,最终将 NFS 写入速度从 642 KB/s 提升至 342 MB/s(峰值),并实现了长期稳定运行。
文档结构
- 系统架构概述
- 存储服务器(NFS 服务端)配置
- 客户端服务器(NFS 客户端 + mergerfs)配置
- 性能调优(核心章节)
- 监控与运维
- 常见故障排查
- 附录:完整配置清单
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)
⚠️ 关键参数说明:
asyncvssync:async能大幅提升写入性能(测试中从 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 |
sync → async |
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=simple 且 ExecStart 包含 -f |
umount: target is busy |
有进程正在使用挂载点 | 使用 sudo fuser -km /bak 强制终止,或 cd / 后重试 |
热添加失败(No such file or directory) |
mergerfs 控制接口未启用 | 删除 /bak/.mergerfs 文件,重新挂载 mergerfs |
| 写入速度波动大,间歇性卡顿 | 脏页阈值设置不合理 | 调整 dirty_ratio 和 dirty_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
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)