【DPDK】Trace Library

概述

跟踪是一种用于了解运行中的软件系统中发生了什么的技术。用于跟踪的软件被称为跟踪器,在概念上类似于磁带记录器。记录时,放置在软件源代码中的特定检测点会生成保存在巨大磁带上的事件:跟踪文件。稍后可以在跟踪查看器中打开跟踪文件,以使用时间戳和多核视图可视化和分析跟踪事件。这样的机制将有助于解决一系列问题,如多核同步问题、延迟测量、找出分析后的信息(如CPU空闲时间)等这些信息将极具挑战性。
跟踪通常被比作日志记录。然而,跟踪器和记录器是两种不同的工具,用于两种不同目的。跟踪器被设计用于记录比日志消息更频繁发生的低级别事件,通常在每秒数千次的范围内,执行开销非常小。日志记录更适合于对不太频繁的事件进行非常高级的分析:用户访问、异常情况(例如错误和警告)、数据库事务、即时消息通信等等。简单地说,日志记录是可以满足跟踪的众多用例之一。

DPDK跟踪库功能

一个在控制和快速路径API中添加跟踪点的框架,对性能的影响最小。典型的跟踪开销约为20个cycle,指令开销为1个cycle。
在运行时启用和禁用跟踪点。
在任何时间点将跟踪缓冲区保存到文件系统。
支持覆盖和放弃跟踪模式操作。
基于字符串的跟踪点对象查找。
基于正则表达式和/或globbing启用和禁用一组跟踪点。
以通用跟踪格式(CTF)生成跟踪。CTF是一种开源跟踪格式,与LTTng兼容。有关详细信息,请参阅通用跟踪格式。

如何添加跟踪点?

创建跟踪点头文件

#include <rte_trace_point.h>

RTE_TRACE_POINT(
       app_trace_string,
       RTE_TRACE_POINT_ARGS(const char *str),
       rte_trace_point_emit_string(str);
)

面的宏创建apptrackestring跟踪点。用户可以为跟踪点选择任何名称。但是,在DPDK库中添加跟踪点时,必须遵循rte_<library_name>trace[_]命名约定。示例为rte_eal_trace_generic_str、rte_mempool_trace_create。
RTE_TRACE_POINT宏从上述定义扩展为以下函数模板:

static __rte_always_inline void
app_trace_string(const char *str)
{
        /* Trace subsystem hooks */
        ...
        rte_trace_point_emit_string(str);
}

此跟踪点的使用者可以调用app_trace_string(const char*str)将跟踪事件发送到跟踪缓冲区。

注册跟踪点

#include <rte_trace_point_register.h>

#include <my_tracepoint.h>

RTE_TRACE_POINT_REGISTER(app_trace_string, app.trace.string)

上面的代码片段注册了app_trace_string跟踪点到跟踪库。这里,my_traceport.h是用户在创建跟踪点头文件的第一步中创建的头文件。RTE_TRACE_POINT_REGISTER的第二个参数是跟踪点的名称。此字符串将用于跟踪点查找或正则表达式和/或基于glob的跟踪点操作。不要求tracepoint函数及其名称相似。但是,为了更好地命名约定,建议使用类似的名称。
备注:在包含rte_trace_point.h标头之前,必须包含rte_trace_point_register.h标头。
RTE_TRACE_POINT_REGISTER定义RTE_TRACE_POINT_t跟踪点对象的占位符。对于通用跟踪点或公共头文件中使用的跟踪点,用户必须在库.map文件中导出一个__<trace_function_name>符号,以便在共享构建中在库外使用此跟踪点。例如,__app_trace_string将是上面示例中导出的符号。

快速路径跟踪点

为了避免快速路径代码中的性能影响,库引入了RTE_TRACE_POINT_FP。在快速路径代码中添加跟踪点时,用户必须使用RTE_TRACE_POINT_FP而不是RTE_RACE_POINT。
RTE_TRACE_POINT_FP在默认情况下编译出来,并且可以使用用于介子构建的enable_TRACE_FP选项来启用它。

事件记录模式
事件记录模式是跟踪缓冲区的一个属性。跟踪库有以下模式:
覆盖
当跟踪缓冲区已满时,新的跟踪事件会覆盖跟踪缓冲区中现有的捕获事件。
丢弃
当跟踪缓冲区已满时,将丢弃新的跟踪事件。

