DPDK系列之一基础环境搭建

news2024/9/17 9:03:58

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python数据清洗1

数据获取——》数据清洗——》数据转换——》数据分析 通过设置步长,有间隔的取元素通过设置步长为-1,将元素颠倒 数据清洗工具 目前在Python中, numpy和pandas是最主流的工具。 Numpy中的向量化运算使得数据处理变得高效;Pandas提供了大量…

【Java入门】Java数据类型

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:Java入门 💬个人格言:不断的翻越一座又一…

(十四)线程池

线程池线程池是一组线程的集合。线程池维护一个队列,调用者向这个队列中添加任务,而线程池中的线程则不停地从队列中取出任务执行。线程池的继承关系如下图,其中ThreadPoolExecutor和ScheduledThreadPoolExecutor是具体的实现。ThreadPoolExe…

LeetCode刷题模版:141 - 150

目录 简介141. 环形链表142. 环形链表 II143. 重排链表144. 二叉树的前序遍历145. 二叉树的后序遍历146. LRU 缓存【未实现】147. 对链表进行插入排序148. 排序链表149. 直线上最多的点数150. 逆波兰表达式求值结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方…

多轮对话(三):Spoken Language Understanding 进展和前沿

本篇博客基于哈工大发表在IJCAI上的论文:A Survey on Spoken Language Understanding - Recent Advances and New Frontiers。 论文链接 github链接 口语理解(SLU)旨在提取用户查询的语义框架,是面向任务的对话系统的核心组件。本…

excel函数技巧:两个查询函数的用法比较 上篇

EXCEL函数江湖烽烟再起,函数大擂台迎来两位重量级选手。守擂者是号称全民偶像、人见人爱车见车载的巨星级函数VLOOKUP,挑战者则是名气不大实力强劲高手的LOOKUP函数!这对与生俱来的对手,究竟会在函数擂台上擦出怎样的火花&#xf…

Nginx原理

一、master和worker二、worker当客户端发送请求,先到达master,master通知所有的worker,然后所有的worker开始竞争任务。三、一个master和多个worker有什么好处(1)可以使用nginx -s reload热部署,利用nginx进行热部署(2…

8、MariaDB11数据库安装初始化密码Navicat连接

MariaDB11安装 安装前准备 下载安装包 点我去MariaDB官网下载安装包 查看相关文档 Mariadb Server官方文档 使用zip安装 解压缩zip 将下载到的zip解压缩到想安装的位置。 生成data目录 打开cmd并进入到刚才解压后的bin目录, 执行mysql_install_db.exe程序生…

Python异步编程Future对象详解

今天继续给大家介绍Python相关知识,本文主要内容是Python异步编程Future对象详解。 一、Python Future对象简介 在上文Python Task对象详解中,我们介绍到了Task对象,而Future对象是Task对象的基类,比Task更加底层。一个Future是…

英方软件在科创板上市:总市值89亿元,胡军擎、江俊夫妇为实控人

1月19日,上海英方软件股份有限公司(下称“英方软件”,SH:688435)在上海证券交易所科创板上市。本次上市,英方软件的发行价为38.66元/股,发行2094.6737万股,募资总额约为8.10亿元,募资…

linux的工具(yum,vim)

前言 linux工具的意义Linux已经成为工作、娱乐和个人生活等多个领域的支柱,人们已经越来越离不开它。在 Linux 的帮助下,技术的变革速度超出了人们的想象,Linux 开发的速度也以指数规模增长。因此,越来越多的开发者也不断地加入开…

pycharm远程链接服务器配置

拿到gpu的节点以后开始下面的配置 1. 下载专业版pycharm,一定是专业版,community版本没有远程连接ssh的功能。 2. python编译器->添加ssh编译器->新创建服务器配置 3. 输入host名,用户名。 host名字如:vpcc-gpu032&#xf…

【自学Docker】Docker wait命令

Docker wait命令 大纲 docker wait教程 docker wait 命令可以用于阻塞一个或多个 Docker容器 直到容器停止,然后打印退出代码。 docker wait命令后面的 CONTAINER 可以是容器Id,或者是容器名。 docker wait语法 haicoder(www.haicoder.net)# docker…

基于蒙特卡洛随机潮流研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

代码审计-8 ThinkPHP框架代码审计 2

文章目录熟悉网站结构确定网站的路由1.通过分析url直接得出路由2.查看app/route.php了解参数过滤情况SQL注入举例任意文件下载与删除任意文件下载代码分析任意文件删除代码分析熟悉网站结构 首先对系统的功能点进行大致的了解,对系统的目录情况进行大致了解&#x…

9. 列表list类型详解

python3 list类型的使用 1. 基本知识 List(列表) 是 Python 中使用最频繁的数据类型。 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套&#xff…

全球化商家平台技术探索与演进

作者:马金金 阿里全球化业务平台团队 全球化业务高速发展给平台技术带来了极大的挑战。如何差异化支撑全局业务的高效迭代?如何轻量化支撑创新业务的快速建站?本文将聚焦全球化商家平台技术架构演进,为大家分享背后的技术思考。 一…

Understanding LSTM Networks

文章目录Recurrent Neural NetworksThe Problem of Long-Term DependenciesLSTM NetworksThe Core Idea Behind LSTMs.Step-by-Step LSTM Walk Through本篇文章记述了自己对“Understanding LSTM Networks”的理解 Recurrent Neural Networks Humans don’t start their thin…

springmvc统一日志打印request和response内容

在web项目中,有不少场景需要统一处理一些和实际业务基本不相关的逻辑,比如rest接口的监控、出入参日志、操作记录、统一异常处理(避免将错误堆栈等信息直接打到web端)。如果你觉得日志打印rest接口出入参非常简单,直接getParameter()就好了&a…

Redis6学习笔记【part4】Jedis-API与手机验证码功能实现

1.连接 Jedis 第一步&#xff0c;修改 redis 的配置&#xff0c;以允许外网 ip 访问 redis。 在 redis.conf 中注释掉 bind 127.0.0.1 &#xff0c;并修改 protected-mode no 。 第二步&#xff0c;导入依赖。 <dependency><groupId>redis.clients</groupId…