DPDK系列之一基础环境搭建

一、DPDK是什么

DPDK,Data Plane Development Kit,数据平面开发套装,它还有一个兄弟SPDK,专门用来做存储优化的。它主要运行于Linux,是由Intel几家公司共同开发,用于快速处理数据的一个网络开发工具套装。更详细的说明会在后面的文章中进行描述。

二、搭建环境

要想使用DPDK,需要进行一系列的基础环境的搭建,下面就逐一进行说明。
基础环境使用的Ubuntu20.04 Server版本,DPDK环境要求必须有四个核心以上,所以这里给了4*2个核心,电脑配置可以配置4个。内存尽量使用8G以上。这里只是实验环境,所以硬盘不需要太大,根据情况够用就行,此处设置了20G,如果不想在下面的安装过程中,安装各种基础的辅助软件,就把GCC(含G++)、Python等软件提前安装好,当然如果没有安装好也可以初时的需要再下载。

1、安装新网卡:在界面操作添加第二个NAT网卡(SSH和桥接的网卡两个不能同时为一个类型,其它可以都是桥接,建议SSH使用NAT,DPDK使用桥接),下一步即可。
在这里插入图片描述

2、添加后可以使用sudo ifup ens38启动NAT网卡,如果报没有ens38则在/etc/network/interfaces中按第4步中的操作增加此名称。
3、修改虚拟机xxx.vmx,用文本编辑器打开:

ethernet0.virtualDev = "vmxnet3"
ethernet0.wakeOnPcktRcv = "TRUE"

4、重启后发现网卡的名字改变即ens33->ens160,重新在/etc/network/interfaces中书写:

auto ens160
iface ens160 inet dhcp

auto ens38
iface ens38 inet dhcp

ifconfig -a  #可以看到网卡,但发现没有地址,这是没有启动

5、再使用sudo ifup 启动这两网卡,遇到了错误“couldnt read interfaces file”,是因为少写了inet。
6、nmcli c无显示,nmcli显示几个网卡均为NetworkManage
这个问题的解决可用下面的方式:

# vim /etc/NetworkManager/NetworkManager.conf
...
[ifupdown]
managed=true
...

在UBUNTU20中还要操作:

# 在 Ubuntu 20.04 LTS 中,我们需要创建该文件才能解决问题
touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf

重启 后即可,会出现:

:~$ nmcli c
NAME               UUID                                  TYPE      DEVICE
Ifupdown (ens38)   c86bbe0e-e4cc-e8ab-0757-0329f23a8eba  ethernet  ens38
Ifupdown (ens160)  262e1aac-13d6-c5d8-03ef-c79e2be14de3  ethernet  ens160

使用命令查看中断情况:

:/proc/irq# cat /proc/interrupts |grep ens
  16:          0          0          0        318          0          0      33184          0   IO-APIC   16-fasteoi   vmwgfx, snd_ens1371, ens38
  57:        691          0          0          0          0       3154         24          0   PCI-MSI 1572864-edge      ens160-rxtx-0
  58:          0          0          0          0          0          0          0         12   PCI-MSI 1572865-edge      ens160-rxtx-1
  59:          1          0          2         10          0          0         15          0   PCI-MSI 1572866-edge      ens160-rxtx-2
  60:          0          0          0          0          0          0          0          0   PCI-MSI 1572867-edge      ens160-rxtx-3
  61:          0          0          5          0          0         27          0          0   PCI-MSI 1572868-edge      ens160-rxtx-4
  62:          0          0          0          3          0          0          0          0   PCI-MSI 1572869-edge      ens160-rxtx-5
  63:          0          0          0        357          1          0         63       2037   PCI-MSI 1572870-edge      ens160-rxtx-6
  64:          0          0          0          1          0          1          0          0   PCI-MSI 1572871-edge      ens160-rxtx-7
  65:          0       

这里可以看出中断号对应的是57~64,下面会用到它们,这里先空中掠过。

7、修改大页:
这里是虚拟机 在/etc/default/grub中对应字段增加:

	default_hugepages=1G hugepagesz=2M hugepages=1024 isolcpus=0-2

执行sudo update-grub,这个可以根据实际情况完善,这里只是一个实验情况。
注意,这里没有修改网卡名字所以和修改的略有不同:

GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg noprompt net.ifnames=0 biosdevname=0 default_hugepagesz=2M hugepagesz=2M hugepages=1024 isolcpus=0-2"

对比一下不同。这里说明一下,修改几次都不成功,后来就不改了。

物理机:

default_hugepages=1G hugepagesz=1G hugepages=20 isolcpus=0-7

重启开机,isolcpus + 1大于CPU核心数开机失败

8、NGINX安装
安装有两种方式,命令安装和源码安装,这里只介绍命令安装。
a、使用命令:sudo apt install nginx(如果有问题先升级APT:sudo apt update)
查看安装成功的版本:

:~$ nginx -v
nginx version: nginx/1.18.0 (Ubuntu)

b、查看状态:

:~$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Mon 2023-01-16 12:26:10 UTC; 21s ago
       Docs: man:nginx(8)
    Process: 34997 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 35007 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)

发现没有成功。