模式可以在应用程序启动时使用EAL命令行参数–trace-mode进行配置,也可以在运行时使用rte_trace_mode_set()API进行配置。

跟踪文件位置

在调用rte_trace_save()或rte_eal_cleanup()时,库将跟踪缓冲区保存到文件系统。默认情况下,跟踪文件存储在$HOME/dpdk-traces/rte-yyyy-mm-dd-[AP]M-hh-mm-ss/中。它可以被–trace dir=EAL命令行选项覆盖。有关更多信息,请参阅跟踪EAL命令行选项的EAL参数。

查看和分析记录的事件

一旦跟踪目录可用,用户就可以查看/检查记录的事件。您可以使用许多工具来读取DPDK跟踪:
babeltrace是一个命令行实用程序,用于转换跟踪格式;它支持DPDK跟踪库生成的格式CTF,以及可以被grep’ed的基本文本输出。babeltrace命令是开源babeltrace项目的一部分。Trace Compass是一个图形用户界面,用于查看和分析任何类型的日志或跟踪,包括DPDK跟踪。

使用babeltrace命令行工具

列出跟踪的所有记录事件的最简单方法是将其路径传递到babeltrace,无需任何选项:babeltrace递归地找到给定路径中的所有轨迹,并打印它们的所有事件,按时间顺序合并它们。

babeltrace </path-to-trace-events/rte-yyyy-mm-dd-[AP]M-hh-mm-ss/>

您可以将babeltrace的输出通过管道传输到grep(1)这样的工具中进行进一步的过滤。下面的示例仅对ethdev的事件进行grep:

babeltrace /tmp/my-dpdk-trace | grep ethdev

您可以将babeltrace的输出通过管道传输到类似wc(1)的工具中,以计数记录的事件。以下示例统计ethdev事件的数量:

babeltrace /tmp/my-dpdk-trace | grep ethdev | wc --lines

使用tracecompass GUI工具

Tracecompass是另一个查看/分析DPDK跟踪的工具,它提供了事件的图形视图。与babeltrace一样,tracecompass也提供了一个搜索特定事件的界面。要使用tracecompass,至少需要以下步骤:
将tracecompass安装到本地主机。变体可用于Linux、Windows和OS-X。
启动tracecompass,它将打开一个带有跟踪管理界面的图形窗口。
使用“文件”->“打开跟踪”选项打开跟踪,然后选择要查看/分析的元数据文件。
有关更多详细信息,请参阅Trace Compass。

快速启动

本节将逐步介绍生成跟踪和查看跟踪的详细信息。
启动dpdk测试:

echo "quit" | ./build/app/test/dpdk-test --no-huge --trace=.*

使用babeltrace查看器查看轨迹:

babeltrace $HOME/dpdk-traces/rte-yyyy-mm-dd-[AP]M-hh-mm-ss/

实施细节

由于DPDK跟踪库旨在生成使用公共跟踪格式(CTF)的跟踪。CTF规范由以下创建跟踪的单元组成。
数据包的流序列。
数据包标头和一个或多个事件。
事件标头和有效负载。
有关详细信息,请参阅通用跟踪格式。

实施细节大致分为以下几个方面:

跟踪元数据创建

根据CTF规范,CTF跟踪的流之一是强制性的:元数据流。它包含了您所期望的内容:关于跟踪本身的数据。元数据流包含所有其他流的二进制布局的文本描述。此描述是使用跟踪流描述语言(TSDL)编写的,TSDL是一种仅存在于CTF领域的声明性语言。元数据流的目的是让CTF读者知道如何在不指定任何固定布局的情况下解析跟踪的二进制事件流。事实上,唯一预先知道的流布局是元数据流的布局。内部trace_metadata_create()函数生成元数据。

跟踪内存

跟踪内存将通过内部函数__rte_trace_mem_per_thread_alloc()进行分配。跟踪内存将按线程分配,以启用无锁跟踪发射功能。对于非lcore线程,跟踪内存是在第一次跟踪发射时分配的。对于lcore线程,如果通过EAL选项启用了跟踪点,则当线程知道DPDK时,将分配跟踪内存(对于EAL lcores为rte_EAL_init,对于非EAL lcore为rte_thread_register)。否则,当在应用程序的生命周期后期启用跟踪点时,行为与非lcore线程相同,并且在第一次跟踪发射时分配跟踪内存。

