10G NIC에서 nfs rdma 사용

Broadcom의 10G 네트워크 카드, NetXtreme-E BCM57416을 염가로 2장 손에 넣었으므로, NFS over RDMA를 유효하게 해 보았다.
아직 10000base-T 대응의 스위칭 허브를 개인으로 사기에는 조금 높기 때문에, 2개의 NIC를 LAN 케이블로 직결해 시험했다.

RDMA



RDMA란, Remote Direct Memory Access의 약자로, 「로컬의 컴퓨터의 메모리로부터, 다른 리모트의 컴퓨터의 메모리에 데이터의 DMA 전송을 실시하는 것」. OS를 튕겨 데이터 전송을 할 수 있다. 원래는 Infiniband에서 고속 전송을 수행하기 위해 개발된 것 같습니다.


  • 이미지 : NVMe를 최대한 활용하는 스토리지 네트워킹이란 | Pure Storage Blog 보다

  • NIC용 드라이버



    우선은 네트워크 카드 자체의 드라이버이지만, bnxt_en이 해당한다. Ubuntu 20.04라고 자동으로 인식해 주었다.
    [    1.527556] bnxt_en 0000:01:00.0 eth1: Broadcom BCM57416 NetXtreme-E 10GBase-T Ethernet found at mem e0510000, node addr 9c:dc:71:b6:b5:d0
    [    1.528469] bnxt_en 0000:01:00.0: 63.008 Gb/s available PCIe bandwidth (8.0 GT/s PCIe x8 link)
    [    1.554613] bnxt_en 0000:01:00.1 eth2: Broadcom BCM57416 NetXtreme-E 10GBase-T Ethernet found at mem e0500000, node addr 9c:dc:71:b6:b5:d8
    [    1.555833] bnxt_en 0000:01:00.1: 63.008 Gb/s available PCIe bandwidth (8.0 GT/s PCIe x8 link)
    

    RoCE driver



    계속해서, RoCE(RDMA over Converged Ethernet, 록키와 발음하는 것 같다)용의 드라이버. bnxt_re가 해당한다. 이곳은 자동으로 들어가지 않으므로 수동으로 실시한다.
    $ sudo modprobe bnxt_re
    

    이렇게 인식된다.
    [  412.826559] bnxt_re: Broadcom NetXtreme-C/E RoCE Driver
    [  412.898572] infiniband bnxt_re0: Device registered successfully
    [  412.934539] infiniband bnxt_re1: Device registered successfully
    

    또한 RPC/RDMA Transport 모듈을 밀어 넣습니다.
    $ sudo modprobe rpcrmda
    

    이쪽은 이렇게 인식된다.
    [   17.281994] RPC: Registered rdma transport module.
    [   17.281997] RPC: Registered rdma backchannel transport module.
    

    이 2의 드라이버는 /etc/modules 에 써 두면, 다음에 기동시에 유효하게 해 준다.
    bnxt_re
    rpcrdma
    

    nfs server



    nfs 서버측은, /export 를 공개로 둔다. 보안은 고려하지 않습니다.
    $ cat /etc/exports
    /export 192.168.0.0/255.255.255.0(rw,async,fsid=0,no_subtree_check,no_root_squash,insecure)
    

    여기서, NFS 서버를 (재) 기동한다.
    $ sudo systemctl start nfs-server
    

    그리고, RDMA 전송용의 포트 번호를 설정. 20049가 기본 포트 번호 인 것 같습니다.
    # echo rdma 20049 > /proc/fs/nfsd/portlist
    # cat /proc/fs/nfsd/portlist
    rdma 20049
    rdma 20049
    tcp 2049
    tcp 2049
    

    또한, 이 설정을 행해도, netstat의 결과에는 20049번 포트는 나오지 않는다.

    여기까지가, 서버측의 설정.

    nfs client



    NFS 클라이언트 측은 다음과 같이 마운트한다.
    # mount -o rdma,port=20049 192.168.0.1:/ /srv
    

    이제 파일을 복사해 보니 1.1GB/s 정도 나왔다.
    $ dd if=/srv/100G of=/dev/zero iflag=direct bs=32M
    3200+1 レコード入力
    3200+1 レコード出力
    107374182500 bytes (107 GB, 100 GiB) copied, 95.0471 s, 1.1 GB/s
    

    참고


  • Broadcom® NetXreme-C 및 NetXtreme-E 사용자 매뉴얼
  • GPUDirect SQL on NFS-over-RDMA 사용
  • 좋은 웹페이지 즐겨찾기