Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32615
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2022-11-22 23:41
个人简介

将分享技术博文作为一种快乐,提升自己帮助他人

文章分类

全部博文(17)

文章存档

2023年(9)

2022年(5)

我的朋友

分类: LINUX

2023-01-11 00:01:21

DPDK中Telemetry库介绍及使用


DPDK中有许多辅助DPDK应用问题定位的工具,如proc_info和telemetry。proc_info通常是以运行从进程的方式,来获取DPDK应用中的设备统计和私有信息以及Lib的关键信息。Telemetry库旨在为用户提供向DPDK遥测查询相关信息的能力,2018年10月引入DPDK社区,至今已历经四年的演进。Telemetry是通过客户端链接DPDK进程创建的UNIX域套接字,向DPDK进程发送待查询模块特征的消息来进行信息交互的。Telemetry相比于proc_info的优势:无需进行从进程的初始化,不依赖DPDK的库文件版本,客户端可与任何支持telemetry的DPDK应用直接进行信息交互。本文主要介绍Telemetry原理和使用,学习其设计思想。

1. Telemetry库原理

主进程在进行EAL层初始化时,默认会对telemetry库进行初始化,当然也提供了"--telemetry"和"--no-telemetry"的EAL标识来控制telemetry是否使能。其初始化入口为:rte_telemetry_init()。DPDK中的telemetry随着版本的演进,产生了两套运行接口:telemetry-v1(telemetry_legacy)和telemetry-v2。其中v1版本,是{BANNED}{BANNED}最佳佳初引入DPDK时的一个版本,DPDK现在主流推荐是使用V2版本。rte_telemetry_init()会对这两个接口进行初始化,初始化接口分别为telemetry_legacy_init()和telemetry_v2_init()。两套接口均会创建socket套接字服务端,监听客户端的连接,流程基本相同,创建服务端和等待客户端连接的流程如下:
(a) 在/var/run/dpdk/目录下创建一个telemetry或telemetry.v2名字的UNIX域SEQPACKET类型的套接字;
(b) 创建一个socket监听线程socket_listener(),accept等待客户端的连接;
(c) 有客户端连接上后,创建一个legacy_client_handler()线程,处理客户端发送的命令。


1.1 telemetry_v1实现原理

1) 接口初始化条件
telemetry-v1初始化的条件:必须有调用rte_telemetry_legacy_register注册命令回调。
2)作用
该套老接口被mertics库用来上报ethdev的xstats统计、bitratestats库的比特率和latencystats库的时延统计。metrics库的初始化依赖于环境上安装jansson库,DPDK编译时会判断环境是否安装了该库而定义RTE_HAS_JANSSON宏,从而决定了metrics库是否会使用RTE_INIT()注册metrics库中的回调命令。

3)运行接口和工具
套接字路径:/var/run/dpdk/file-prefix/telemetry

工具dpdk_project/usertools/dpdk-telemetry-client.py脚本,给出了使用telemetry_v1接口的demo示例。
telemetry_v1版本,使用两个socket套接字。{BANNED}中国{BANNED}中国第一个socket套接字是DPDK主进程创建的,作为服务端用来监听所有telemetry client的连接。第二个socket套接字由telemetry client创建,作为服务端用来监听DPDK主进程的命令处理客户端。telemetry client脚本连接DPDK进程的和通信流程如下图所示:


telemetry_v1代码中默认值已定义了一个.register_client()的钩子回调。该钩子在上图第3步telemetry client连接到/var/run/dpdk/file-prefix/telemetry时会被调用,并创建一个客服端连接到由telemetry client创建的服务端的指定套接字,同时拉起一个客户端处理程序legacy_client_handler(void *sock_id),处理telemetry client发送到命令请求。

metrics库中的回调命令接口实现原理:使用metrics库的结构和接口,先获取待查询的信息,再调用json_pack()将其打包成特定的数据格式,再调用json_dumps()将数据译码成json格式的字符串。
DPDK进程中的客户端调用metrics库的钩子后,数据以json格式字符串的形式保存在buffer中,再直接将数据发送给telemetry client中的服务端。


1.2 
telemetry_v2实现原理

1) 接口初始化条件
只要使能了telemetry就会被初始化。
2)作用
用于查询DPDK进程中的任何信息,如ethdev stats、ethdev 端口列表,mempool和ring的信息,或者应用程序中的一些信息。

3)运行接口和工具

