首页/系统与基础设施/存储速查/NFS 访问变慢的常见原因分析
NAS 与文件共享50 条

NFS 访问变慢的常见原因分析

NFS 变慢通常不在磁盘本身,而在往返时延、传输块大小、同步写语义与元数据操作频度。先分清是「单次大文件慢」还是「大量小文件慢」,两类问题的调优方向几乎相反。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​‌‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​​‌​‌‌​​​‌‌​‌‌​​​‌‌​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

先分清是哪一类慢

顺序大文件慢,多半与 rsize/wsize、链路带宽和丢包有关;大量小文件慢,瓶颈通常是往返时延(每次打开、查询属性、关闭都是一次或多次网络交互)与服务端元数据性能。把两类问题混在一起调参,往往把一边调好、另一边更差,例如为了小文件调小传输块,反而拉低了大文件的吞吐。

基本信息

适用平台Linux NFSv3/v4 客户端与服务端
关键挂载参数rsize、wsize、sync/async、noatime、actimeo
观测工具nfsiostat、mountstats、nfsstat -c/-s、sar -n DEV
服务端因素磁盘队列、nfsd 线程数、导出选项中的子树检查
网络因素RTT、丢包、MTU 与分片、带宽饱和

现象到原因

现象可能原因验证方式
大文件吞吐远低于链路带宽传输块偏小、丢包或链路饱和调大 rsize/wsize 对比;sar 看网卡是否打满
大量小文件操作极慢RTT 高、属性缓存过期太快nfsiostat 看 ops 与平均时延;对比同机房与跨机房
写入偶发卡顿数秒同步写语义等待落盘、后端存储抖动对比 sync 与 async 的差异;看服务端磁盘队列
首次访问慢、之后正常元数据缓存冷启动重复执行同一操作对比耗时
只有某个客户端慢该客户端路由绕行或网卡协商降速同交换机其他主机做对照测试

调参与观测

调参与观测
mount -t nfs -o vers=4.2,rsize=1048576,wsize=1048576,noatime 10.0.0.10:/data /mnt/data   # 大块传输并关闭访问时间更新
nfsiostat 5 3                  # 每 5 秒采样一次,看 ops 与平均时延
cat /proc/self/mountstats | head -n 60   # 挂载级计数器,判断重传与队列
nfsstat -c                     # 客户端侧 RPC 统计
ss -s                          # 连接与重传粗略情况

对比测试方法

对比测试方法
dd if=/dev/zero of=/mnt/data/test.bin bs=1M count=1024 oflag=direct   # 顺序写基准
dd if=/mnt/data/test.bin of=/dev/null bs=1M iflag=direct                # 顺序读基准
for i in $(seq 1 2000); do touch /mnt/data/small_$i; done; sync        # 小文件基准
rm -f /mnt/data/small_* /mnt/data/test.bin                              # 清理测试文件
服务端的 nfsd 线程数不足会让并发请求排队,表现为客户端时延随并发线性上升而服务端 CPU 却不忙。判断它需要同时看客户端时延分布与服务端 rpc 统计,单看任一端都容易误判。
actimeo 与 noatime 影响的是元数据交互次数:缓存过期时间越长,属性查询越少、一致性窗口越大;关闭 atime 则直接减少写侧的额外元数据更新。二者都是「用一致性换性能」的取舍,是否可接受取决于共享目录上跑的业务。

易错点

  • 为小文件调小 rsize/wsize:大文件吞吐同步下降,最终两头都不理想,应按主要负载类型定档
  • 只看服务端磁盘 IO 而忽略网络 RTT:跨机房访问天然受往返时延限制,磁盘再快也救不了
  • 盲目使用 async 提升写入速度:吞吐上去了,断电或链路异常时的数据丢失风险也随之上升
  • 忽略丢包:TCP 重传会把有效带宽和时延一起拖坏,需要先用网络层指标排除再调应用参数
  • 用单台客户端的表现推断全局:单个客户端的路由、网卡协商都可能特殊,至少两台主机做对照

数据来源与参考

  • NetApp 技术报告《NFS Best Practice and Implementation Guide》
  • nfsstat(8) 与 nfsiostat 手册页
  • RFC 1813《NFS Version 3 Protocol Specification》

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/storage/nfs-slow-access-causes.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​‌‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌‌​‌‌‌​​‌​‌‌​‌​‌‌​​​​‌​‌‌​​​‌‌​‌‌​​​‌‌​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​