跟踪内存布局
Trace memory layout

packet.header

uint32_t magic
rte_uuid_t uuid

packet.context

uint32_t thread_id
char thread_name[32]

trace.header

event_id [63:48]
timestamp [47:0]

跟踪标头为64位,由48位时间戳和16位事件ID组成。packet.header和packet.context将在创建跟踪内存时写入慢速路径。trace.header和trace有效负载将在调用tracepoint函数时发出。

限制

rte_trace_point_emit_blob()函数可以捕获长度为rte_trace_blob_LEN_MAX字节的最大blob。如果应用程序需要捕获超过rte_trace_blob_LEN_MAX字节的数据,则应用程序可以多次调用长度小于或等于rte_trace_blob_LEN_MAX的rte_trace_point_emit_blob()。如果传递给rte_trace_point_emit_blob()的长度小于rte_trace_blob_LEN_MAX,则跟踪中的尾部(rte_trace_blob_LEN_MAX-LEN)字节将设置为零。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/212742.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【U8+】用友U8删除固定资产卡片,提示:当前卡片不是本月录入的卡片,不能删除。

【问题描述】 用友U8软件&#xff0c;参照已有账套新建账套的时候&#xff0c;选择结转期初余额。 例如&#xff1a;参照已有账套的2022年新建2023年的账套。 结转期初的时候勾选了固定资产模块&#xff0c; 建立成功后登录23年新的账套后&#xff0c;删除固定资产卡片&#xf…

17.字符串处理函数——字符串比较函数

文章目录 前言一、题目描述 二、解题 程序运行代码 总结 前言 本系列为字符串处理函数编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 二、解题 程序运行代码 #include<stdio.h> #include<string.h> int main() {char *str1 "hello wo…

【C++ regex】C++正则表达式

文章目录 前言一、正则表达式是什么&#xff1f;二、<regex>库的基础使用2.1 第一个示例2.1 <regex>库的函数详解std::regex_matchstd::regex_searchregex_search 和 regex_match 的区别std::regex_replacestd::regex_iterator 和 std::sregex_iterator&#xff1a…

谭巍主任探讨:丝状疣感染机制揭秘

丝状疣是寻常疣的一种特殊类型&#xff0c;主要由人乳头瘤病毒(HPV)感染所致。HPV是一种常见的病毒&#xff0c;可以通过直接接触传播&#xff0c;也可以通过间接接触传播。而多年临床经验告诉北京劲松中西医医院皮肤性病科主任谭巍丝状疣的感染通常与以下因素有关&#xff1a;…

数据结构和算法-树与二叉树的存储结构以及树和二叉树和森林的遍历

文章目录 二叉树的存储结构二叉树的顺序存储二叉树的链式存储小结 二叉树的先中后序遍历例题小结 二叉树的层次遍历小结 由遍历序列构造二叉树一个遍历序列即使给定了前中后序&#xff0c;也不能确定该二叉树的形态可以确定的序列组合前序中序后序中序层序中序 小结若前序&…

6 Redis缓存设计与性能优化

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c; 失去了缓存保护后端存储的意义…

整数分频,奇偶分频。

实验目标&#xff1a; 实现任意整数奇偶分频。 /* 二分频电路就是用同一个时钟信号通过一定的电路结构转变成不同频率的时钟信号。 二分频就是通过有分频作用的电路结构&#xff0c;在时钟每触发2个周期时&#xff0c;电路输出1个周期信号。 比如用一个脉冲时钟触发一个计…

numpy实现神经网络

numpy实现神经网络 首先讲述的是神经网络的参数初始化与训练步骤 随机初始化 任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0&#xff0c;这样的初始方法对于逻辑回归来说是可行的&#xff0c;但是对于神经网络来说是不可行的。如果我们令所有的初始…

如何学习 Spring ?学习 Spring 前要学习什么?

整理了一下Spring的核心概念BeanDefinitionBeanDefinition表示Bean定义&#xff0c;BeanDefinition中存在很多属性用来描述一个Bean的特点。比如&#xff1a;class&#xff0c;表示Bean类型scope&#xff0c;表示Bean作用域&#xff0c;单例或原型等lazyInit&#xff1a;表示Be…

解码 SQL:深入探索 Antlr4 语法解析器背后的奥秘

