网络存储之 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 #该文件指定了发送套接字缓冲区 大小的默认值 124928echo 8388608 > /proc/sys/net/core/rmem_default echo 16777216 > /proc/sys/net/core/rmem_max
内核优化:
cat >>/etc/sysctl.conf<<EOFnet.core.wmem_default = 8388608net.core.rmem_default = 8388608net.core.rmem_max = 16777216net.core.wmem_max = 16777216EOF
/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= 70MBpsyum 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, 是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供 0if= 文件名:输入文件名 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/sio= 执行了多少 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/ 秒