網絡存儲之 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 #配置文件
  • 配置帳號php

    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 #編輯分享目錄配置文件html

    #設置要分享的目錄,分享給誰,定義相關屬性權限
    /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線程數不夠,默認值爲8node

    • 修改/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 #查看配置

配置

功能

調試

優化

  • 客戶端加載優化:linux

    • 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),這個設置值能夠影響客戶端與服務端傳輸數據的緩衝存儲量vim

    • 對於小塊讀取 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_maxcentos

    • 內核優化:
    • 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/秒

    相關文章
    相關標籤/搜索