网络存储之 NFS
资源
- http://nfs.sourceforge.net/ 官网
- http://cn.linux.vbird.org/lin... 客户端安装
- http://cn.linux.vbird.org/lin... 服务端安装
- http://alephnull.com/benchmar... 性能测试对比
特性
- NFS也是非常稳定和久经考验的解决方案。NFS的缺点也是比较明显的,单节点风险,比如NFS服务挂掉,整个文件就能访问,网站Down掉,因此NFS只能作为一个暂存的解决方案,使用NFS一定要有一个备份系统。
- NFS协议从诞生到现在为止,已经有多个版本 v4比v3快百分之20
- NFS v4 可以设置更大的块 524288 512k 要求使用TCP,有状态的自身实现了文件锁功能,NFSv4支持delegation实现多客户端文件同步
- NFS v3 无状态 只能设置块最大为32768 32k
- NFS v2 设计成为只使用UDP协议,v2 只能支持设置块最大为8192 8k
概念
安装
- yum install nfs-utils 安装nfs 和rpcbind
- rpm -ql nfs-utils 查看安装包详情
- /etc/sysconfig/nfs #配置文件
-
配置账号
cat /etc/passwd # 查看系统用户 groupadd -g 45 nfsuser #添加用户组nfsuser,GID 45值可以设置没有占用的 useradd -u 45 -g nfsuser nfsuser #添加用户,并加入用户组,设置用户UID值 mkdir /home/sharefiles #创建分享目录,分享目录所在磁盘注意容量问题 setfacl -m u:nfsuser:rwx /home/sharefiles #设置分享目录ACL用户权限
-
vim /etc/exports #编辑分享目录配置文件
#设置要分享的目录,分享给谁,定义相关属性权限 /home/sharefiles 10.29.167.186(rw,sync,all_squash,anonuid=45,anongid=45) /home/sharefiles 10.29.168.24(rw,sync,all_squash,anonuid=45,anongid=45) #分享目标可以是完整IP或IP域192.168.100.0/24表示一个网段主机,支持通配符* 表示所有主机 #权限:rw读写权限、ro只读、sync数据同步写入内存硬盘生产环境使用、async异步先写入内存后再写入硬盘、all_squash不论登录NFS的用户是谁都会改成匿名用户(nfsnobody)配合anonuid和anongid指定用户身份、root_squash默认值将root登陆用户转为匿名用户、fsid=0 根文件系统NFS4 no_root_squash 客户端使用 root 身份来操作服务器的文件系统
- sudo systemctl start rpcbind 启动服务RPC服务 先启动centos7以下service rpcbind start
- sudo systemctl start nfs-server 启动服务nfs service nfs-server start
- sudo systemctl enable nfs-server 加入开机启动 或命令 chkconfig nfs-server on
- sudo systemctl enable rpcbind
- sudo systemctl list-unit-files|grep nfs #查看系统中NFS服务开启状态
- sudo systemctl status/stop nfs-server #status为查看服务状态,stop为关闭服务。
- sudo systemctl disable nfs-server #关闭开机启动
- netstat -tulnp| grep -E '(rpc|nfs)' 查看NFS开启的端口
- rpcinfo -p localhost 查看本机RPC注册情况 rpcinfo 无法输出,那就表示注册的数据有问题!可能需要重新启动 rpcbind 与 nfs
- showmount -e localhost #显示出刚刚我们所设定好的相关 exports 分享目录信息
- 客户端安装
- yum install nfs-utils #同样安装启动 rpcbind
- systemctl enable rpcbind #开机启动
- systemctl start rpcbind #启动
- mkdir -p /home/nfs/ 创建挂载点目录
- mount -t nfs -o noatime,nodiratime,noexec,nosuid,nodev,rw,tcp,bg,intr,vers=4,rsize=65536,wsize=65536 10.29.167.233:/home/sharefiles /home/nfs #挂载
- grep nfs /proc/mounts #查看本机挂载的默认nfs4版本
- df -m 查看系统目录将可以看到挂载的NFS
- vim /etc/rc.local #开机挂载NFS写入加载命令 mount -a
- chmod +x /etc/rc.d/rc.local 给命令赋予执行权限
- vim /etc/fstab #开机挂载NFS
- 10.29.167.233:/home/sharefiles /home/nfs nfs4 noexec,nosuid,nodev,rw,tcp,bg,intr,vers=4,rsize=65536,wsize=65536 0 0
- umount -vl /home/nfs #取消挂载
- mount -a # 加载文件“/etc/fstab”中描述的所有文件系统
- 如果NFS还有客户端联机,NFS服务端服务器将无法关机,必须先关掉rpcbind和nfs才行。netstat -utlp 命令找出PID kill杀掉进程或者所有客户端卸载挂载
常用操作命令
-
nfsstat -rc 查看服务端是否存在瓶颈 retrans值过高说明NFS线程数不够,默认值为8
- 修改/etc/sysconfig/nfs配置文件中RPCNFSDCOUNT值调整,调整之后需重新加载配置exportfs -rv
- 生产服务器上,在系统资源够的情况下,可以按照一核CPU 8个nfs进程来算,2核16个进程
- ps -efl|grep nfsd 查看进程数
- 通过查看 cat /proc/net/rpc/nfsd文件的th行,第一个是nfsd的个数,后十个是线程是用的时间数,第二个到第四个值如果非常大,那么就需要增加nfsd的个数
- -l 打印输出状态列表信息
- -r 显示RPC 状态
- -v 显示全部状态信息
- -o net 显示包网络信息TCP UDP
- showmount -e 10.29.167.186 或 localhost 显示指定端的信息
- nfsstat -o net 查看网络包状态 TCP UDP的丢包率
- rpcinfo -p localhost 查看本机或指定IP的RPC服务注册情况
- rpcinfo -t localhost nfs #查看本机或指定IP的主机TCP使用的软件版本号
- rpcinfo -u localhost nfs #查看本机或指定IP的主机UDP使用的软件版本号
- tail /var/lib/nfs/etab 查看分享目录可以设置的其他参数
- exportfs -arv #修改exports配置分享文件之后重新挂载不需要重启nfs
- exportfs -auv #卸载所有已经分享的NFS目录资源,不能乱用
- exportfs -v #查看配置
配置
功能
调试
优化
-
客户端加载优化:
- mount -t nfs4 -o noexec,nosuid,nodev,rw,tcp,bg,intr,rsize=65536,wsize=65536 10.29.167.233:/home/sharefiles /home/nfs
- noatime 取消更新文件系统上的inode访问时间,提升I/O性能,优化I/O目的,推荐使用
nodiratime 取消更新文件系统上的directory inode访问时间,高并发环境,推荐显式应用该选项,提高系统性能
noexec 挂载的这个文件系统,要不要执行程序(安全选项)
nosuid 挂载的这个文件系统上面,可不可以设置UID(安全选项)
rsize/wsize 读取(rsize)/写入(wsize)的区块大小(block size),这个设置值可以影响客户端与服务端传输数据的缓冲存储量
- 对于小块读取 32k会在读取64k数据文件时读取性能下降。
- 对于小块写入性能都差不多
- 大块读取性能随配置变化大,其中值为32k,64k和128k具有最高和最一致的性能。
- 对于大块写入性能都差不多
- 内存越大性能越好,cpu多少不影响性能
- NFS4比NFS3性能高
- 所以建议:避免32k和1m。使用64k。使用“同步”和其他默认值。使用大内存,使用NFS4
- async 异步同步,此参数会提高I/O性能,但会降低数据安全(除非对性能要求很高,对数据可靠性不要求的场合。一般生产环境,不推荐使用)异步会超时不稳定
- NFS官方优化可以修改,官方的建议:
a.命令行调整
cat /proc/sys/net/core/rmem_max #该文件指定了发送套接字缓冲区大小的最大值
124928
cat /proc/sys/net/core/rmem_default #该文件指定了发送套接字缓冲区 大小的默认值
124928
echo 8388608 > /proc/sys/net/core/rmem_default
echo 16777216 > /proc/sys/net/core/rmem_max
- 内核优化:
- cat >>/etc/sysctl.conf<
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF
/sbin/sysctl -p 生效配置
常见问题
- 客户端的主机名或 IP 网段不被允许使用,没有配置IP允许分享挂载
- 服务器或客户端某些服务未启动 启动rpcbind
-
防火墙的问题,防火墙开放NFS
- firewall-cmd –permanent –zone=public –add-service=nfs
- firewall-cmd –reload
实际应用
- 测试NFS性能
- sync; echo 1 > /proc/sys/vm/drop_caches #安全清除缓存
-
阿里云服务器 云磁盘性能测试
SSD硬盘 最大IOPS :20000 最大吞吐量:256MBps 计算公式:IOPS=min{30容量,20000} 吞吐量=min{50+0.5容量,256}MBps 取最小值
高效云盘 最大IOPS: 3000 最大吞吐量: 80MBps 计算公式:IOPS=min{1000+6容量,3000} 吞吐量=min{50+0.1容量,80}MBps 取最小值
普通云盘 最大IOPS:数百 最大吞吐量:30MBps
200G高效云盘最大IOPS为 1000+6200=2200 最大吞吐量为: 50+0.1200= 70MBps
yum install fio
- 测试随机写IOPS:
fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Write_Testing
- 测试随机读IOPS:
fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Read_Testing
- 测试写吞吐量:
fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=64k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Write_PPS_Testing
- 测试读吞吐量:
fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=64k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Read_PPS_Testing
- dd 测试写性能的命令
/dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
/dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0
if=文件名:输入文件名 of=文件名:输出文件名
bs=bytes:同时设置读入/输出的块大小为bytes个字节
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数
测试时文件的大小至少是系统RAM的两倍,每次测试都使用umount 和mount对/testfs进行挂载,通过比较不同的块大小,得到优化的块大小。这样才能不用系统缓存
time dd if=/dev/zero of=/home/nfs/nfs.dat bs=64k count=16384 #循环向nfs目录中写入大小为64k的文件 写入次数16384 总共文件大小为1.GB
- dd 测试读性能的命令
time dd if=/home/nfs/nfs.dat of=/dev/null bs=64k
- sync; echo 1 > /proc/sys/vm/drop_caches #安全清除缓存
- 云盘 fio 结果
read : io=1024.0MB, bw=8803.4KB/s, iops=2200, runt=119111msec #随机读 带宽8.7M/秒
write: io=1024.0MB, bw=8804.7KB/s, iops=2201, runt=119093msec #随机写 带宽8.7M/秒
write: io=1024.0MB, bw=71737KB/s, iops=1120, runt= 14617msec #吞吐量写 带宽70M/秒
read : io=1024.0MB, bw=71776KB/s, iops=1121, runt= 14609msec #吞吐量读 带宽70M/秒
- 云盘dd结果
写性能结果: 耗时4.67692 s, 速度 81 MB/s cpu使用率为7% 无文件217M 覆盖写81M
读性能结果: 耗时0.237726 s, 速度73 MB/s
io= 执行了多少M的IO bw= 平均IO带宽 iops= IOPS runt= 线程运行时间
slat 提交延迟 clat 完成延迟 lat响应时间 bw 带宽 cpu利用率
- NFS fio 结果
write: io=1024.0MB, bw=6786.3KB/s, iops=1696, runt=154520msec #随机写 带宽6.7M/秒
read : io=1024.0MB, bw=13263KB/s, iops=3315, runt= 79062msec #随机读 带宽13M/秒 cpu消耗大了5倍
write: io=1024.0MB, bw=67615KB/s, iops=1056, runt= 15508msec #吞吐量写 带宽66M/秒
read : io=1024.0MB, bw=67606KB/s, iops=1056, runt= 15510msec #吞吐量读 带宽66M/秒
- NFS dd结果
写性能结果:耗时19.9055 s, 速度 50 MB/s cpu使用率为 3%
读性能结果:耗时0.248948 s, 速度 70 MB/s
- 正式环境普通云盘dd测试结果 带缓存不同配置
写性能:17.2018 s, 62.4 MB/s
读性能:0.267751 s, 4.0 GB/s
- 正式环境普通云盘fio测试结果 带缓存效果不同配置
write: io=1024.0MB, bw=31542KB/s, iops=492 , runt= 33244msec #吞吐量写 带宽31M/秒
read : io=1024.0MB, bw=77437KB/s, iops=1209 , runt= 13541msec #吞吐量读 带宽77M/秒
write: io=1024.0MB, bw=4563.3KB/s, iops=1140 , runt=229787msec #随机写 带宽4.5M/秒
read : io=1024.0MB, bw=5342.4KB/s, iops=1335 , runt=196275msec #随机读 带宽5.3M/秒