前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊一聊VPP常用的定位手段(1)

聊一聊VPP常用的定位手段(1)

作者头像
dpdk-vpp源码解读
发布2023-01-04 12:32:36
2.8K0
发布2023-01-04 12:32:36
举报
文章被收录于专栏:DPDK VPP源码分析

经常有人在公众号留言说介绍一下vpp常用的抓包或定位的手段,本篇基于vpp21.10版本一起来学习常用的定位手段。

1、trace命令

此命令行推荐度十分,用来详细跟踪报文处理的node节点及记录node节点流程处理中一些关键信息。但是需要注意有些node节点没有增加trace记录不会在trace中体现。可以通过show runtime来查询报文处理node节点。基本用法如下:

代码语言:javascript
复制
clear trace 
trace add dpdk-input 10
show trace 

并所有的节点都支持trace的。比如下面BondEthernet2-output就会提示当前node不支持。在vpp官方文档有列出哪些节点支持trace,具体链接如下:

https://fd.io/docs/vpp/master/gettingstarted/progressivevpp/traces.html

代码语言:javascript
复制
learning_vpp1# trace add BondEthernet2-output 10
trace add: node 'BondEthernet2-output' doesn't support per-node tracing. There may be another way to initiate trace on this node.

我们可以在代码中搜索一下下面的宏定义,有node节点flags置位,就是支持的。

代码语言:javascript
复制
#define VLIB_NODE_FLAG_TRACE_SUPPORTED (1 << 8)

trace目前支持基于流分类classify来查询报文,具体可以查看代码中 src\vnet\classify\vnet_classify.c,函数classify_filter_command_fn的注释,下面就举例说明一下:

代码语言:javascript
复制
#1、配置classify fliter
classify filter trace mask l3 ip4 src dst match l3 ip4 src 200.1.1.1 dst 200.1.2.2
#可以通过命令行来查询设置结果
learning_vpp1# show classify filter  
Filter Used By                 Table(s)
--------------                 --------
packet tracer:                 first table 1
learning_vpp1# show classify tables index 1 verbose
  TableIdx  Sessions   NextTbl  NextNode
         1         1         0        -1
  Heap: base 0x7fffa8799000, size 128k, locked, unmap-on-destroy, name 'classify'
          page stats: page-size 4K, total 32, mapped 2, not-mapped 0, unknown 30
            numa 0: 2 pages, 8k bytes
          total: 127.95K, used: 1.38K, free: 126.58K, trimmable: 126.50K
  nbuckets 8, skip 1 match 2 flag 0 offset 0
  mask 00000000000000000000ffffffffffffffff0000000000000000000000000000
  linear-search buckets 0

[1]: heap offset 1280, elts 2, normal
    0: [1280]: next_index 0 advance 0 opaque 0 action 0 metadata 0
        k: 00000000000000000000c8010101c80102020000000000000000000000000000
        hits 0, last_heard 0.00
    1 active elements
    1 free lists
    0 linear-search buckets
#2、设置trace转包
trace add dpdk-input 10 filter verbose
#3、show trace查询显示 这里就不贴显示结果、
show trace

另外trace支持基于node节点来抓包,设置比较简单,这里不过多介绍了,具体配置如下:

代码语言:javascript
复制
#1、设置需要查询node节点 trace filter none | [include|exclude] NODE COUNT
#具体参数信息none:取消,include:只显示包含指定node节点,exclude 显示除指定节点之外
trace filter include ip4-icmp-echo-request 10
#2、设置trace起始node及数量
trace add dpdk-input 10
3、show trace

2、pacp抓包

pcap抓包支持2种模式: 一种是pcap dispatch trace:用来抓取单个数据包转发node图,可以显示vlib_buff_t结构体数据及trace node图数据,并且支持支持vpp程序异常时存储pacp报文。 另外一种就是pacp trace 用来转发rx(接收)、tx(发送)、drop(丢弃)的报文,并且支持基于classify进行过滤抓包。下面就分别来学习一下:

1、pcap dispatch trace

目前vpp dispatch trace 抓取报文解析器已经集成到wireshark主线版本中,可以直接使用wireshark查看。下面来介绍一下。命令行参数如下: max:设置抓取报文的总数量。 file :指定存储报文的文件名称。 buffer-trace :测试情况看应该是自动开启trace功能并设置trace 数量,不需要再执行trace add xxx num了。我们可以通过show trace来查询。这个应该和trace add的一样,同时在pacp报文中也会显示trace. post-mortem:中文意思是事后剖析,大概的用法应该是设置pcap dispatch trace xxx post-mortem后,vpp异常时,首先把已经抓的包存储下来。这个功能还真是不错。没有模拟试验,感兴趣的可以尝试一下。基于这个功能应该可以开发很多有用的定位手段,非常赞!值得详细研究一下。

代码语言:javascript
复制
pcap dispatch trace [on|off] [max <nn>] [file <name>] [status]
              [buffer-trace <input-node-name> <nn>][post-mortem]

下面参考vpp官方介绍,来动手试验一下。