无法启动用下面命令查看原因:
先查看运行进程 :

ps -ef | grep -i nginx | grep -v grep
root       34880       1  0 12:24 ?        00:00:00 nginx: master process nginx
www-data   34881   34880  0 12:24 ?        00:00:00 nginx: worker process
www-data   34882   34880  0 12:24 ?        00:00:00 nginx: worker process
www-data   34883   34880  0 12:24 ?        00:00:00 nginx: worker process
www-data   34884   34880  0 12:24 ?        00:00:00 nginx: worker process
www-data   34885   34880  0 12:24 ?        00:00:00 nginx: worker process
www-data   34886   34880  0 12:24 ?        00:00:00 nginx: worker process
www-data   34887   34880  0 12:24 ?        00:00:00 nginx: worker process
www-data   34888   34880  0 12:24 ?        00:00:00 nginx: worker process

解决方法:先运行:service nginx start再运行:sudo systemctl status nginx

Jan 16 12:26:08 fjf nginx[35007]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Jan 16 12:26:08 fjf nginx[35007]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
Jan 16 12:26:09 fjf nginx[35007]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Jan 16 12:26:09 fjf nginx[35007]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
Jan 16 12:26:09 fjf nginx[35007]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Jan 16 12:26:09 fjf nginx[35007]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
Jan 16 12:26:10 fjf nginx[35007]: nginx: [emerg] still could not bind()
Jan 16 12:26:10 fjf systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Jan 16 12:26:10 fjf systemd[1]: nginx.service: Failed with result 'exit-code'.
Jan 16 12:26:10 fjf systemd[1]: Failed to start A high performance web server and a reverse proxy server.

错误原因发现是80端口被占用:
使用下面三种命令来查看均可:

lsof -i:80    或
netstat -anp|grep 80

可发现是NGINX占据80,端口,使用下面命令杀死:

:~$ sudo killall -9 nginx
:~$ ps -ef | grep -i nginx | grep -v grep

:~$ ss -lnp|grep 80

现在ss命令用得比较多,掌握一下。

c、重新执行命令启动成功

:~$ service nginx start
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'nginx.service'.
Authenticating as: fpc
Password:
==== AUTHENTICATION COMPLETE ===
:~$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-01-16 12:35:11 UTC; 14s ago
       Docs: man:nginx(8)
    Process: 35295 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 35305 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 35306 (nginx)
      Tasks: 9 (limit: 9406)
     Memory: 8.8M
     CGroup: /system.slice/nginx.service
             ├─35306 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ├─35307 nginx: worker process
             ├─35308 nginx: worker process
             ├─35309 nginx: worker process
             ├─35310 nginx: worker process
             ├─35311 nginx: worker process
             ├─35312 nginx: worker process
             ├─35313 nginx: worker process
             └─35314 nginx: worker process

Jan 16 12:35:11 fjf systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 16 12:35:11 fjf systemd[1]: Started A high performance web server and a reverse proxy server.

默认的worker_processes是auto,这里设置了八个核心,所以启动了8个Worker

d、Nginx重启和退出
这个对源码安装作用较大,这里基本重启就是OS重启了。
重启:

Nginx:sudo  nginx -s reload

退出

sudo nginx -s quit

9、设置网卡中断的亲和性
查看中断情况:

cat /proc/irq/57/smp_affinity

:/proc/irq$ cat /proc/irq/57/smp_affinity
00000000,00000000,00000000,00000020

设置中断和CPU的亲和性:

sudo echo 1 > /proc/irq/57/smp_affinity
/proc/irq/57/smp_affinity: Permission denied
sudo su

echo 1 > /proc/irq/57/smp_affinity  #注意空格,否则报无效的参数

这里的麻烦是使用sudo都被拒绝,所以得使用sudo su命令转到root才能操作上面的命令,这就有一个小问题,如果再转回到非root用户环境就会有所改变,所以最好一开始就用root来操作,这样更方便。
再查看:

:/proc/irq# cat /proc/irq/57/smp_affinity
00000000,00000000,00000000,00000001
继续设置其它:

echo 2 > /proc/irq/58/smp_affinity
echo 4 > /proc/irq/59/smp_affinity
echo 8 > /proc/irq/60/smp_affinity
echo 10 > /proc/irq/61/smp_affinity
echo 20 > /proc/irq/62/smp_affinity
echo 40 > /proc/irq/63/smp_affinity
echo 80 > /proc/irq/64/smp_affinity

这个设置完成后都可以看一下,但是这种设置在重启后可能会发生一些变化,不需要再意。

10、设置NGINX的cpu亲和性
分两种情况,源码编译安装的配置文件在可执行文件的隐藏 .conf/nginx.conf;使用apt install安装的可执行文件在/usr/share/nginx中,配置文件在/etc/nginx/nginx.conf。

sudo vim nginx.conf:

#手动新增
worker_processes  8;
# worker1使用1号CPU,worker2使用2号CPU...
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

//其下为原有
events {
        worker_connections 768;
        # multi_accept on;
}

注意,如果没有这两行代码,可以手动在conf文件中新增。

11、os重启验证
重启操作系统执行命令:

