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