网络存储之 NFS

网络存储之 NFS

资源

特性

  • 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<<EOF
    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/秒

相关推荐