:~$ ps -ef|grep nginx

发现Nginx没有启动,使用上面的命令查看:

# sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Thu 2023-01-19 01:31:16 UTC; 4min 45s ago
       Docs: man:nginx(8)
    Process: 1109 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)

Jan 19 01:31:13 fjf systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 19 01:31:15 fjf nginx[1109]: nginx: [emerg] "worker_processes" directive is duplicate in /etc/nginx/nginx.conf:7
Jan 19 01:31:16 fjf nginx[1109]: nginx: configuration file /etc/nginx/nginx.conf test failed
Jan 19 01:31:16 fjf systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Jan 19 01:31:16 fjf systemd[1]: nginx.service: Failed with result 'exit-code'.
Jan 19 01:31:16 fjf systemd[1]: Failed to start A high performance web server and a reverse proxy server.

发现在配置文件中有重复配置,打开一看,发现在配置文件开头有一个worker_processes auto,它和上面新增的worker_processes 8冲突;将其注释即可。
再重启成功。

注意:此时查看中断CPU的亲和性每次都不一样,大概率会发生变化。不用担心。
再次重启,使用上面的命令查看Nginx已经成功启动。

12、用Wrk工具验证
如果没wrk,则sudo apt install wrk:

wrk -t12 -c400 -d30s [--latency] http://192.168.2.26  #注意:网上的资料没有http://导致wrk报URL错误

可以看到CPU都在变化,不过这里有点小问题,可能是ROOT和非ROOT修改导致有些网卡重复。

:~$ tail -f /proc/interrupts |grep ens 或者直接 cat /proc/interrupts|grep ens
tail: /proc/interrupts: file truncated
  16:          0          0          0        294         58          0       7636       1303   IO-APIC   16-fasteoi   vmwgfx, snd_ens1371, ens38
  56:          0          0          0     243992          0          0         15       4557   PCI-MSI 1572864-edge      ens160-rxtx-0
  57:          0          0          0          0          0          0     209313      39228   PCI-MSI 1572865-edge      ens160-rxtx-1
  58:         10          0          0          2          0          0          0     262023   PCI-MSI 1572866-edge      ens160-rxtx-2
  59:          0          3          0          0          0     251031          0          0   PCI-MSI 1572867-edge      ens160-rxtx-3
  60:          0          0          1     152436          0          0          0          0   PCI-MSI 1572868-edge      ens160-rxtx-4
  61:          0          0          0          1          0     245996          0          0   PCI-MSI 1572869-edge      ens160-rxtx-5
  62:          0          0          0          0          3          0     257285          0   PCI-MSI 1572870-edge      ens160-rxtx-6
  63:          0          0          0      19311     212258          3          0          0   PCI-MSI 1572871-edge      ens160-rxtx-7
  64:          0          0          0          0          0          0          0          0   PCI-MSI 1572872-edge      ens160-event-8

这样,环境基本准备好了,下一步准备进行DPDK的编译。

Nginx源码安装也不复杂,网上有很多相关的教程,大家可以去参看,此处不再赘述。

三、总结

搭建环境是一个非常折磨人的事情,特别对于一些新手来说,而且在Linux由于版本众多,导致很多网上的介绍和相关的资料都绑定性很强。只一个用户的切换对于一些小白来说,可能就是一个麻烦事儿。所以搭建这类环境时,如果没有明确的限制或者说要求,都在root下操作,这对新手还是相对来说比较友好的。
总之有一个建议,使用尽量高的OS版本,会让在安装时省不少时间和脑细胞,尽量把代码更新下载的代理地址换成国内的镜像,这类文章很多,大家只要在网上一搜就会找到。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DPDK(Data Plane Development Kit)是一个用于构建高性能数据平面应用程序的开源工具集。它提供了一组优化的库和驱动程序,可以在网络和协议栈的处理过程中加速数据包的转发和处理。DPDK 最初是为 Linux 环境设计开发的,但后来也提供了一些实验性的 Windows 版本。 DPDK 在 Windows 上的支持仍然处于实验性阶段。虽然可以在 Windows 上运行 DPDK,但仍然面临一些挑战和限制。首先,由于 Windows 内核和驱动程序的限制,与 Linux 环境相比,DPDK 在 Windows 上的性能可能会有所下降。其次,Windows 版本的 DPDK 目前仅支持少数的网络设备供应商,这意味着不是所有的网络硬件都能与 Windows 版本的 DPDK 兼容。此外,Windows 版本的 DPDK 需要使用特殊的驱动程序和堆栈,可能需要进行额外的配置和调整。 尽管 Windows 版本的 DPDK 还有一些限制,但它仍然为在 Windows 环境下构建高性能数据平面应用程序提供了一些可能性。对于现有的 Windows 网络设备供应商和应用程序开发者来说,DPDK 提供了一种加速数据包处理的方法,可以提高数据平面的性能和吞吐量。 总之,DPDK 是一个用于构建高性能数据平面应用程序的工具集,目前也有一些实验性的 Windows 版本。尽管 Windows 版本的 DPDK 还存在一些挑战和限制,但它仍然为 Windows 环境下的高性能数据平面应用程序开发提供了一些可能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值