容器網絡啟用RDMA高速通訊-Freeflow


容器網絡啟用RDMA高速通訊-Freeflow

容器網絡啟用RDMA高速通訊-Freeflow

1、Freeflow簡介

RDMA是一種網卡間直接高速互聯的通訊機制。對比傳統DMA的內部總線IO,RDMA通過網絡在兩個端點的應用軟件之間實現buffer的直接傳遞;而對比傳統的網絡傳輸,RDMA又無需操作系統和協議棧的介入。RDMA可以輕易實現端點間的超低延時、超高吞吐量傳輸,而且基本不需要CPU、OS的資源參與,在高速網絡環境下,不必再為網絡數據的處理和搬移耗費過多資源。RDMA具有三大特性:CPU offload 、kernel bypass、zero-copy。詳細架構和原理參見-https://www.cnblogs.com/zafu/p/8335200.html 。

Freeflow是一個高速的容器覆蓋網絡,通過啟用RDMA通訊加速TCP socket達到物理鏈路級的傳輸速度。

Freeflow工作於流行的覆蓋網絡的上層,包括Flannel、Weave等解決方案。容器具有自己的virtual network interfaces 和 IP 地址,不需要直接訪問硬件的 NIC interface。一個輕量級的Freeflow library 位於 containers之中,橋接RDMA 和 TCP socket APIs, 以及一個容器外的 Freeflow router幫助加速這些 APIs。

2、Freeflow的三種工作模式

Freeflow工作有三種模式:fully-isolated RDMA, semi-isolated RDMA, 以及 TCP。

當前釋放的版本僅支持fully-isolated RDMA,提供了不同容器件的最好的隔離性,與 multi-tenant 環境工作良好。提供了典型的 RDMA performance (40Gbps帶寬和1微秒時延), 這通過一些 CPU開銷來實現。

我們未來將釋放支持另外兩種模式的版本。Semi-isolated RDMA 提供同樣的 CPU 效率,作為bare-metal RDMA, 同時沒有data path的full isolation。TCP mode 加速了TCP socket 的性能到與 bare-metal一樣。在典型的Linux server,如果帶有40Gbps NIC,達到 25Gbps 帶寬,只需要單個TCP 連接,時延小於20微秒。

3、快速運行Freeflow演示

下面是在fully-isolated RDMA 模式下運行Freeflow的步驟:

  • Step 1: 啟動Freeflow router (每一個server一個實例)。
sudo docker run --name router1 --net host -e "FFR_NAME=router1" -e "LD_LIBRARY_PATH=/usr/lib/:/usr/local/lib/:/usr/lib64/" -v /sys/class/:/sys/class/ -v /freeflow:/freeflow -v /dev/:/dev/ --privileged -it ubuntu:14.04 /bin/bash

然后 log into到router container,通過:

sudo docker run exec -it router1 bash

下載和安裝與host主機同樣版本的RDMA libraries 和 drivers。目前,Freeflow開發和測試通過 "MLNX_OFED_LINUX-4.0-2.0.0.1-ubuntu14.04-x86_64.tgz" ,你可以下載在:

然后,檢出獲取 libraries-router/librdmacm-1.1.0mlnx/的代碼,Build 和 install 該library 到 /usr/lib/ (缺省目錄)。

最后,檢出獲取 ffrouter/的代碼,通過"build.sh"在源碼目錄Build,通過運行 "./router router1"。

  • Step 2: 重復Step 1,在其它的Host上啟動router。你可以捕獲router1的Docker image,用於避免重復building 和安裝的過程。
  • Step 3: 在同一個host作為router1啟動一個customer container:
sudo docker run --name node1 --net weave -e "FFR_NAME=router1" -e "FFR_ID=10" -e "LD_LIBRARY_PATH=/usr/lib" -e --ipc container:router1 -v /sys/class/:/sys/class/ -v /freeflow:/freeflow -v /dev/:/dev/ --privileged --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm -it ubuntu /bin/bash