探寻SQL的背后机制 前言 在数据领域&#xff0c;SQL&#xff08;Structured Query Language&#xff09;是一门广泛使用的语言&#xff0c;用于查询和处理数据。你可能已经使用过诸如MySQL、Hive、ClickHouse、Doris、Spark和Flink等工具来编写SQL查询。 每一种框架都提供了…

阅读软件OmniReader Pro mac功能特色

OmniReader Pro mac是一款文字识别和阅读软件&#xff0c;它可以将印刷体和手写体的文字转换为数字文本&#xff0c;并将其朗读出来。该软件适用于视力受损、阅读困难、语言障碍等用户&#xff0c;可以帮助他们更加轻松地获取信息和阅读文本。 OmniReader Pro具有简洁直观的用户…

csapp-linklab之第5阶段“输出编码后的学号”(补齐残缺的重定位表)

实验内容 修改补充phase5.o重定位节中被清零的重定位记录&#xff0c;使其与main.o链接后能够正确输出学号编码后的字符串&#xff1a; $ gcc -o linkbomb main.o phase5.o $ ./linkbomb $学号编码后字符串 实验提示 仅需修改重定位节的内容。 不允许修改.text节内容。 给出…

python+Appium自动化:python多线程多并发启动appium服务

Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务&#xff0c;启动效率低下。如何将启动Appium服务也实现自动化呢&#xff1f; 这里需要使用subprocess模块&#xff0c;该模块可以创建新的进程&#xff0c;并且连接到进程的输入、输出、错误等管道信息&…

系统托盘区句柄研究和C#基本托盘编程

因为我的系统托盘区小图标有时候会不可见,在还是在; 研究一下系统托盘区的句柄,是否每个小图标是一个单个窗口,就像form的button一样; 下图句柄工具,把问号拖动到窗口上,就会显示该窗口的句柄和窗口类等信息; 拖到系统托盘区看一下;拖到任何一个小图标上面,都只显示…

人工智能学习4(特征选择)

编译工具&#xff1a;PyCharm 有些编译工具在绘图的时候不需要写plt.show()或者是print就可以显示绘图结果或者是显示打印结果&#xff0c;pycharm需要&#xff08;matplotlib.pyplot&#xff09; 文章目录 编译工具&#xff1a;PyCharm 特征选择嵌入法特征选择练习&#xff…

训练自己的YOLOv8姿态估计模型

在不断发展的计算机视觉领域&#xff0c;姿态估计作为一项关键创新脱颖而出&#xff0c;改变了我们理解视觉数据以及与视觉数据交互的方式。 Ultralytics YOLOv8 处于这一转变的最前沿&#xff0c;提供了一个强大的工具来捕捉图像中物体方向和运动的微妙之处。 NSDT工具推荐&am…

使用Visual Studio创建第一个C代码工程

文章目录 2019创建C工程创建C文件运行 上一节我们使用记事本编辑C代码&#xff0c;在命令行运行文件&#xff0c;这种方式只是作为对编译器的了解&#xff0c;实际的开发中一般使用集成开发环境比较多&#xff0c;因为 集成开发环境操作比较简单&#xff0c;通常可编辑&#x…

工作几年了,你真的懂 Redis 嘛?

大家好&#xff0c;我是伍六七。一个专注于输出 AI 编程内容的在职大厂资深程序员&#xff0c;全国最大 AI 付费社群破局初创合伙人&#xff0c;关注我一起破除 35 诅咒。 Redis 基本上是大部分技术公司都会使用的缓存框架&#xff0c;但是我发现很多程序员其实并不懂 Redis。 …

canvas 轮廓路径提取效果

前言 微信公众号&#xff1a;前端不只是切图 轮廓 对内容做border效果&#xff0c;可以先看下代码运行的效果 内容是黑线构成的五角星&#xff0c;其轮廓就是红线的部分&#xff0c;本文主要介绍如何在canvas中实现这种效果 Marching Square 这里运用到的是marching square算法…

Gradio库的安装和使用教程

目录 一、Gradio库的安装 二、Gradio的使用 1、导入Gradio库 2、创建Gradio接口 3、添加接口到Gradio应用 4、处理用户输入和模型输出 5、关闭Gradio应用界面 三、Gradio的高级用法 1、多语言支持 2、自定义输入和输出格式 3、模型版本控制 4、集成第三方库和API …