Docker 컨테이너로 InfiniBand 부팅(성능도 측정)

6241 단어 Dockerinfiniband
만약 한이라면, 나는 Docker(LXC)로 InfiniBand를 이동하고 싶다!
이미 LXC에 발표된 논문이 있기 때문에 [1]로 Docker도 한번 실현해 봅시다.

절차.


컨디션

  • 호스트 측면: 중앙 OS 6.5
  • 컨테이너 측면: Hub OS 6.5
  • 이렇게 가정해서 일을 진행하다.혹시 Ubuntu12?04or higher도 기본적으로 같은 순서로 할 수 있습니다.
    호스트 OS에서 IB(InfiniBand)가 문제 없이 실행되고 있습니다.
    Docker로 centos6 이미지를 만들어 IB 주위 포장에 넣는다.
    $ sudo docker pull centos
    $ sudo docker run -i -t centos /bin/bash
    # yum update
    # yum install infiniband-diags
    # その他 IB パッケージをいろいろ
    
    검증된 환경 HCA는 ConnectX-2(mlx4)이므로 libmlx4 설치를 잊지 마십시오.
    # yum install libmlx4
    
    /etc/libibverbs.d/mlx4.driver
    있는지 확인하다.
    HCA에 해당하는 드라이버 패키지를 미리 넣지 않으면 ibvdevices 같은 거 할 때.
    Warning: no userspace device-specific driver found for
    /sys/class/infiniband_verbs/uverbs0
    
    주의하세요, 제가 이렇게 말할게요.
    호스트 측
    $ sudo docker commit XXXXXX(コンテナのID) centos6-ib
    
    그림의 스냅숏으로
    ibstat 확인을 수행하면 호스트 OS와 동일한 결과가 표시됩니다.
    # ibstat
    
    ibv_devinfo를 실행해 보도록 하겠습니다.
    # ibv_devinfo
    
    hca_id: mlx4_0
        transport:          InfiniBand (0)
        fw_ver:             2.9.1000
        node_guid:          XXXX:XXXX:XXXX:XXXX
        sys_image_guid:         XXXX:XXXX:XXXX:XXXX
        vendor_id:          0xXXXX
        vendor_part_id:         XXXX
        hw_ver:             0xXX
        board_id:           MT_XXXXXXX
        phys_port_cnt:          2
            port:   1
                state:          PORT_DOWN (1)
                max_mtu:        4096 (5)
                active_mtu:     4096 (5)
                sm_lid:         1
                port_lid:       1
                port_lmc:       0x00
                link_layer:     InfiniBand
    
            port:   2
                state:          PORT_DOWN (1)
                max_mtu:        4096 (5)
                active_mtu:     4096 (5)
                sm_lid:         0
                port_lid:       0
                port_lmc:       0x00
                link_layer:     InfiniBand
    
    대박이다.
    ibhosts 해볼게요.
    # ibhosts         
    src/query_smp.c:227; can't open UMAD port ((null):0)
    /usr/sbin/ibnetdiscover: iberror: failed: discover failed
    
    음...스트레이트로 ibnetdiscover 쫓아봐.
    # strace ibnetdiscover
    
    …
    open("/dev/infiniband/umad0", O_RDWR|O_NONBLOCK) = -1 ENOENT (No such file or directory)
    write(2, "src/query_smp.c:227; can't open "..., 53src/query_smp.c:227; can't open UMAD port ((null):0)
    ...
    
    거짓말이란 무엇인가!원래/dev/infiniband는 존재하지 않습니다.

    /dev/infiniband 설정


    Docker가 다른 추천 방법이 있는 것 같지만, 우선 호스트/dev/infniband를 컨테이너의/dev/infiniband에 강제로 연결해서 컨테이너를 시작합니다.
    $ sudo docker run -privileged -v /dev/infiniband:/dev/infiniband -i -t centos6-ib /bin/bash
    
    # ibhosts
    Ca  : 0xXXXXXXXXXXXXXX ports 2 "xeon HCA-1"
    
    Cool! 대박이다.드디어 Docker(LXC)로 IB에 접근할 수 있게 되었습니다!

    성능


    ib_read_bw, ib_write_bw, ib_read_lat, ib_read_bw로 측정했어요.한쪽은 LXC 컨테이너 내에서, 다른 한쪽은 Native에서 이동합니다.ConnectX2QDR(40Gbps)로 측정합니다.

    Native(호스트 OS에서 직접 실행)와는 거의 변화가 없네요!과정은 LXC에서 작동하지만, 그 비용은 없다고 할 수 있다.Cool.
    실행 로그는 다음과 같습니다.

    Docker 내(LXC container)에서 실행

    # ib_read_bw 192.168.11.16
    …
    -----------------------------------
     #bytes     #iterations    BW peak[MB/sec]    BW average[MB/sec]   MsgRate[Mpps]
     65536      1000           3008.83            3008.80             0.048141
    ----------------------------------------------------
    
    # ib_write_bw 192.168.11.16
    …
    -----------------------------------
     #bytes     #iterations    BW peak[MB/sec]    BW average[MB/sec]   MsgRate[Mpps]
     65536      5000           3066.07            3066.05             0.049057
    ---------------------------------------------------------------------------------------
    
    
    # ib_read_lat 192.168.11.16
    …
    -----------------------------------
     #bytes #iterations    t_min[usec]    t_max[usec]  t_typical[usec]
     2       1000          1.66           20.13        2.65  
    ---------------------------------------------------------------------------------------
    
    
    # ib_write_lat 192.168.11.16
    …
    -----------------------------------
     #bytes #iterations    t_min[usec]    t_max[usec]  t_typical[usec]
     2       1000          0.80           7.12         0.86  
    ---------------------------------------------------------------------------------------
    

    호스트 OS(Native)에서 실행

    $ ib_read_bw 192.168.11.16
    …
    -----------------------------------
     #bytes     #iterations    BW peak[MB/sec]    BW average[MB/sec]   MsgRate[Mpps]
     65536      1000           3015.43            3011.54             0.048185
    ---------------------------------------------------------------------------------------
    
    
    $ ib_write_bw 192.168.11.16
    …
    -----------------------------------
     #bytes     #iterations    BW peak[MB/sec]    BW average[MB/sec]   MsgRate[Mpps]
     65536      5000           3065.79            3065.63             0.049050
    --------------------------------------------------------------------------------
    
    
    $ ib_read_lat 192.168.11.16
    …
    -----------------------------------
     #bytes #iterations    t_min[usec]    t_max[usec]  t_typical[usec]
     2       1000          1.68           39.48        2.67  
    ---------------------------------------------------------------------------------------
    
    
    $ ib_write_lat 192.168.11.16
    …
    -----------------------------------
     #bytes #iterations    t_min[usec]    t_max[usec]  t_typical[usec]
     2       1000          0.80           4.70         0.86  
    ---------------------------------------------------------------------------------------
    

    TODO

  • /dev의 실용성은 어떨까dev/infiniband보다 더 좋은 귀속 방법은 없나요?
  • 한층 더 활용하다


    IBHCA를 제외하고 Docker는 특권 모드+LXC 설정을 통해 GPU의 보급을 실현할 수 있다.
    노력한다면 PCIex 장치는 일반적으로 Docker에서 실행될 수 있습니다.

    참고 문헌

  • [1] Performance Evaluation of Container-based Virtualization for High Performance Computing Environments http://marceloneves.org/papers/pdp2013-containers.pdfk
  • 좋은 웹페이지 즐겨찾기