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. HTML5学习笔记(二十八):跨域

    在跨域安全性方面,有多个地方会有限制,主要是XMLHttpRequest对象的跨域限制和iFrame的跨域限制,下面我们分别来看一下. Ajax跨域(CORS) CORS是一个W3C标准,全称是&qu ...

  2. linux每日命令(33):diff命令

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...

  3. MyBean通用报表插件介绍

    特性: 1.基于MyBean插件平台.可以在任何插件中无缝调用显示. 2.其他窗体中无需引用报表控件.就可以拥有报表的设计预览打印等功能. 3.甚至可以不用带包,制作报表插件,也就是说你可以将RM的报 ...

  4. Django基础学习之Cookie 和 Sessions 应用

    在Django里面,使用Cookie和Session看起来好像是一样的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX是您想要取得的东西的 ...

  5. [C++]QString方法集

    QString s =  "hello world"; s. indexOf ( "o" )); //4 s. lastIndexOf ( "o&qu ...

  6. python虚拟环境virtualenv的安装与使用

    如果我们要同时开发多个应用程序,每个应用可能需要各自拥有一套“独立”的Python运行环境,我们可以使用virtualenv解决这个问题,它可以为一个应用创建一套“隔离”的Python运行环境. 一. ...

  7. [Android] Java Basic : preview

    基础教学:lecture, video, lecturer: Matt Stoker Java教学:http://www.runoob.com/java/java-intro.html[菜鸟教程,非常 ...

  8. BackgroundWorker学习笔记

    1 简介 BackgroundWorker 类允许您在单独的专用线程上运行操作. 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态. 如果您需要能进行响 ...

  9. android基础---->SQLite数据库的使用

    SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使 ...

  10. SQL Server2008 删除登录记录

    SQL Server Management Studio登陆窗口  清空这些多余的登陆名   主要是删除SqlStudio.bin文件   WinXP:    C:\Documents and Set ...