[ovs][dpdk] ovs-dpdk, dpdk port 大量丢包

时间:2022-05-14 07:32:44

gdb了ovs的代码,发现是 dpdk的imiss计数在不断的丢包。

看了ovs-openvswitchd的日志,重启时发现如下行:

 --21T11::.427Z||timeval|WARN|Unreasonably long 22418ms poll interval (474ms user, 21612ms system)
--21T11::.427Z||timeval|WARN|faults: minor, major
--21T11::.427Z||timeval|WARN|disk: reads, writes
--21T11::.427Z||timeval|WARN|context switches: voluntary, involuntary

开启debug

[root@vrouter1 ~]# ovs-appctl vlog/set file:dbg

重装新版dpdk

[root@vrouter1 ovs-dpdk]# ls
dpdk-17.11..tar.xz dpdk-stable-17.11. openvswitch-2.9. openvswitch-2.9..tar.gz

1. 编译dpdk

[root@vrouter1 dpdk-stable-17.11.]# make config T=$RTE_TARGET O=$RTE_TARGET
Configuration done using x86_64-native-linuxapp-gcc
[root@vrouter1 dpdk-stable-17.11.]# cd x86_64-native-linuxapp-gcc/
[root@vrouter1 x86_64-native-linuxapp-gcc]# make

2. 编译ovs

[root@vrouter1 openvswitch-2.9.]# ./boot.sh
[root@vrouter1 openvswitch-2.9.]# ./configure --with-dpdk=$RTE_SDK/$RTE_TARGET
[root@vrouter1 openvswitch-2.9.]# make
[root@vrouter1 openvswitch-2.9.]# make install

3. 运行

[root@vrouter1 ovs-dpdk]# cat ovs.sh
export PATH=$PATH:/usr/local/share/openvswitch/scripts
export DB_SOCK=/usr/local/var/run/openvswitch/db.sock ovs-ctl --no-ovs-vswitchd start
#ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
#ovs-ctl --no-ovsdb-server --db-sock="$DB_SOCK" start
ovs-ctl --no-ovsdb-server start
[root@vrouter1 ovs-dpdk]#

4. 配置

[root@vrouter1 Datapath]# dpdk-devbind -b vfio-pci ::00.0
[root@vrouter1 ovs-dpdk]# ovs-vsctl add-br br-phy -- set bridge br-phy datapath_type=netdev
[root@vrouter1 ovs-dpdk]# ovs-vsctl add-port br-phy dpdk-p0 -- set Interface dpdk-p0 type=dpdk options:dpdk-devargs=::00.0
[root@vrouter1 ovs-dpdk]# ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
[root@vrouter1 ovs-dpdk]# ovs-vsctl add-port br0 vxlan0 -- set Interface vxlan0 type=vxlan options:remote_ip=10.0.0.163 options:local_ip=10.0.0.161 options:in_key=flow options:out_key=flow
 #>ovs-appctl ovs/route/add 10.0.0.163/ br-phy
[root@vrouter1 ~]# ip a add 10.0.0.161/ dev br-phy

5. 绑定dpdk core

[root@vrouter1 ~]# ovs-vsctl set Interface dpdk-p0 options:n_rxq=
[root@vrouter1 ~]# ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x154

6. 不丢包了。

7. vhost user client

7.1 启动vhost iommu

[root@vrouter1 ~]# ovs-vsctl set Open_vSwitch . other_config:vhost-iommu-support=true

8 添加vhostuserclient网卡

[root@vrouter1 ~]# ovs-vsctl add-port br0 vhost0 -- set Interface vhost0 type=dpdkvhostuserclient options:vhost-server-path=/tmp/nlb_vm0.sock
[root@vrouter1 ~]# ovs-vsctl add-port br0 vhost1 -- set Interface vhost1 type=dpdkvhostuserclient options:vhost-server-path=/tmp/nlb_vm1.sock

9 加流表

[root@vrouter1 ~]# ovs-appctl dpif/show
netdev@ovs-netdev: hit: missed:
br-phy:
br-phy /: (tap)
dpdk-p0 /: (dpdk: configured_rx_queues=, configured_rxq_descriptors=, configured_tx_queues=, configured_txq_descriptors=, lsc_interrupt_mode=false, mtu=, requested_rx_queues=, requested_rxq_descriptors=, requested_tx_queues=, requested_txq_descriptors=, rx_csum_offload=true)
br0:
br0 /: (tap)
vhost0 /: (dpdkvhostuserclient: configured_rx_queues=, configured_tx_queues=, mtu=, requested_rx_queues=, requested_tx_queues=)
vhost1 /: (dpdkvhostuserclient: configured_rx_queues=, configured_tx_queues=, mtu=, requested_rx_queues=, requested_tx_queues=)
vxlan0 /: (vxlan: key=flow, local_ip=10.0.0.161, remote_ip=10.0.0.163)
[root@vrouter1 ~]# ovs-ofctl add-flow br0 "cookie=0x1111,table=0, priority=100, tun_id=200,dl_dst=00:00:00:11:22:41,nw_dst=192.168.77.161,actions=move:NXM_NX_TUN_ID[0..23]->NXM_NX_REG0[0..23],resubmit(,1)"
[root@vrouter1 ~]# ovs-ofctl add-flow br0 "cookie=0x1111,table=0, priority=100, tun_id=200,dl_dst=00:00:00:11:22:41,nw_dst=192.168.77.161,actions=move:NXM_NX_TUN_ID[0..23]->NXM_NX_REG0[0..23],resubmit(,1)"

10, 查看队列与core的mapping关系

