InfiniBand経由でNFSサービスを利用する

方法としてはどちらもIPoverInfiniBand (IPoIB)にてInfiniBand上でTCPを扱わせて、

  • IP経由のNFS
  • RDMA経由のNFS(NFSoRDMA)

と2つの選択肢がある。
ここではNFSサーバ側のIPoIBを10.64.0.2/24として、NFSクライアント側のIPoIBを10.64.0.1/24としている

TCP/IP経由のNFS

IPoIBで用意したIPアドレスで「mount -t nfs」を行う。特に変わったことはいらない。
共に「yum install nfs-utils」としてnfs関係パッケージをインストールする

  • NFSサーバ側
    [root@s ~]# systemctl start nfs-server.service
    [root@s ~]# ip addr show ib0
    3: ib0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2044 qdisc pfifo_fast state UP qlen 256
        link/infiniband 80:00:02:08:fe:80:00:00:00:00:00:00:00:1a:4b:ff:ff:0c:62:5d brd 00:ff:(略
        inet 10.64.0.2/24 brd 10.64.0.255 scope global ib0
           valid_lft forever preferred_lft forever
        inet6 fe80::21a:4bff:ff0c:625d/64 scope link
           valid_lft forever preferred_lft forever
    [root@s ~]#
    [root@s ~]# cat /etc/exports
    /share 10.64.0.0/24(rw,sync,no_root_squash,insecure,fsid=0)
    [root@s ~]# exportfs -avr
  • NFSクライアント側
    [root@e ~]# mount -t nfs 10.64.0.2:/share /share
     
    [root@e ~]# mount
     :
    10.64.0.2:/share on /share type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,(改行
    port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.64.0.1,local_lock=none,addr=10.64.0.2)
    [root@e ~]#
    proto=tcpである。

RDMA経由のNFS

InfiniBandプロトコルのRDMA(Remote Direct Memory Access)転送機能でNFSを利用する
NFSサーバ、クライアント共にrdma.confを修正して、SVCRDMA_LOADを有効にして、NFSoRDMAのポートを定義する。

[root@s ~]# diff -u /etc/rdma/rdma.conf.161022 /etc/rdma/rdma.conf
--- /etc/rdma/rdma.conf.161022  2015-12-01 10:58:10.000000000 +0900
+++ /etc/rdma/rdma.conf 2016-10-22 01:06:56.319339758 +0900
@@ -13,7 +13,8 @@
 # Load NFSoRDMA client transport module
 XPRTRDMA_LOAD=yes
 # Load NFSoRDMA server transport module
-SVCRDMA_LOAD=no
+SVCRDMA_LOAD=yes
+NFSoRDMA_PORT=20049
 # Should we modify the system mtrr registers?  We may need to do this if you
 # get messages from the ib_ipath driver saying that it couldn't enable
 # write combining for the PIO buffs on the card.
[root@s ~]#
[root@s ~]# systemctl enable rdma.service

*ドキュメントには「NFSoRDMA_PORT」の指定が書かれているが定義しても無駄みたい。。

  • NFSサーバ側
    必要なパッケージがロードされていることを確認する
    [root@s ~]# systemctl enable nfs-server
    [root@s ~]# systemctl start nfs-server
    [root@s ~]# lsmod |grep  "^svcrdma"
    svcrdma                40547  0
    [root@s ~]# echo rdma 20049 > /proc/fs/nfsd/portlist
  • NFSクライアント側
    [root@e ~]# modprobe xprtrdma
    [root@e ~]# mount -o rdma,port=20049 10.64.0.2:/share /share
    [root@e ~]# mount
     :
    10.64.0.2:/share on /share type nfs4 (rw,relatime,vers=4.0,rsize=262144,wsize=262144,namlen=255,hard,proto=rdma,(改行
    port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.64.0.1,local_lock=none,addr=10.64.0.2)
    [root@e ~]#
    proto=rdmaとなる

ベンチマークテスト

fioで計測(使用スクリプト fio/計測2)
まずはNFSサーバ側(s.sybyl.local)のローカルHDD(/share(xfs,3TB,7200rpm))を計測
ついで、rdma経由のNFSクライアントで計測

ローカルHDDNFSoRDMANFS IPoIBNFS TCP
Read(MB/s)Write(MB/s)Read(MB/s)Write(MB/s)Read(MB/s)Write(MB/s)Read(MB/s)Write(MB/s)
Seq151.57151.97180.7115.97179.9716.6695.7714.85
512K27.0740.4653.718.5262.589.5221.627.88
4K0.491.120.900.100.910.100.510.10
4KQD321.081.111.640.291.640.340.920.33

bonnie++で計測(bonnie++ -d /share -s 32768 -r 16384 -n 1:0:0:1 -u root -x 3)
*ファイル作成、読み込み、削除の計測は省きました。純粋に64GBのファイルの読み込み、書込み速度のみを計測してます

  • ローカルで計測
    Sequential Output
    KB(%CPU)
    Input
    KB(%CPU)
    Random Seeks
    KB(%CPU)
    Per CharBlockRewritePer CharBlock
    2155(95)179441(5)84639(7)4201(97)183412(8)1593(16)
    2185(94)179297(5)84197(8)3928(95)183478(8)1559(19)
    2172(93)180576(5)85918(8)4095(96)183796(8)1595(16)
  • NFS(NFSoRDMA)で計測(mount -o rdma,port=20049 10.64.0.2:/share /share)
    Sequential Output
    KB(%CPU)
    Input
    KB(%CPU)
    Random Seeks
    KB(%CPU)
    Per CharBlockRewritePer CharBlock
    1807(95)165944(5)85336(6)5705(100)466640(11)696.5(4)
    1890(95)160159(4)87028(6)5422(100)421119(10)974.5(4)
    1900(95)162305(5)85243(6)5347(100)464139(11)881.2(5)
  • NFS(IPoIB)で計測(mount 10.64.0.2:/share /share)
    Sequential Output
    KB(%CPU)
    Input
    KB(%CPU)
    Random Seeks
    KB(%CPU)
    Per CharBlockRewritePer CharBlock
    1852(96)127938(3)72433(6)5701(100)243312(11)785.5(14)
    1909(95)136700(4)71723(6)5398(100)250118(11)861.6(4)
    1890(95)139902(4)72462(5)5371(100)245020(6)706.2(5)
  • NFS(TCP)で計測(mount 192.168.0.7:/share /share)
    Sequential Output
    KB(%CPU)
    Input
    KB(%CPU)
    Random Seeks
    KB(%CPU)
    Per CharBlockRewritePer CharBlock
    1780(94)98180(2)44046(4)5138(99)116332(5)963.5(5)
    1833(93)83133(2)44069(4)5321(99)117121(5)746.1(3)
    1852(93)85583(2)44304(4)4984(99)115693(5)896.1(5)

考察

1000Mbpsの回線経由だと1000Mbps(125Mbyte/sec)は超えらない。InfiniBandを用いるとIPoIBをベースにしてもその上限を超えてほぼローカルのHDDにアクセスしている速度となる。RDMAを使ったほうがCPUの負荷は低くなると伺うが、どうやらクライアント側ではそんなに差はない。サーバ側でのお話なのだろうか?(未確認)

ただ懸念としてNFSoRDMA方式を採用する場合、どうしても「echo rdma 20049 > /proc/fs/nfsd/portlist」の操作が必要みたい。ドキュメントには「rdma.conf」にて定義とあるが有効にはならなかった。そのためどうしてもNFSサーバ、NFSサーバに手作業が入ってしまう。

起動ボタンを押したらNFSマウントまで行ってくれれば楽なのだが。
IPoIBのNFSを採用すれば回避される事案でしょうけど。

留意

IPoIBを使ってNFSoRDMAでもNFSでも、その状態でInfiniBandプロトコルを使った通信は継続して利用できました。


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2016-10-26 (水) 21:37:17 (211d)