dpdk课程学习之练习笔记八(dpvs的了解)
只是看到这个,跟着流程做一下练习,了解这个东东是干啥的,再就是搭建环境,基于dpdk的环境,顺手也就练习dpdk的环境搭建了。
0:总结
1:知道了lvs能实现的功能,挺强大。
2:熟悉练习一下dpdk的环境搭建,设置网卡支持多队列,设置巨页,dpdk接管网卡。
3:dpvs是基于dpdk上的一个产物,了解一下,未涉及相关业务,并未深入。
1:lvs进行练习。
参考: LVS的介绍与使用-CSDN博客
1.1 首先安装nginx并启动 默认端口是80,有多个网卡,两个ip都能访问到。
sudo apt-get install nginx
netstat -anop|grep nginx
sudo systemctl restart nginx
ps afx|grep nginx
netstat -anop|grep nginx
curl 192.168.40.137:80
ifconfig
curl 192.168.40.139:80
1.2 安装lvs并进行测试
#这里简单配置 测试 具体根据实际场景
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# apt-get install ipvsadm
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# sudo modprobe ip_vsifconfig ens33:250 192.168.40.222/24 #临时设置 ip 作为虚拟ip
ifconfig
sudo ipvsadm -A -t 192.168.40.222:80 -s rr #配置虚拟ip 设置轮询
ipvsadm -L -n #查看配置
sudo ipvsadm -a -t 192.168.40.222:80 -r 192.168.40.139:80 #配置虚拟ip对应的两个真实ip
ipvsadm -L -n
sudo ipvsadm -a -t 192.168.40.222:80 -r 192.168.40.137:80
ipvsadm -L -n
ipvsadm -C #清除配置
这里配置完成后,使用curl或者直接在浏览器上访问这个虚拟ip 192.168.40.222:80 都能正常访问到nginx,实际上后台是按照设置的负载均衡的策略,依次访问后台真实的服务器。
1.3 补充
简单练习了解lvs,真实场景根据业务,虚拟ip提供对外访问的功能,以及真实ip不提供设置,以及配合keepalive实现能探测到服务的正常等,都待了解。
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.40.137 netmask 255.255.255.0 broadcast 192.168.40.255inet6 fe80::20c:29ff:fe40:9a67 prefixlen 64 scopeid 0x20<link>ether 00:0c:29:40:9a:67 txqueuelen 1000 (Ethernet)RX packets 655 bytes 396055 (396.0 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 444 bytes 41127 (41.1 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33:250: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.40.222 netmask 255.255.255.0 broadcast 192.168.40.255ether 00:0c:29:40:9a:67 txqueuelen 1000 (Ethernet)ens38: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.40.139 netmask 255.255.255.0 broadcast 192.168.40.255inet6 fe80::20c:29ff:fe40:9a7b prefixlen 64 scopeid 0x20<link>ether 00:0c:29:40:9a:7b txqueuelen 1000 (Ethernet)RX packets 34291 bytes 19297727 (19.2 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 24840 bytes 6069135 (6.0 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)RX packets 504 bytes 62922 (62.9 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 504 bytes 62922 (62.9 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#这里我有多个网卡 部署了nginx服务器,同一个,多个ip都可以正常访问到 192.168.40.137:80 192.168.40.139:80
#部署一个虚拟ip 192.168.40.222:80 ifconfig ens33:250 192.168.40.222/24 sudo ipvsadm -A -t 192.168.40.222:80 -s rr
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.40.222:80 rr-> 192.168.40.137:80 Route 1 0 2 -> 192.168.40.139:80 Route 1 0 2
2:dpvs的环境搭建和练习
2.1:虚拟机环境,新增网卡,配置多队列网卡。
dpdk要接管一个网卡,这里使用桥接新增一个网卡,设置支持多队列。
2.2.1 问题1:新增的桥接模式的网卡,要配置好ip,配置静态ip(动态dhcp一直不成功)。
设置桥接模式,然后dhcp进行获取ip,发现一直不成功,只能设置静态ip了。
这里还需要再vmware上设置 编辑—》虚拟网络编辑器中,设置桥接模式,桥接到真正连接网络的网卡上。 这里我用的wifi,填的对应网卡。
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy#参考默认网卡 nat的方式 在配置文件/etc/netplan/00-installer-config.yaml 下新增设置动态dhcp,发现一直不可用,得手动配置静态ip
#笔记本上使无线 对应信息如下 参考https://www.cnblogs.com/liulog/p/17639196.html无线局域网适配器 WLAN:连接特定的 DNS 后缀 . . . . . . . :IPv6 地址 . . . . . . . . . . . . : 240e:874:10a:698d:c33d:e2de:8d02:c4d3临时 IPv6 地址. . . . . . . . . . : 240e:874:10a:698d:dd2:b758:b5d3:4217本地链接 IPv6 地址. . . . . . . . : fe80::3c7e:3c6e:c834:4c19%7IPv4 地址 . . . . . . . . . . . . : 192.168.0.102子网掩码 . . . . . . . . . . . . : 255.255.255.0默认网关. . . . . . . . . . . . . : 192.168.0.1#这里的ens37 就是我新增的网卡适配器 设置静态ip为192.168.0.111 和主机同一网段
root@ubuntu:/etc/netplan# cat 00-installer-config.yaml
# This is the network config written by 'subiquity'
network:ethernets:ens33:dhcp4: trueens37:dhcp4: falsedhcp6: falseaddresses: [192.168.0.111/24]routes:- to: defaultvia: 192.168.0.1nameservers:addresses: [114.114.114.114, 8.8.8.8, 192.168.0.1]ens38:dhcp4: trueversion: 2renderer: networkdroot@ubuntu:/etc/netplan# sudo netplan apply
WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running.
root@ubuntu:/etc/netplan# systemctl restart systemd-networkdroot@ubuntu:/etc/netplan# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.40.137 netmask 255.255.255.0 broadcast 192.168.40.255inet6 fe80::20c:29ff:fe40:9a67 prefixlen 64 scopeid 0x20<link>ether 00:0c:29:40:9a:67 txqueuelen 1000 (Ethernet)RX packets 1254 bytes 125885 (125.8 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 1004 bytes 186983 (186.9 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.0.111 netmask 255.255.255.0 broadcast 192.168.0.255inet6 fe80::20c:29ff:fe40:9a71 prefixlen 64 scopeid 0x20<link>ether 00:0c:29:40:9a:71 txqueuelen 1000 (Ethernet)RX packets 943 bytes 65395 (65.3 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 263 bytes 56196 (56.1 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...root@ubuntu:/etc/netplan# ping -I ens37 www.baidu.com
PING www.a.shifen.com (183.2.172.185) from 192.168.0.111 ens37: 56(84) bytes of data.
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=52 time=80.8 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=2 ttl=52 time=66.1 ms#定位dhcp为啥不识别的参考日志 和手动执行查看dhcp获取ip
dmesg | grep DHCP
sudo tail -f /var/log/syslog
sudo dhclient -v ens38
2.2.2 设置网卡支持多队列
#顺手改个原始eth命名规则 修改配置文件/etc/default/grub,在配置文件中”GRUB_CMDLINE_LINUX“字段对应值新增:net.ifnames=0 biosdevname=0
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0" #这里只新增net.ifnames=0 biosdevname=0 字段,如果有其他,保留就好#修改后 sudo update-grub
#重启生效 发现确实改成eth系列 网络也正常 但是上面修改的网络配置 内部ens系列依然成功。 所以应该重新配置00-installer-config.yaml ?
#这个命名规则还是别瞎改,改了后后面无法对应关系 要么再开始的时候就改了再进行后面的适配器网络配置#打开对应虚拟机目录下文件 *******.vmx 修改如下配置
ethernet1.virtualDev = "vmxnet3"
ethernet1.wakeOnPcktRcv = "TRUE"#ens160已经支持多队列网卡了 这里适配器名称发生变化 ens160 是因为中间折腾换成eth模式,发现得一系列从头设置。 恢复后发现适配器名称变化了
root@ubuntu:/etc/netplan# cat /proc/interrupts |grep ens16: 0 0 163 0 0 3196 0 0 IO-APIC 16-fasteoi vmwgfx, snd_ens1371, ens3819: 0 0 0 0 0 0 20 264 IO-APIC 19-fasteoi ens3356: 0 0 0 0 0 7 0 6 PCI-MSI 1572864-edge ens160-rxtx-057: 0 0 0 0 0 0 0 0 PCI-MSI 1572865-edge ens160-rxtx-158: 4 0 0 0 0 0 0 0 PCI-MSI 1572866-edge ens160-rxtx-259: 0 1 0 0 0 0 0 0 PCI-MSI 1572867-edge ens160-rxtx-360: 0 1 0 4 0 0 0 0 PCI-MSI 1572868-edge ens160-rxtx-461: 0 0 0 0 0 0 0 0 PCI-MSI 1572869-edge ens160-rxtx-562: 0 0 0 0 0 1 0 0 PCI-MSI 1572870-edge ens160-rxtx-663: 0 0 0 0 0 0 1 0 PCI-MSI 1572871-edge ens160-rxtx-764: 0 0 0 0 0 0 0 0 PCI-MSI 1572872-edge ens160-event-8
2.2 dpvs源码安装,先dpdk的安装
参考github中的设置进行一步步来即可,中间遇到问题解决问题。
我遇到的问题,使用主干代码,和最新版本的代码编译都有一个报错 ,需要编译时 -Werror=format-overflow=
error: ‘%s’ directive writing up to 63 bytes into a region of size between 33 and 96 [-Werror=format-overflow=]
2.2.1 下载源码 基础dpdk的安装
#试试主干dpvs能否编译成功 果然有问题 按md文档进行就好
ubuntu@ubuntu:~/dpvs_test$ wget https://fast.dpdk.org/rel/dpdk-20.11.1.tar.xz
ubuntu@ubuntu:~/dpvs_test$ git clone https://github.com/iqiyi/dpvs.git
ubuntu@ubuntu:~/dpvs_test$ tar xf dpdk-20.11.1.tar.xz
ubuntu@ubuntu:~/dpvs_test/dpvs$ cp patch/dpdk-stable-20.11.1/* ../dpdk-stable-20.11.1/ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ patch -p1 < 0001-kni-use-netlink-event-for-multicast-driver-part.patch
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ patch -p1 < 0002-pdump-change-dpdk-pdump-tool-for-dpvs.patch
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ patch -p1 < 0003-debug-enable-dpdk-eal-memory-debug.patch
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ patch -p1 < 0004-ixgbe_flow-patch-ixgbe-fdir-rte_flow-for-dpvs.patch
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ patch -p1 < 0005-bonding-allow-slaves-from-different-numa-nodes.patch
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ patch -p1 < 0006-bonding-fix-bonding-mode-4-problems.patch ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ mkdir dpdklib
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ mkdir dpdkbuild#报错后安装
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ sudo apt install meson
#这里用绝对路径
#ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ meson -Denable_kmods=true -Dprefix=dpdklib dpdkbuild
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ meson -Denable_kmods=true -Dprefix=/home/ubuntu/dpvs_test/dpdk-stable-20.11.1/dpdklib dpdkbuild
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ ninja -C dpdkbuild
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1$ cd dpdkbuild/
ubuntu@ubuntu:~/dpvs_test/dpdk-stable-20.11.1/dpdkbuild$ sudo ninja install#编译完成后 需要设置环境变量
export PKG_CONFIG_PATH=/home/ubuntu/dpvs_test/dpdk-stable-20.11.1/dpdklib/lib/x86_64-linux-gnu/pkgconfig
2.2.2 配置巨页
root@ubuntu:/home/ubuntu/dpvs_test/dpdk-stable-20.11.1/dpdklib/lib/x86_64-linux-gnu/pkgconfig# cd /sys/devices/system/node/node0/hugepages/hugepages-2048kB/
root@ubuntu:/sys/devices/system/node/node0/hugepages/hugepages-2048kB# ls
free_hugepages nr_hugepages surplus_hugepages
root@ubuntu:/sys/devices/system/node/node0/hugepages/hugepages-2048kB# cat nr_hugepages
0
#2048 的内存 设置块数 这里设置为4096块 2M*4096 = 8G 看起来并不能完全分配
root@ubuntu:/sys/devices/system/node/node0/hugepages/hugepages-2048kB# cat nr_hugepages
0
#只有一个内存
root@ubuntu:/sys/devices/system/node/node0/hugepages/hugepages-2048kB# echo 4096 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
# 这里的数值不是4096 看起来还得设置更小 虚拟机设置的8G内存
root@ubuntu:/sys/devices/system/node/node0/hugepages/hugepages-2048kB# cat nr_hugepages
3558#挂载 设置巨页的文件系统
root@ubuntu:/sys/devices/system/node/node0/hugepages/hugepages-2048kB# mkdir /mnt/huge
root@ubuntu:/sys/devices/system/node/node0/hugepages/hugepages-2048kB# mount -t hugetlbfs nodev /mnt/huge
2.2.3 插入igb_uio模块,打开支持kni模块
#使用igb_uio 对网卡nic的操作 使用系统自带的 dpdk应该有个模块也支持
root@ubuntu:/home/ubuntu/dpvs_test/dpvs# modprobe uio_pci_generic#插入kni的模块 并打开该模块 内核提供这个功能,
root@ubuntu:/home/ubuntu/dpvs_test/dpdk-stable-20.11.1# insmod dpdkbuild/kernel/linux/kni/rte_kni.ko carrier=onroot@ubuntu:/home/ubuntu/dpvs_test/dpdk-stable-20.11.1# ./usertools/dpdk-devbind.py --statusNetwork devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens33 drv=e1000 unused=vfio-pci,uio_pci_generic *Active*
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens38 drv=e1000 unused=vfio-pci,uio_pci_generic *Active*
0000:03:00.0 'VMXNET3 Ethernet Controller 07b0' if=ens160 drv=vmxnet3 unused=vfio-pci,uio_pci_generic *Active*
2.2.3 使用dpdk接管对应的网卡
#备份必要信息
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.0.111 netmask 255.255.255.0 broadcast 192.168.0.255inet6 fe80::20c:29ff:fe40:9a71 prefixlen 64 scopeid 0x20<link>inet6 240e:bf:d100:9675:20c:29ff:fe40:9a71 prefixlen 64 scopeid 0x0<global>ether 00:0c:29:40:9a:71 txqueuelen 1000 (Ethernet)RX packets 16591 bytes 22748708 (22.7 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 4947 bytes 343441 (343.4 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0root@ubuntu:/home/ubuntu/dpvs_test/dpdk-stable-20.11.1# ifconfig ens160 down#绑定接管对应的网卡 使用上面刚才插入的uio模块
root@ubuntu:/home/ubuntu/dpvs_test/dpdk-stable-20.11.1#./usertools/dpdk-devbind.py -b uio_pci_generic 0000:03:00.0
root@ubuntu:/home/ubuntu/dpvs_test/dpdk-stable-20.11.1# ./usertools/dpdk-devbind.py --statusNetwork devices using DPDK-compatible driver
============================================
0000:03:00.0 'VMXNET3 Ethernet Controller 07b0' drv=uio_pci_generic unused=vmxnet3,vfio-pciNetwork devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens33 drv=e1000 unused=vfio-pci,uio_pci_generic *Active*
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens38 drv=e1000 unused=vfio-pci,uio_pci_generic *Active*
2.2.4 测试一下dpdk的example
#makefile 编译改为static 直接运行测试
root@ubuntu:/home/ubuntu/dpvs_test/dpdk-stable-20.11.1/examples/helloworld/build# ./helloworld-static
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: Invalid NUMA socket, default to 0
EAL: Invalid NUMA socket, default to 0
EAL: Invalid NUMA socket, default to 0
EAL: Probe PCI driver: net_vmxnet3 (15ad:7b0) device: 0000:03:00.0 (socket 0)
EAL: No legacy callbacks, legacy socket not created
hello from core 1
hello from core 2
hello from core 3
hello from core 4
hello from core 5
hello from core 6
hello from core 7
hello from core 0
2.3 dpvs的安装
发现高版本安装一直有些问题 最后使用dpvs-1.9.4.tar.gz 编译练习
#已经接管网卡了 考虑dpvs
root@ubuntu:/home/ubuntu/dpvs_test/dpdk-stable-20.11.1# cd ../dpvs/
root@ubuntu:/home/ubuntu/dpvs_test/dpvs# export PKG_CONFIG_PATH=/home/ubuntu/dpvs_test/dpdk-stable-20.11.1/dpdklib/lib/x86_64-linux-gnu/pkgconfig#报错 安装必要的库
root@ubuntu:/home/ubuntu/dpvs_test/dpvs# apt-get install pkg-config
root@ubuntu:/home/ubuntu/dpvs_test/dpvs# sudo apt-get install libnuma-devroot@ubuntu:/home/ubuntu/dpvs_test# tar -xf dpvs-1.9.4.tar.gz
root@ubuntu:/home/ubuntu/dpvs_test# cd dpvs-1.9.4#直接使用clone下来的dpvs源码 发现有问题 printf相关
#使用 1.9.4版本 发现md5接口问题,需要安装低版本的openssl
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
tar -xf openssl-1.1.1.tar.gz
cd openssl-1.1.1
./config
make
sudo make installsudo apt install autoconf
sudo apt install libpopt-dev#编译成功
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4# make
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4# make install#可以看到 已经生成需要的目标可执行文件 就是我们操作用的
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ls
dpip dpvs ipvsadm keepalived#搞定配置文件 需要修改内部配置 rx和tx 对应 queue_number的个数 以及设置对应cpu对应的队列号一一对应 cpu个数不要超了
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4# cp conf/dpvs.conf.single-nic.sample /etc/dpvs.conf#安装openssl低版本时的遗留 对应目录环境不识别
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ./dpvs
./dpvs: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ldconfig /usr/local/lib/#还是有一些报错的 是我上面设置的大页过大 以及其他就需要根据源码依次排查适配了。
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ./dpvs
current thread affinity is set to FF
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: Invalid NUMA socket, default to 0
EAL: Invalid NUMA socket, default to 0
EAL: Invalid NUMA socket, default to 0
EAL: Probe PCI driver: net_vmxnet3 (15ad:7b0) device: 0000:03:00.0 (socket 0)
...
NETIF: Ethdev port_id=0 invalid rss_hf: 0x3afbc, valid value: 0x514
NETIF: Ethdev port_id=0 invalid rx_offload: 0x3, valid value: 0x82a1d
NETIF: Ethdev port_id=0 invalid tx_offload: 0x1000c, valid value: 0x802d
NETIF: dpdk_set_mc_list: rte_eth_dev_set_mc_addr_list is not supported, enable all multicast.
...
NETIF: netif_port_start: dpdk0 update rss reta failed (cause: failed dpdk api)
2.4 dpvs的练习
个人理解,这里dpvs实现的功能,和上面lvs实现的功能差不多吧。
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ./dpvs &root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ./dpip link show
1: dpdk0: socket 0 mtu 1500 rx-queue 4 tx-queue 4UP 10000 Mbps full-duplex fixed-nego addr 00:0C:29:40:9A:71 OF_TX_TCP_CSUM OF_TX_UDP_CSUM
#运行有问题 主要关注dpvs可执行文件的逻辑 这里是虚拟机环境练习,也需要改dpvs的代码。
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ./dpip addr add 192.168.0.111/24 dev dpdk0
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ./ipvsadm -A -t 192.168.0.111:80 -s rr
root@ubuntu:/home/ubuntu/dpvs_test/dpvs-1.9.4/bin# ./ipvsadm -a -t 192.168.0.111:80 -r 192.168.40.137:80 -b
相关文章:
dpdk课程学习之练习笔记八(dpvs的了解)
只是看到这个,跟着流程做一下练习,了解这个东东是干啥的,再就是搭建环境,基于dpdk的环境,顺手也就练习dpdk的环境搭建了。 0:总结 1:知道了lvs能实现的功能,挺强大。 2࿱…...

Linux标准IO-系统调用详解
1.1 系统调用 系统调用(system call)其实是 Linux 内核提供给应用层的应用编程接口(API),是 Linux 应用层进入内核的入口。不止 Linux 系统,所有的操作系统都会向应用层提供系统调用,应用程序通…...

LeetCode004-两个有序数组的中位数-最优算法代码讲解
最有帮助的视频讲解 【LeetCode004-两个有序数组的中位数-最优算法代码讲解】 https://www.bilibili.com/video/BV1H5411c7oC/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a 时间复杂度 O ( l o g ( m i n ( m , n ) ) ) O(log(min(m,n))) O(log(min(…...

Unity携程Coroutine用法
一.携程概述 官方的解释是,携程允许你可以在多个帧中执行任务。在Unity中,携程是一个可以暂停并在后续帧中从暂停处继续执行的方法。 二.携程写法 下面示例使用携程和Update打印前5帧的时间间隔,展示了携程的基础写法 using System.Colle…...

腾讯百度阿里华为常见算法面试题TOP100(5):子串、堆
之前总结过字节跳动TOP50算法面试题: 字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题 子串 560.和为K的子数组...

「数据科学」清洗数据,真实数据集中缺失值的查看与处理
在数据科学的工作过程中,我们通过查看数据的基本要素和元数据之后,需要根据查看的结果,考虑是否需要清洗数据。缺失值的查看与处理,就是清洗数据的一部分。如果我们的数据集中,存在缺失值的话,就需要考虑如…...

彩蛋岛 销冠大模型案例
彩蛋岛 销冠大模型案例 任务: https://kkgithub.com/InternLM/Tutorial/tree/camp3/docs/EasterEgg/StreamerSales 视频 https://www.bilibili.com/video/BV1f1421b7Du/?vd_source4ffecd6d839338c9390829e56a43ca8d 项目git地址: https://kkgithu…...

大数据Flink(一百二十一):Flink CDC基本介绍
文章目录 Flink CDC基本介绍 一、什么是CDC 二、CDC的实现机制 三、传统 CDC ETL 分析 四、基于 Flink CDC 的 ETL 分析 五、什么是 Flink CDC 六、…...
SqlServer自定义类型的使用
目录 前言分类基于标量类型新建查询语句 用户定义的表类型新建查询语句 基于 CLR新建查询语句 前言 最近接触了SqlServer的自定义类型–TYPE,在此记录一下所得 分类 在 SQL Server 中,用户定义的类型(User-Defined Types, UDT)…...
LeetCode 滑动窗口 滑动子数组的美丽值
滑动子数组的美丽值 给你一个长度为 n 的整数数组 nums ,请你求出每个长度为 k 的子数组的 美丽值 。 一个子数组的 美丽值 定义为:如果子数组中第 x 小整数 是 负数 ,那么美丽值为第 x 小的数,否则美丽值为 0 。 请你返回一个包含…...

【JavaEE初阶】多线程(4)
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 线程安全的 第四个原因 代码举例: 分析原因 解决方法 方法1 方法2 wait(等待)和notify(通知) wait和sleep区别 线程安全的 第四个原因 内存可见性,引起的线程安全问…...

初识 C++ ( 1 )
引言:大家都说c是c的升级语言。我不懂这句话的含义后来看过解释才懂。 一、面向过程语言和面向对象语言 我们都知道C语言是面向过程语言,而C是面向对象语言,说C和C的区别,也就是在比较面向过程和面向对象的区别。 1.面向过程和面向…...

Python数据分析 Pandas库-初步认识
Python数据分析 Pandas库-初步认识 认识Pandas pandas是一个非常实用的Python工具,我们可以把它想象成一个超级强大的表格处理工具,它比Excel更智能,操作更为简单。pands可以从各种文件格式(CSV、JSON、SQL、Excel࿰…...

Flutter问题记录 - 适配Xcode 16和iOS 18
文章目录 前言开发环境问题及解决方案1. Upload Symbols Failed2. type UIApplication does not conform to protocol Launcher3. method does not override any method from its superclass 最后 前言 为了新的镜像功能升级了macOS 15和iOS 18,Xcode也不可避免的需…...

VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025
VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025 VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7.0U3 标准版集成 Intel 网卡、Realtek USB 网卡 和 NVMe 驱动 请访问原文链…...
大数相乘,大数相加
大数相乘: #include <iostream> #include <vector> #include <string>std::vector<int> multiply(const std::vector<int>& num1, const std::vector<int>& num2) {int n1 num1.size();int n2 num2.size();std::ve…...

Spring Boot配置文件敏感信息加密
一,背景 Spring Boot应用中的数据库、Redis、Nacos、MQ等的用户名、连接地址、密码在配置文件中一般都是明文存储,如果系统被系统攻破或者配置文件所在的目录读权限被破解,又或者是动态配置文件被窃取,内部人员或者黑客很容易通过…...
Java操作数栈分析
Java 的操作数栈(Operand Stack)是 JVM 的运行时数据区域之一,位于每个线程的栈帧中。操作数栈用于临时存储操作的中间结果和数据(操作数),在方法执行时,JVM 的字节码指令会对操作数栈进行操作。…...

C#|.net core 基础 - 值传递 vs 引用传递
不知道你在开发过程中有没有遇到过这样的困惑:这个变量怎么值被改?这个值怎么没变? 今天就来和大家分享可能导致这个问题的根本原因值传递 vs 引用传递。 在此之前我们先回顾两组基本概念: 值类型** vs 引用类型** **值类型&a…...

axure的下载,激活,汉化全过程,多图
1.前言 下载地址:https://pan.baidu.com/s/12xo1mJer2hmBK7QrYM5v-Q?pwd0107#list/path%2Fcsdn%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6 源文章:https://blog.csdn.net/iwanttostudyc/article/details/123773796?ops_request_misc%257B%2522request%25…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...