RDMA
RDMA(全稱RemoteDirect Memory Access) 它為了解決網絡傳輸中伺服器端資料處理的延遲而産生。
它的原理是将待傳輸的資料從一台計算機的記憶體,直接傳輸到另一台計算機的記憶體,整個傳輸過程無需作業系統和協定棧的介入。由于旁路了作業系統協定棧,通訊過程極大的降低了CPU的使用率,減少了核心的記憶體複制,以及使用者态與核心态的上下文切換。
常見的RDMA實作有三種,基于以太網的Roce網絡(RDMA over Converged Ethernet), InfiniBand, iWARP。
阿裡雲支援RDMA
阿裡雲支援超級計算叢集SCC,同時支援RoCE網絡和VPC網絡,其中RoCE網絡專用于RDMA通信。SCC 主要用于高性能計算和人工智能/機器學習、科學/工程計算、資料分析、音視訊處理等應用場景。
RoCE(RDMA over Convergent Ethernet)網絡速度達到InfiniBand網絡的性能,且能支援更廣泛的基于Ethernet的應用。
介紹:
https://www.alibabacloud.com/help/zh/doc-detail/60576.htm可以在ECS控制台直接購買包年包月的SCC機型虛拟機。
https://www.alibabacloud.com/help/zh/doc-detail/61978.htm容器支援RDMA
容器服務目前已支援RDMA,您可以将SCC機型的ECS添加到容器叢集中,并通過RDMA的Device plugin 在排程層面支援 RDMA。
通過聲明 resourcesLimit
rdma/hca: 1
,可以指定将容器排程到RDMA的ecs上。
建立容器叢集
進入
容器服務控制台, 選擇建立Kubernetes叢集。由于SCC目前僅在上海地域支援,容器叢集的地域請選擇 華東2(上海) 。 配置完其他參數後,點選叢集建立,等待叢集建立成功。
部署RDMA Device plugin
在容器服務控制台中,選擇使用模闆部署。 部署支援RDMA的Device plugin, 選擇對應的叢集和命名空間,模闆如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: rdma-devices
namespace: kube-system
data:
config.json: |
{
"mode" : "hca"
}
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: rdma-device-plugin
namespace: kube-system
spec:
template:
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
name: rdma-sriov-dp-ds
spec:
hostNetwork: true
nodeSelector:
aliyun.accelerator/rdma: "true"
tolerations:
- key: CriticalAddonsOnly
operator: Exists
containers:
- image: registry.cn-shanghai.aliyuncs.com/acs/rdma-device-plugin
name: k8s-rdma-device-plugin
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
volumeMounts:
- name: device-plugin
mountPath: /var/lib/kubelet/device-plugins
- name: config
mountPath: /k8s-rdma-sriov-dev-plugin
volumes:
- name: device-plugin
hostPath:
path: /var/lib/kubelet/device-plugins
- name: config
configMap:
name: rdma-devices
items:
- key: config.json
path: config.json
通過手動添加的方式将SCC的ECS加入叢集中
- 建立SCC的ECS, 并且和容器叢集在同一個VPC下。并且加入相同安全組
- 在容器服務控制台上操作 叢集-> 更多 -> 添加已有ECS。 使用手動添加, 并選擇建立的RDMA機器。擷取添加腳本。
- 登入上ECS, 執行腳本。 最終添加成功有如下顯示:
- 在節點 -> 标簽管理中,給rdma節點增加标簽 aliyun.accelerator/rdma: true
- 增加标簽後能夠看到節點上的RDMA的device plugin pod被成功配置設定到SCC的節點上
部署兩個測試鏡像
apiVersion: v1
kind: Pod
metadata:
name: rdma-test-pod
spec:
restartPolicy: OnFailure
containers:
- image: mellanox/centos_7_4_mofed_4_2_1_2_0_0_60
name: mofed-test-ctr
securityContext:
capabilities:
add: [ "IPC_LOCK" ]
resources:
limits:
rdma/hca: 1
command:
- sh
- -c
- |
ls -l /dev/infiniband /sys/class/net
sleep 1000000
---
apiVersion: v1
kind: Pod
metadata:
name: rdma-test-pod-1
spec:
restartPolicy: OnFailure
containers:
- image: mellanox/centos_7_4_mofed_4_2_1_2_0_0_60
name: mofed-test-ctr
securityContext:
capabilities:
add: [ "IPC_LOCK" ]
resources:
limits:
rdma/hca: 1
command:
- sh
- -c
- |
ls -l /dev/infiniband /sys/class/net
sleep 1000000
在一個容器中執行
ib\_read\_bw -q 30
另一個容器中執行
ib\_read\_bw -q 30 <上一個容器的 ip>
出現測試結果,說明兩個容器之間可以通過RDM完成資料傳輸。 帶寬為5500Mb/S, 約44Gbit/s。
tips: RDMA通訊建連過程普遍分為 TCP 和 RDMA_CM 兩種實作,如果應用程式使用RDMA_CM 的建連的方式,vpc網絡插件中配置設定的pod ip 無法作為RDMA_CM 位址, 容器需要設定HostNetwork。并将bond0 ip 設定為CM的通訊位址。