代码语言:javascript
复制
learning_vpp1# clear trace                                                                    
learning_vpp1# pcap dispatch trace on max 10 file vppcapture.pcap buffer-trace dpdk-input 2   
learning_vpp1# pcap dispatch trace status#获取pacp dispatch状态                                                  
pcap dispatch capture enabled: 10 of 10 pkts...#已经抓取10个报文
capture to file /tmp/vppcapture.pcap  #报文存储路径。
Buffer trace of 100 pkts from dpdk-input enabled...
#buffer trace显示100,这里有点问题,并不是上面手动设置的2,而是代码默认是100,这里没有设置
learning_vpp1# pcap dispatch trace off  #关闭pcap dispatch trace 
Write 10 packets to /tmp/vppcapture.pcap, and stop capture...
learning_vpp1# show trace #查询只抓了2个报文。这里不再显示。
Packet 1

问题: 1、单独执行pcap dispatch trace on max 10000 file vppcapture.pcap后,无法抓取报文。个人感觉是个bug。 2、执行pcap dispatch trace on max 10000 file vppcapture buffer-trace ip4-input 1000后,可以正常抓取报文,但是pcap文件中并未显示trace信息。ip4-input节点本身是不支持per-node tracing的。 3、执行pcap dispatch trace on max 10000 file vppcapture buffer-trace dpdk-input 1000。pcap包中可以显示trace信息,show trace中也可以正常显示。

2、pcap trace命令

pcap trace 命令行是经常使用的,主要说一下参数: max-bytes-per-pkt:指定抓取报文的长度,要求设置数值范围大于等于32且小于等于9000。当实际报文长度大于设置值时,报文存储长度按照设置长度存储;当报文小于设置长度数值时,按照报文实际长度存储。 filter:配合classify filter使用,可以进行报文过滤抓包。 preallocate-data:预分配报文存储缓存区。按照pcap设置抓包数量大小分配一次性分配好报文缓存区。大概作用就是提示性能吧。 free-data:删除数据缓存区。默认pcap报文缓存区设置后,一直存在。需要设置free-data来释放数据缓存区内存。

代码语言:javascript
复制
pcap trace [rx] [tx] [drop] [off] [max <nn>] [intfc <interface>|any]
           [file <name>] [status] [max-bytes-per-pkt <nnnn>][filter]
           [preallocate-data][free-data]

下面具体pcap trace filter抓包设置流程:

代码语言:javascript
复制
#1、设置抓取指定sip+dip报文
classify filter pcap mask l3 ip4 src dst match l3 ip4 src 200.1.1.2 dst 200.1.2.2
#查询设置信息。
learning_vpp1# show classify filter 
Filter Used By                 Table(s)
--------------                 --------
packet tracer:                 first table none
pcap rx/tx/drop:               first table 0 #clasifiy id
#查询设置内容。
learning_vpp1# show classify tables index 0 verbose                                             
  TableIdx  Sessions   NextTbl  NextNode
         0         2        -1        -1
  Heap: base 0x7fffa87fb000, size 128k, locked, unmap-on-destroy, name 'classify'
          page stats: page-size 4K, total 32, mapped 2, not-mapped 0, unknown 30
            numa 0: 2 pages, 8k bytes
          total: 127.95K, used: 1.59K, free: 126.36K, trimmable: 126.28K
  nbuckets 8, skip 1 match 2 flag 0 offset 0
  mask 00000000000000000000ffffffffffffffff0000000000000000000000000000
  linear-search buckets 0

[1]: heap offset 1280, elts 2, normal
    0: [1280]: next_index 0 advance 0 opaque 0 action 0 metadata 0
        k: 00000000000000000000c8010101c80102020000000000000000000000000000
        hits 0, last_heard 0.00

[2]: heap offset 1536, elts 2, normal
    0: [1536]: next_index 0 advance 0 opaque 0 action 0 metadata 0
        k: 00000000000000000000c8010102c80102020000000000000000000000000000
        hits 4, last_heard 0.00

    2 active elements
    1 free lists
    0 linear-search buckets


#2、抓取rx报文。
pcap trace rx max 100 file 1.pcap filter
#3、取消classify filter pcap设置。
classify filter pcap  del

3、span镜像

上家单位中参考过vpp最新代码及思科和华为镜像文档实现过接口镜像和基于classify的流镜像功能。在现网运行能定位丢包问题很有帮助。vpp镜像功能可以参考前面的文章。learning vpp:span

流镜像功能实现可以参考vpp mpacp插件来实现高性能的镜像抓包功能。可以参考:vppinfra----mpcap介绍

4、VLIB_BUFFER_TRACE_TRAJECTORY

buffer trace在vppdebug版本中才能使用,用于记录报文转发node节点图,在定位异常报文导致vpp挂死、vpp buffer泄漏问题很有帮助。具体可以参考前面的文章:vpp buffer 泄露问题定位思路

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、trace命令
  • 2、pacp抓包
    • 1、pcap dispatch trace
      • 2、pcap trace命令
      • 3、span镜像
      • 4、VLIB_BUFFER_TRACE_TRAJECTORY
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档