[root@vrouter1 ~]# ovs-appctl dpif-netdev/pmd-rxq-show
pmd thread numa_id core_id :
isolated : false
port: dpdk-p0 queue-id: pmd usage: %
port: vhost1 queue-id: pmd usage: %
port: vhost1 queue-id: pmd usage: %
pmd thread numa_id core_id :
isolated : false
port: dpdk-p0 queue-id: pmd usage: %
port: vhost1 queue-id: pmd usage: %
pmd thread numa_id core_id :
isolated : false
port: dpdk-p0 queue-id: pmd usage: %
port: vhost0 queue-id: pmd usage: %
pmd thread numa_id core_id :
isolated : false
port: vhost0 queue-id: pmd usage: %
port: vhost0 queue-id: pmd usage: %
pmd thread numa_id core_id :
isolated : false
port: dpdk-p0 queue-id: pmd usage: %
port: vhost1 queue-id: pmd usage: %
port: vhost1 queue-id: pmd usage: %
pmd thread numa_id core_id :
isolated : false
port: vhost0 queue-id: pmd usage: %
port: vhost0 queue-id: pmd usage: %

总结:

丢包只要是丢在了内核,因为top的时候看绑定core的cpu占用,可以看见大约80%的占用是sys,20%是user

正常的情况是包都在dpdk用户态走,所有应该100%是user。

理解了路由,流表,vxlan的原理之后,可以逐个梳理,保证包不会被流转进内核,便可以消除丢包。

总之,原因就是由于流表路由的设置问题使数据包被转发入了内核。

[ovs][dpdk] ovs-dpdk, dpdk port 大量丢包的更多相关文章

  1. Setting DPDK+OVS+QEMU on CentOS

    Environment Build Step: these packages are needed for building dpdk+ovs: yum install -y make gcc gli ...

  2. Netty_UDP丢包解决

    程序背景 程序是Java编写,基于Netty框架写的客户端及服务端. 现象 客户端大数据量持续发UDP数据,作为UDP服务器出现了部分数据频繁丢失触发程序自身重传逻辑. 通过GC日志对比发现丢包的时间 ...

  3. 浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)

    UDP数据包长度 UDP数据包的理论长度 udp数据包的理论长度是多少,合适的udp数据包应该是多少呢?从TCP-IP详解卷一第11章的udp数据包的包头可以看出,udp的最大包长度是2^16-1的个 ...

  4. Linux UDP严重丢包问题的解决

    测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%.同等情形下Windows上测试,仅丢几条数据.形势严峻,必须解决.考虑可能是因为协议栈B ...

  5. 用ethtool 命令解决Linux 网卡丢包【转】

    转自:https://blog.csdn.net/chengxuyuanyonghu/article/details/73739516 生产中有一台Linux设备并发比较大,droped包比较多,尤其 ...

  6. ping 丢包或不通时链路测试说明【转】

    转自:https://help.aliyun.com/knowledge_detail/40573.html?spm=5176.2020520165.121.d157.4fe170291Qdp4l#W ...

  7. 一个RTSP/RTP over TCP 的丢包引起的问题

    背景知识:可以查看https://www.cnblogs.com/lidabo/p/4483497.html RTSP/RTP over TCP TCP承载RTSP/RTP   When you us ...

  8. FortiGate防火墙500D下PC至外网丢包

    1.现状: 如图,防火墙堆叠,500D共4个出口方向,联通.电信.FQ.运维专线 2.现象: 到网关和防火墙上.下联口不丢包,到网联通和运维专线方向丢包4%左右,电信和FQ方向不丢包 3.分析 采用从 ...

  9. 针对UDP丢包问题,进行系统层面和程序层面调优

    转自:https://blog.csdn.net/xingzheouc/article/details/49946191 1. UDP概念 用户数据报协议(英语:User Datagram Proto ...

随机推荐

  1. raspberrypi(树莓派)上安装mono和jexus,运行asp.net程序

    参考网址: http://www.linuxdot.net/ http://www.cnblogs.com/mayswind/p/3279380.html http://www.raspberrypi ...

  2. iOS - 静态库的创建与使用

    在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ...

  3. Java EE之数据库连接与插入

    在这之前应该先: **保证项目中导入了mysql-connector-java-5.1.23-bin.jar **服务器上的数据库24小时连接成功: 1.在源包下新建一个普通的Java文件,取名为My ...

  4. 关于DYNPRO程序的系统迁移与版本不匹配问题之一

    前段时间公司做的一个项目,这两天在将项目程序导入公司,出问题了,搞了半天才发现是系统版本问题,但是还是不知道怎么解决,纠结ING... DYNRPO程序在创建(或是首次运行)的时候会自动生成一个DYN ...

  5. 纯Shading Language绘制HTML5时钟

    今天是2014年的最后一天,这个时刻总会让人想起时钟,再过几个小时地球人都要再老了一岁,于是搞个HTML5版的时钟就是我们今天要完成的任务,实现HTML5的时钟绘制一般会采用三种方式,第一种采用CSS ...

  6. iOS闹钟实现

    UILocalNotification *notification=[[UILocalNotification alloc] init];         if (notification!=nil) ...

  7. 让input框只能输入数字

    var oInput = document.querySelector("input");oInput.onkeyup = function () { var value = th ...

  8. Apache服务器常规操作

    导读 Apache是世界上排名第一的Web服务器,50%以上的Web服务器都在使用Apache,它几乎可以在所有计算机平台上运行.下面就由我给大家说说Apache服务器的一些常规操作. Apache服 ...

  9. oracle中的自动增长

    create table test( id int not null primary key, name varchar2(20), sex int) ; create sequence t -&gt ...

  10. Excel插件类库的设计思路

    一.插件功能:提供多种读取Excel的方式,如NPOI.Com.Aspose,调用接口一致,包括Excel文件路径,sheet名称.读取是否包含列头(即Excel第一行是否为列头行) 二.实现思路 2 ...