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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值