DPDK系列之一基础环境搭建

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、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使用NATDPDK使用桥接)下一步即可。
在这里插入图片描述

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(如果有问题先升级APTsudo 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重启了。
重启

Nginxsudo  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版本会让在安装时省不少时间和脑细胞尽量把代码更新下载的代理地址换成国内的镜像,这类文章很多大家只要在网上一搜就会找到。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6