套接字路径:/var/run/dpdk/file-prefix/telemetry.v2
工具:dpdk_project/usertools/dpdk-telemetry.py脚本
telemetry_v2版本,相比于telemetry_v1的改进点:
a)客户端只需直接连接主进程在runtime目录下创建的telemetry 
socket套接字,而无需再创建一个套接字,使用流程和方法得到极大简化(实际UNIX域SEQPACKET类型的套接字本身就可满足双向通信的使用,V1版本其中有个socket套接字有点冗余)。
b) 数据的json格式转换,是在telemetry库中实现的,使用更加简单方便。
使用模块,只需调用注册接口rte_telemetry_register_cmd注册一个回调,在回调函数中,直接调用telemetry库对外函数,设置数据类型添加数值。支持的数据类型有字符串、字典、列表。列表和字典中的数据类型可为:字典、列表、字符串、整型和无符号整型。具体定义如下图所示:
DPDK中现在主要推荐telemetry_v2版本,
为此,以下只介绍下Telemetry-v2的使用。


2. Telemetry用户指导

以下步骤显示了如何运行具有telemetry支持的应用程序,以及如何使用telemetry客户端 python 脚本查询信息。
1) 启动 testpmd 作为具有telemetry的主要应用程序

  1. ./app/dpdk-testpmd

2) 启用telemetry客户端脚本

  1. ./usertools/dpdk-telemetry.py

3) 当链接上,脚本显示如下:

  1. Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
  2. {"version": "DPDK 20.05.0-rc2", "pid": 60285, "max_output_len": 16384}
  3. -->

4) 用户现在可以输入命令以通过套接字发送,并接收响应。列出当前支持的命令(这个输出已经很老了,当前支持的命令比这多的多):

  1. --> /
  2. {"/": ["/", "/eal/app_params", "/eal/params", "/ethdev/list",
  3. "/ethdev/link_status", "/ethdev/xstats", "/help", "/info"]}

如查询获取ethdev ports列表

    1. --> /ethdev/list
    2. {"/ethdev/list": [0, 1]}
  • 获取ethdev port的扩展统计(PS: 使用“,”分隔命令和参数)。

    1. --> /ethdev/xstats,0
    2. {"/ethdev/xstats": {"rx_good_packets": 0, "tx_good_packets": 0,
    3. "rx_good_bytes": 0, "tx_good_bytes": 0, "rx_missed_errors": 0,
    4. ...
    5. "tx_priority7_xon_to_xoff_packets": 0}}
  • 获取命令的帮助文本。这将指示需要哪些参数。将命令作为参数传递:

    1. --> /help,/ethdev/xstats
    2. {"/help": {"/ethdev/xstats": "Returns the extended stats for a port.
    3. Parameters: int port_id"}}

连接到不同的DPDK进程用法

当多个 DPDK 进程实例在系统上运行时,用户自然希望能够选择正在建立连接的实例。选择实例的方法取决于各个实例的运行方式:
对于使用非默认文件前缀运行的 DPDK 进程,即使用 –file-prefix EAL 选项标志,进程的文件前缀应通过 -f 或 –file-prefix 脚本标志传递。
例如连接到 testpmd,运行如下:

  1. $ ./build/app/dpdk-testpmd -l 2,3 --file-prefix="tpmd"

可以使用telemetry脚本命令:

  1. $ ./usertools/dpdk-telemetry -f "tpmd"

要列出所有正在运行的启用telemetry的文件前缀,可以使用 -l 或 --list 标志:

  1. $ ./usertools/dpdk-telemetry -l
  • 对于使用 –in-memory EAL 标志运行多个进程但没有 –file-prefix 标志或相同的 –file-prefix 标志的情况,这些进程将共享相同的运行时目录。在这种情况下,{BANNED}中国{BANNED}中国第一个进程之后的每个进程都会在遥测套接字名称中添加一个递增的计数后缀,每个进程都会使用{BANNED}中国{BANNED}中国第一个可用的空闲套接字名称。可以使用 -i 或 –instance 标志将此后缀计数传递给遥测脚本。
  • 例如,如果以下两个应用程序在不同的终端中运行:

    1. $ ./build/app/dpdk-testpmd -l 2,3 --in-memory # will use socket "dpdk_telemetry.v2"
    2. $ ./build/app/test/dpdk-test -l 4,5 --in-memory # will use "dpdk_telemetry.v2:1"

以下遥telemetry本命令将允许连接到每个二进制文件

  1. $ ./usertools/dpdk-telemetry.py # will connect to testpmd
  2. $ ./usertools/dpdk-telemetry.py -i 1 # will connect to test binary

本节翻译自:


此外,当前22.11以后的版本,已经支持加入了print pretty功能(默认打开的,类似与gdb中的set print pretty on),使telemetry脚本回显更加直观。

阅读(1630) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~