zoukankan      html  css  js  c++  java
  • 容器网络启用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即可部署到集群进行测试。

  • 相关阅读:
    Apache Ant 1.9.1 版发布
    Apache Subversion 1.8.0rc2 发布
    GNU Gatekeeper 3.3 发布,网关守护管理
    Jekyll 1.0 发布,Ruby 的静态网站生成器
    R语言 3.0.1 源码已经提交到 Github
    SymmetricDS 3.4.0 发布,数据同步和复制
    beego 0.6.0 版本发布,Go 应用框架
    Doxygen 1.8.4 发布,文档生成工具
    SunshineCRM 20130518发布,附带更新说明
    Semplice Linux 4 发布,轻量级发行版
  • 原文地址:https://www.cnblogs.com/zafu/p/11231536.html
Copyright © 2011-2022 走看看