先分清是哪一类慢
顺序大文件慢,多半与 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 则直接减少写侧的额外元数据更新。二者都是「用一致性换性能」的取舍,是否可接受取决于共享目录上跑的业务。