你可以使用任何容器覆蓋網絡,本例子中我們使用Weave (https://github.com/weaveworks/weave)。

環境變量 "FFR_NAME=router1" 指向 container 到在同一個host的 router (router1) ;"FFR_ID=10" 是在 FreeFlow中的容器ID。同一個host中的每一個 container有一個獨立的 FFR_ID。在下一版本中,FFR_ID 將被移除。

下載和安裝與host主機同樣版本的RDMA libraries 和 drivers。目前,Freeflow開發和測試通過 "MLNX_OFED_LINUX-4.0-2.0.0.1-ubuntu14.04-x86_64.tgz" ,你可以下載在:

然后,檢出獲取 libraries-router/librdmacm-1.1.0mlnx/的代碼,Build 和 install 該library 到 /usr/lib/ (缺省目錄)。

  • Step 4: 重復 Step 2在更多的host上啟動 customer containers。你可以捕獲router1的Docker image,用於避免重復building 和安裝的過程。

注意:該版本的實現硬編碼了 host IPs 和 virtual IP到 host IP 的映射,在  https://github.com/Microsoft/Freeflow/blob/master/ffrouter/ffrouter.cpp#L215 和 https://github.com/Microsoft/Freeflow/blob/master/ffrouter/ffrouter.h#L76。為了快速測試,你需要按照你的環境進行編輯。理想的實現方式,該router將從container overlay controller/zookeeper/etcd中讀取出來。

  • Validation: 在 customer containers, 安裝 RDMA 性能測試工具,通過 "sudo apt-get install perftest"。嘗試 "ib_send_bw" 或 "ib_send_lat"。

4、Freeflow應用

對於 RDMA的應用,Freeflow 已經測試的平台包括 RDMA-based Spark (http://hibd.cse.ohio-state.edu/), HERD (https://github.com/efficient/HERD), Tensorflow with RDMA enabled (https://github.com/tensorflow/tensorflow) 以及 rsocket (https://linux.die.net/man/7/rsocket)。大部分應用不需要做任何修改(或很少修改)即可運行, 取得超過傳統 TCP socket實現的性能。

對於 TCP,Freeflow 在很多applications/framework下進行了測試,包括 DLWorkspace (https://github.com/Microsoft/DLWorkspace) and Horovod (https://github.com/uber/horovod).

  • 聯系開發者

該實現是一個研究原型,代碼還未進入產品級狀態。技術細節將通過科研論文出版,如果您感興趣,歡迎到 Github提交issue或者直接聯系下面的作者。

5、在Kubernetes部署FreeFlow插件

很多時候,在Kubernetes集群中的pod-to-pod網絡帶寬不如 host-to-host的好,有很多種原因的影響。 對於分布式的計算尤其是分布式機器學習中,網絡帶寬在很大程度上影響性能。為了優化 pod-to-pod 網絡, FreeFlow plugin (https://github.com/Microsoft/Freeflow) 是非常有幫助的,而且只需要兩個步驟就能使用。

部署FreeFlow為 DaemonSet

示范的yaml在 here。在yaml文件中,改變環境變量 HOST_IP_PREFIX 為實際的pods使用的 IP 范圍。

kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: freeflowrouter
  namespace: default
spec:
  selector:
    matchLabels:
      freeflowrouter-node: pod 
  template:
    metadata:
      name: freeflowrouter
      labels:
        freeflowrouter-node: pod      
    spec:
      dnsPolicy: ClusterFirstWithHostNet 
      hostNetwork: true        
      containers:
      - name: freeflowrouter
        image: dlws/freeflow:0.16
        securityContext:
          privileged: true
        volumeMounts:
        - mountPath: /freeflow
          name: freeflow
        env:
        - name: HOST_IP_PREFIX
          value: 10.240.0.0/16
      volumes:
      - name: freeflow
        hostPath:
          path: /freeflow        
      tolerations:
      - key: CriticalAddonsOnly
        operator: Exists
      - key: node-role.kubernetes.io/master
        effect: NoSchedule           

創建啟用FreeFlow的pod

示范的yaml在 here. 添加兩個環境變量 LD_PRELOAD 和 VNET_PREFIX到 pod 定義中,如下所示。然后,改變環境變量VNET_PREFIX的值為實際的pods使用的 IP 范圍。

containers:
      - name: tf-worker1
        image: tensorflow/tensorflow:1.8.0-gpu
        env:
        - name: LD_PRELOAD
          value: "/freeflow/libfsocket.so"
        - name: VNET_PREFIX
          value: 10.244.0.0/16

掛載 volume /freeflow,其中包含pod中用到的 FreeFlow library。

volumeMounts:
        - mountPath: /freeflow
          name: freeflow      
      volumes:
      - name: freeflow
        hostPath:
          path: /freeflow

現在,有了一個使用 FreeFlow來進行網絡帶寬加速的Kubernetes應用pods,保存為freeflow.yaml文件,使用kubernetes create -f freeflow.yaml即可部署到集群進行測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM