写点什么

如何在 AWS EC2 实例以及基于 AWS 的容器平台中使用 DPDK(二)

  • 2019-12-20
  • 本文字数:5572 字

    阅读完需:约 18 分钟

如何在 AWS EC2 实例以及基于 AWS 的容器平台中使用 DPDK(二)

3 设置 DPDK 环境

使用 amazon linux2 AMI 启动一台 c5.2xlarge 实例,并通过 ssh 登录。

3.1 设置 hugepages

CPU 所能支持的 hugepages 大小可以通过查看 CPU 的 flag 确认,如果支持 pse,则平台支持 2MB 的 hugepages,如果支持 pdpe1gb,则平台支持 1GB 的 hugepages。


查看我们使用的操作系统环境 c5.2xlarge。


Bash


# cat /proc/cpuinfo |grep -e pse -e pdpe1gbflags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp
复制代码


 
复制代码


可见,c5.2xlarge 可以支持 2MB 的 hugepages 和 1GB 的 hugepages。


对于不同的 hugepages,用不同的方式完成配置。一般来说,对于 64-bit 的应用,建议使用 1GB hugepages。下面我们会分别来进行说明。


针对 2M hugepage,设置如下:


在大多数较新的 linux 发行版,默认已经启用的 2M hugepages,并已经通过 dev-hugepages.mount 服务进行挂载,比如本文所使用的 amazon linux2。镜像为 amzn2-ami-hvm-2.0.20191116.0-x86_64-gp2 (ami-07539a31f72d244e7),kernel 版本 4.14.154-128.181.amzn2.x86_64。


更新系统。


Bash


# yum update -y
复制代码


查看当前系统对于 hugepages 分配和支持。


Bash


# cat /proc/meminfo |grep HugeAnonHugePages:         0 kBShmemHugePages:        0 kBHugePages_Total:    0HugePages_Free:     0HugePages_Rsvd:        0HugePages_Surp:        0Hugepagesize:       2048 kB
# cat /proc/mounts |grep -i hugepagehugetlbfs /dev/hugepages hugetlbfs rw,relatime,pagesize=2M 0 0
复制代码


针对 2M hugepages,可以通过不同的方式来进行配置。


设置内核参数的方式。针对 grub2 引导的发行版,配置如下:


Bash


# echo GRUB_CMDLINE_LINUX="hugepages=2048">>/etc/default/grub# grub2-mkconfig -o /boot/grub2/grub.cfg
复制代码


重启后可以确认已经生效。


Bash


# cat /proc/cmdline | grep hugepagesBOOT_IMAGE=/boot/vmlinuz-4.14.152-127.182.amzn2.x86_64 root=UUID=e8f49d85-e739-436f-82ed-d474016253fe ro hugepages=2048 console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
# cat /proc/meminfo | grep -i hugepageAnonHugePages: 0 kBShmemHugePages: 0 kBHugePages_Total: 2048HugePages_Free: 2048HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 2048 kB
复制代码


临时修改修改内核参数的方式。


Bash


# echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages# cat /proc/meminfo |grep HugeAnonHugePages:         0 kBShmemHugePages:        0 kBHugePages_Total:    1024HugePages_Free:     1024HugePages_Rsvd:        0HugePages_Surp:        0Hugepagesize:       2048 kB
复制代码


对于多节点的 NUMA 实例,需要显式的设定不同的 NUMA 节点。


Bash


# echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages# echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
复制代码


当然,上述方式重启丢失需要重新设置,可以通过 sysctl.conf 配置来配置持久生效。


Bash


# echo "vm.nr_hugepages=512" >> /etc/sysctl.conf# sysctl -p# cat /proc/meminfo |grep HugeAnonHugePages:         0 kBShmemHugePages:        0 kBHugePages_Total:     512HugePages_Free:      512HugePages_Rsvd:        0HugePages_Surp:        0Hugepagesize:    2048 kB
复制代码


针对 1G hugepages,只能通过配置内核启动参数的方式进行设置。后续的操作会使用 1G hugepage 来进行。


首先修改/etc/default/grub,增加 GRUB_CMDLINE_LINUX=”default_hugepagesz=1G hugepagesz=1G hugepages=4”


Bash


# grub2-mkconfig -o /boot/grub2/grub.cfg
复制代码


重新启动实例。可以查看设置已经生效。


Bash


# cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-4.14.152-127.182.amzn2.x86_64 root=UUID=e8f49d85-e739-436f-82ed-d474016253fe ro default_hugepagesz=1G hugepagesz=1G hugepages=4 console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
# cat /proc/meminfo |grep -i hugepageAnonHugePages: 0 kBShmemHugePages: 0 kBHugePages_Total: 4HugePages_Free: 4HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 1048576 kB
复制代码

3.2 安装和配置 DPDK

配置编译和使用所需的系统环境。


Bash


# yum groupinstall "development tools" -y# yum install python3 numactl numactl-devel -y
复制代码


DPDK 可以使用 meson 和 ninjia 来进行配置,构建和安装,如果使用这种方式请首先安装 meson 和 ninjia。


Bash


# pip3 install meson ninja
复制代码


下面的说明中,我们使用 makefile 而并没有使用 meson 和 ninjia 进行安装。下载 DPDK 包。


Bash


# wget http://fast.dpdk.org/rel/dpdk-19.11.tar.xz# tar Jxvf dpdk-19.11.tar.xz# cd dpdk-19.11/
复制代码


配置和安装。


Bash


# export RTE_SDK=/root/dpdk-19.11# export RTE_TARGET=x86_64-native-linuxapp-gcc# make config install T=$RTE_TARGET DESTDIR=$RTE_SDK
复制代码


另外,DPDK 提供了安装配置脚本 dpdk-19.11/usertools/dpdk-setup.sh,我们也可以使用该脚本进行安装并可以进行后续的配置操作。


基于脚本配置方式如下。


Bash


# ./usertools/dpdk-setup.sh ------------------------------------------------------------------------------ RTE_SDK exported as /root/dpdk-19.11.script---------------------------------------------------------------------------------------------------------------------------------------- Step 1: Select the DPDK environment to build----------------------------------------------------------[1] arm64-armada-linuxapp-gcc……………………[37] x86_64-native-linuxapp-clang[38] x86_64-native-linuxapp-gcc[39] x86_64-native-linuxapp-icc[40] x86_64-native-linux-clang[41] x86_64-native-linux-gcc[42] x86_64-native-linux-icc[43] x86_x32-native-linuxapp-gcc[44] x86_x32-native-linux-gcc
---------------------------------------------------------- Step 2: Setup linux environment----------------------------------------------------------[45] Insert IGB UIO module[46] Insert VFIO module[47] Insert KNI module[48] Setup hugepage mappings for non-NUMA systems[49] Setup hugepage mappings for NUMA systems[50] Display current Ethernet/Baseband/Crypto device settings[51] Bind Ethernet/Baseband/Crypto device to IGB UIO module[52] Bind Ethernet/Baseband/Crypto device to VFIO module[53] Setup VFIO permissions
---------------------------------------------------------- Step 3: Run test application for linux environment----------------------------------------------------------[54] Run test application ($RTE_TARGET/app/test)[55] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
---------------------------------------------------------- Step 4: Other tools----------------------------------------------------------[56] List hugepage info from /proc/meminfo
---------------------------------------------------------- Step 5: Uninstall and system cleanup----------------------------------------------------------[57] Unbind devices from IGB UIO or VFIO driver[58] Remove IGB UIO module[59] Remove VFIO module[60] Remove KNI module[61] Remove hugepage mappings
[62] Exit Script
复制代码


安装完毕之后,创建的目标目录内会包括了所有的 lib 库,poll-mode 驱动和 header 文件,用以后续构建基于 DPDK 的应用。此外,该目录还包括一些内置编译完成可用的 DPDK 应用,可以用于测试。


接下来,我们需要加载相应的驱动来替代默认的 ena 驱动,以支持 DPDK。ENA 网卡可以支持 UIO 模式或者 VFIO 模式的 DPDK 驱动,linux 的内核已经包含了标准的 uio_pic_generic 驱动,而刚刚我们编译也获得了 DPDK 提供的 igb_uio 驱动,uio_pic_generic 对于 Virtual functions 的支持会有限制,通常在 UIO 模式下,我们会使用 igb_uio。


Bash


# modprobe uio# insmod /root/dpdk-19.11/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko wc_activate=1
复制代码


相对来说,VFIO 会是一个更加安全和健壮的选择,但是 VFIO 需要依赖于 IOMMU,并且也不支持创建 Virtual functions,同时还需要设置所需的权限来运行非特权用户的 DPDK 应用。当在不支持 IOMMU 的环境中,比如我们使用的 EC2 C5.2xlarge 环境,想要使用 VIFO 时,也会工作在类似 UIO 的非安全环境。另外,你可能需要使用 AWS 的 patch https://github.com/amzn/amzn-drivers/tree/master/userspace/dpdk来重编译vfio-pci,以避免可能的性能问题或支持某些特性比如write combining。如下为直接加载 vfio-pci 模块并配置权限。


Bash


# modprobe vfio-pci# chmod a+x /dev/vfio# chmod 0666 /dev/vfio/*
复制代码


对于大部分实例来说,并不支持 IOMMU,需要确保驱动的 noiommu 参数被设置。


Bash


# echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
复制代码


对于其他一些实例来说,比如 i3.metal,可以支持 IOMMU,需要在内核参数指定。通过类似的方法,修改 grub2 启动设定。在 GRUB_CMDLINE_LINUX 中追加 iommu=1 intel_iommu=on。然后重新生成引导参数文件。


Bash


# grub2-mkconfig > /boot/grub2/grub.cfg
复制代码


重启即可生效。

3.3 挂载 hugepagefs

之前的操作已经完成了 hugepages 内存的预留,要使得 DPDK 能够使用这些内存,还需要如下步骤的配置和操作。


对于 2M hugepage 来说。


Bash


# mkdir /mnt/huge# mount -t hugetlbfs nodev /mnt/huge
复制代码


或者通过修改/etc/fatab 来持久化设置挂载点。


Bash


# echo “nodev /mnt/huge hugetlbfs defaults 0 0” >> /etc/fstab
复制代码


对于 1G hugepage,必须要指定 pagesize 作为挂载参数,本文的操作采用此方式。


Bash


# mkdir /mnt/huge_1gb# echo “nodev /mnt/huge_1gb hugetlbfs pagesize=1GB 0 0” >> /etc/fstab
复制代码

3.4 绑定 ENA 设备到 UIO 或者 VFIO 模块

这里以 UIO 模块为例。


首先,我们在测试的实例上增加一个新的 ENI 网口来配置 DPDK。只需在控制台新增网络接口,并附加到正在使用的实例上。如下所示。




之后,我们可以在实例内查看到这块新加入的设备。


Bash


#  ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000    link/ether 0a:ff:5f:49:42:c6 brd ff:ff:ff:ff:ff:ff    inet 172.31.9.193/20 brd 172.31.15.255 scope global dynamic eth0       valid_lft 2820sec preferred_lft 2820sec    inet6 fe80::8ff:5fff:fe49:42c6/64 scope link        valid_lft forever preferred_lft forever3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000    link/ether 0a:a1:03:74:08:90 brd ff:ff:ff:ff:ff:ff    inet 172.31.3.226/20 brd 172.31.15.255 scope global dynamic eth1       valid_lft 3095sec preferred_lft 3095sec    inet6 fe80::8a1:3ff:fe74:890/64 scope link        valid_lft forever preferred_lft forever
复制代码


我们将 eth1 绑定到 igb_uio 模块,DPDK 提供的 dpdk-devbind.py 脚本可以用来进行绑定,解绑或者状态查看等操作(或者使用 dpdk-setup.sh 脚本来进行配置)。当前两个 ENA 设备均使用的 ena 驱动。


Bash


# /root/dpdk-19.11/usertools/dpdk-devbind.py --status
Network devices using kernel driver===================================0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=eth0 drv=ena unused=igb_uio *Active*0000:00:06.0 'Elastic Network Adapter (ENA) ec20' if=eth1 drv=ena unused=igb_uio *Active*
复制代码


接下来,将设备 eth1,0000:06:00.0 绑定到 igb_uio 驱动。


首先关闭 eth1 端口


Bash


# ifconfig eth1 down
复制代码


绑定到 igb_uio 驱动。


Bash


/root/dpdk-19.11/usertools/dpdk-devbind.py --bind=igb_uio 06:00.0
复制代码


也可以使用设备名:


Bash


/root/dpdk-19.11/usertools/dpdk-devbind.py --bind=igb_uio eth1
复制代码


确认是否正常绑定。


Bash


# /root/dpdk-19.11/usertools/dpdk-devbind.py  --status
Network devices using DPDK-compatible driver============================================0000:00:06.0 'Elastic Network Adapter (ENA) ec20' drv=igb_uio unused=ena
Network devices using kernel driver===================================0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=eth0 drv=ena unused=igb_uio *Active*
复制代码


