#作者:stackofumbrella
3.4 使用fio进行高级性能测试
fio提供了更为详细和灵活的性能测试选项,适用于复杂的测试需求。
安装fio
# yum install -y fio
编写fio配置文件
创建一个名为nfs_test.fio的配置文件:
[global]
ioengine=libaio
direct=1
bs=4k
size=1G
numjobs=4
runtime=60
time_based
group_reporting
[write_test]
filename=/mnt/fio_write_test
rw=write
[read_test]
filename=/mnt/fio_write_test
rw=read
解释:
[global]定义了全局参数:
ioengine=libaio:使用Linux异步I/O。
direct=1:直接I/O,绕过缓存。
bs=4k:块大小为4KB。
size=1G:每个作业的测试文件大小为1GB。
numjobs=4:并发4个作业。
runtime=60:每个测试运行60秒。
time_based:基于时间的测试。
group_reporting:汇总报告。
[write_test]和[read_test]分别定义了写入和读取测试。
运行fio测试
# fio nfs_test.fio
示例输出
write_test: (groupid=0, jobs=4): err= 0: pid=12345: Thu Apr 27 12:34:56 2023
write: IOPS=2000, BW=8000KiB/s (8192 kB/s)(480MiB/60s)
clat (usec): min=4, max=3000, avg=50.00, stdev=10.00
lat (usec): min=5, max=3000, avg=51.00, stdev=10.10
clat percentiles (usec):
| 1.00th=[ 6], 5.00th=[ 7], 10.00th=[ 8], 20.00th=[ 9],
| 30.00th=[ 10], 40.00th=[ 11], 50.00th=[ 12], 60.00th=[ 13],
| 70.00th=[ 14], 80.00th=[ 15], 90.00th=[ 20], 95.00th=[ 25],
| 99.00th=[ 100]
read_test: (groupid=0, jobs=4): err= 0: pid=12346: Thu Apr 27 12:35:56 2023
read: IOPS=2500, BW=10000KiB/s (10240 kB/s)(600MiB/60s)
clat (usec): min=3, max=2500, avg=45.00, stdev=8.00
lat (usec): min=4, max=2500, avg=46.00, stdev=8.10
clat percentiles (usec):
| 1.00th=[ 5], 5.00th=[ 6], 10.00th=[ 7], 20.00th=[ 8],
| 30.00th=[ 9], 40.00th=[ 10], 50.00th=[ 11], 60.00th=[ 12],
| 70.00th=[ 13], 80.00th=[ 14], 90.00th=[ 18], 95.00th=[ 22],
| 99.00th=[ 90]
解释:
IOPS:每秒输入输出操作次数。
BW:带宽,表示数据传输速率。
clat和lat:分别表示完成时间和总延迟时间的统计数据。
percentiles:延迟时间的分布百分位数。
3.5 使用nfsstat进行统计分析
nfsstat工具用于收集和显示NFS客户端和服务器的性能统计信息。
查看客户端统计信息
# nfsstat -c
查看服务器统计信息
# nfsstat -s
示例输出
Client rpc stats:
calls retrans authrefrsh
1000 0 0
Client nfs v4:
null getattr setattr lookup access readlink read write
10 500 200 300 400 50 100 200
解释:
calls:NFS调用次数。
retrans:重传次数。
authrefrsh:认证刷新次数。
各种NFS操作(如read、write)的调用次数。
四、结果分析与优化建议 📈
通过dd和fio的测试结果,可以评估NFS的性能表现。同时,结合nfsstat的统计数据,深入分析NFS的调用和响应情况。
4.1 分析步骤
① 比较读写性能
使用dd和fio的带宽和IOPS数据,评估NFS的读写速度是否符合预期。
② 检查延迟
通过clat和lat数据,分析NFS的响应延迟,是否存在瓶颈。
③ 评估NFS调用效率
使用nfsstat查看各类NFS操作的调用次数和重传情况,识别潜在的网络或配置问题。
4.2 优化建议
① 调整NFS配置
增加rsize和wsize参数,优化数据传输块大小。例如:
# sudo mount -t nfs4 -o rsize=1048576,wsize=1048576 server_ip:/srv/nfs/shared /mnt
说明
rsize、wsize对于NFS的性能有很大的影响。wsize和rsize设定了SERVER和CLIENT之间往来数据块的大小,这两个参数的合理设定与很多方面有关,例如LINUX KERNEL、网卡,交换机等等。
用于测试的wsize,rsize最好是1024的倍数,如果使用的是NFS V3则可以尝试的最大数值是32768,而NFS V4则为1MB(1048576字节),更高的数值意义不大。
② 优化网络性能
确保NFS服务器和客户端之间的网络带宽充足,延迟低。使用高速网络(如万兆以太网或更高)。
③ 调整服务器性能
增加服务器的CPU和内存资源,提升处理能力。使用更快的存储设备(如SSD)作为NFS共享目录的存储介质。
④ 启用NFS缓存
在客户端启用fscache缓存机制,减少对服务器的频繁访问,提高性能。例如:
# sudo mount -t nfs4 -o fsc,rsize=1048576,wsize=1048576 server_ip:/srv/nfs/shared /mnt
⑤ 修改系统参数
提高nfsd的线程数(SUSE linux /etc/sysconfig/nfs文件中的USE_KERNEL_NFSD_NUMBER,一个CPU内核至少设置一个线程,根据经验一个CPU内核设置4~8个线程更好)。
# vim /etc/init.d/nfs
找到下面这行修改
[ -z "$RPCNFSDCOUNT" ] && RPCNFSDCOUNT=32
说明:RPCNFSDCOUNT表示NFS服务器的进程数,增加该值可以提高并发处理能力
提高输入队列的内存限制,注意多个nfsd线程共享这些内存。NSF Client有很高的读负载,NFS Server有很高的写负载时,提高内存限制有重要的作用。
# echo 262144 > /proc/sys/net/core/rmem_default
# echo 262144 > /proc/sys/net/core/rmem_max
# echo 262144 > /proc/sys/net/core/wmem_default
# echo 262144 > /proc/sys/net/core/wmem_max