如果需要恢复 eth1 使用原有的内核 ena 驱动,类似的简单进行如下操作。


Bash


/root/dpdk-19.11/usertools/dpdk-devbind.py --bind=ena 06.00.0
复制代码


本文转载自 AWS 技术博客。


原文链接:https://amazonaws-china.com/cn/blogs/china/how-to-use-dpdk-in-aws-ec2-instances-and-aws-based-container-platforms-i/


2019-12-20 15:12815

评论

发布
暂无评论
发现更多内容

希尔伯特旅馆里,住着AI的某种真相

脑极体

AI 智能涌现

MySQL SQL脚本语句加上数据库存在判断

Andy

写给程序员的可逆计算理论辨析

canonical

开源 低代码 Docker 镜像 可逆计算 Nop平台

七年老程序员的三四月总结:三十岁、准备婚礼、三次分享

拭心

程序人生 总结思考

ps神经滤镜是干什么的,神经滤镜的功能和作用

理理

ps神经滤镜 PS2023破解 Neural Filters下载 Photoshop2023 Mac

Typora for Mac:一款极简风格Markdown写作软件

理理

Typora破解 Mac软件 Markdown文本编辑器 Typora Mac下载

智能工厂 | 联合汽车电子有限公司汽车驱动科技上海智能工厂

工赋开发者社区

经典智能合约之智能拍卖

timerring

区块链

StarUML教程:CLI(命令行界面)功能的使用

理理

StarUML教程 CLI(命令行界面) UML软件建模器 StarUML for Mac StarUML Mac破解下载

太牛了!在GitHub上“千金难求”的SpringBoot趣味实战课免费分享

Java你猿哥

Java spring Spring Boot ssm SpringBoot实战

用Python做一个翻译器 | Python小知识

AIWeker

Python 人工智能 python小知识

Git安装和配置教程:Windows/Mac/Linux三平台详细图文教程,带你一次性搞定Git环境

小万哥

git Linux 程序员 后端 C/C++

经典智能合约案例之发红包

timerring

区块链

2023-05-28:为什么Redis单线程模型效率也能那么高?

福大大架构师每日一题

redis 福大大

C语言编程—枚举

芯动大师

Parallels Desktop如何退出账号?PD18虚拟机退出账号方法

理理

Parallels Desktop下载 PD18虚拟机破解 Parallels如何退出账号

mac分屏功能怎么用?mac分屏软件推荐 magnet

理理

Magnet中文版 Magnet破解版 mac分屏功能 Magnet Mac下载 苹果窗口管理软件

GitHub星标126K的京东「微服务进阶笔记」首次开源!好评如潮

Java你猿哥

Java 架构 微服务 Spring Cloud ssm

利用springboot初始化机制三种实现策略模式的应用

Java你猿哥

Java spring Spring Boot 设计模式 ssm

文心一言 VS 讯飞星火 VS chatgpt (24)-- 算法导论4.2 6题

福大大架构师每日一题

福大大 ChatGPT 文心一言 讯飞星火

深度学习进阶篇-国内预训练模型[5]:ERINE、ERNIE 3.0、ERNIE-的设计思路、模型结构、应用场景等详解

汀丶人工智能

人工智能 自然语言处理 深度学习 文心 ERNIE Transformer

Redis和MySQL的爱恨情仇!

Java你猿哥

Java MySQL redis ssm 缓存雪崩

软件测试/测试开发丨学习笔记之用户端Web自动化测试

测试人

程序员 软件测试 自动化测试 测试开发 web自动化

MySQL 启动apollo-adminservice 报错 Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'serverconf0_.Cluster' in 'field list

Andy

QUIC 协议:特性、应用场景及其对物联网/车联网的影响

EMQ映云科技

车联网 物联网 mqtt QUIC

iOS MachineLearning 系列(20)—— 训练生成CoreML模型

珲少

MySQL Idea 启动主程序 无法识别时区

Andy

大模型全情投入,低代码也越来越清晰

引迈信息

低代码 大模型 JNPF

GPT用于复杂代码生产所需要满足的必要条件

canonical

低代码 GPT GPT-4 可逆计算

CSS小技巧使用 font-variation 让文字起飞

南城FE

CSS 设计 前端开发 动画 字体

软件测试/测试开发丨学习笔记之Web自动化测试

测试人

程序员 软件测试 自动化测试 测试开发 web自动化

如何在 AWS EC2 实例以及基于 AWS 的容器平台中使用 DPDK(二)_文化 & 方法_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章