【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.headeruint32_t magic
rte_uuid_t uuidpacket.contextuint32_t thread_id
char thread_name[32]trace.headerevent_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)字节将设置为零。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringSecurity的默认登录页的使用

SpringSecurity的默认登录页的使用 01 前期准备 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mysql驱动--><dependency><grou…

【S32K3环境搭建】-0.3-S32DS安装实时驱动RTD(Real-Time Driver)

目录 1 什么是“实时驱动RTD(Real-Time Driver)” 2 安装“实时驱动RTD(Real-Time Driver)” 2.1 方法一&#xff1a;通过S32DS Extensions and Updates安装“实时驱动RTD(Real-Time Driver)” 2.2 方法二&#xff1a;通过Install New Software…安装“实时驱动RTD(Real-Ti…

【海思SS528 | VO】MPP媒体处理软件V5.0 | 视频输出模块——学习笔记

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Docker本地部署Firefox火狐浏览器并远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

zookeeper集群 +kafka集群

1.zookeeper kafka3.0之前依赖于zookeeper zookeeper是一个开源&#xff0c;分布式的架构&#xff0c;提供协调服务&#xff08;Apache项目&#xff09; 基于观察者模式涉及的分布式服务管理架构 存储和管理数据&#xff0c;分布式节点上的服务接受观察者的注册&#xff0c…

ATFX汇市:加央行即将公布12月利率决议结果,大概率维持5%不变

ATFX汇市&#xff1a;2023年美联储的8次利率决议计划&#xff0c;已经公布7次结果&#xff0c;其中有四次加息&#xff0c;三次暂停加息&#xff0c;并且近两次的决议结果都是不加息。美联储的货币政策对其他国家中央银行的决策具有指导作用&#xff0c;尤其是经济数据与美国共…

Android的前台服务

概述 前台服务是用户主动意识到的一种服务&#xff0c;因此在内存不足时&#xff0c;系统也不会考虑将其终止。前台服务必须为状态栏提供通知&#xff0c;将其放在运行中的标题下方。这意味着除非将服务停止或从前台移除&#xff0c;否则不能清除该通知。 在 Android 8.0&…

CPP-SCNUOJ-Problem P24. [算法课贪心] 跳跃游戏

Problem P24. [算法课贪心] 跳跃游戏 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标。 输入 输入一行数组nums 输出 输出true/fasle 样例 标准输入 2 3 1 …

【网络奇缘】- 计算机网络|分层结构|深入学习ISO模型

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 回顾链接&#xff1a;http://t.csdnimg.cn/nRRzR 这篇文章是关于深入学习OSI模型七层结构&#xff0c; “书山…

如何解决syntaxerror: more than 255 arguments 报错

如何解决syntaxerror: more than 255 arguments 报错 问题背景解释解决方案 问题背景 今天拼接特征的时候&#xff0c;突然代码报错syntaxerror: more than 255 arguments &#xff0c;看了一下感觉这个报错非常有意思&#xff0c;估计平时也是没机会碰到&#xff0c;和大家分…

Java LeetCode篇-深入了解二叉树经典解法(三种方式实现:获取二叉树的最大深度)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 对称二叉树 1.1 判断对称二叉树实现思路 1.2 代码实现&#xff1a;判断对称二叉树 2.0 二叉树的最大深度 2.1 使用递归实现获取二叉树的最大深度思路 2.2 代码实…

Hello World

世界上最著名的程序 from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}app.get("/hello/{name}") async def say_hello(name: str):return {"message": f"…

漏洞扫描服务是什么

漏洞扫描服务是维护网络安全的重要一环。通过定期或实时的漏洞扫描&#xff0c;组织可以及时发现并修复可能存在的安全威胁&#xff0c;增强自身网络的安全性。在选择漏洞扫描服务时&#xff0c;需要明确自身的需求和目标&#xff0c;并选择合适的工具和服务提供商。只有这样&a…

flutter使用动态路由传参的最小案例

flutter中使用动态路由传递参数的封装案例&#xff0c;子组件页面只需要接收arguments参数即可&#xff0c;参数是一个map&#xff0c;里面包含有所需要的参数&#xff0c;类似于json。在MaterialApp中配置onGenerateRoute&#xff0c;然后动态判断传递参数&#xff1a; route…

【数据结构】——堆排序

前言&#xff1a;我们已经学习了堆以及实现了堆&#xff0c;那么我们就来给堆进行排序。我们怎么来进行排序呢&#xff1f;这一次我们就来解决这个问题。 如果我们堆排序要求排序&#xff0c;我们是建立大堆还是小堆呢&#xff0c;如果我们建的小堆的话&#xff0c;那我们在排序…

玩转大数据9:机器学习在大数据分析中的应用

1. 引言 在大数据时代&#xff0c;机器学习在大数据分析中扮演着至关重要的角色。本文介绍机器学习在大数据分析中的重要性和应用场景&#xff0c;并探讨Java中可用的机器学习库和框架。 2. 机器学习的基本概念和算法 机器学习是当今人工智能领域的一个关键分支&#xff0c;…

Flink(九)【时间语义与水位线】

前言 2023-12-02-20:05&#xff0c;终于写完啦&#xff0c;最近状态不错。刚写完又收到了她的消息哈哈哈哈&#xff0c;开心。 再去全力打拼一次&#xff0c;奋战一场&#xff0c;就算最后打了败仗也无所谓&#xff0c;至少你留下了足迹。 《解忧杂货店》 1、时间语义 …

webpack学习-1.起步

webpack学习-1.起步 1.基础设置2.配置文件的引入3.总结 1.基础设置 首先 webpack是干嘛的呢&#xff0c;用官网的一张图 Webpack 是一个现代的静态模块打包工具。它主要用于将前端应用程序中的各种资源&#xff08;例如 JavaScript、CSS、图片等&#xff09;打包成一个或多个…

Linux 进程地址空间

文章目录 进程地址空间进程地址空间结构页表虚拟内存写时拷贝 进程地址空间 进程地址空间难以定义&#xff0c;因为它更像是一个中间件。 程序从磁盘中加载到内存&#xff0c;程序的执行需要硬件资源&#xff0c;所以每个程序启动时会创建至少一条进程&#xff0c;进程作为组…

销售人员如何拓展客户?

销售这个职业每年都会有很多新人来&#xff0c;也有很多老人转行。大多数人转行的原因无非就是找不到客户&#xff0c;没有完成业绩导致工资不理想&#xff0c;性格不合适无法开口交流不会社交等等。 既然有很多人因为找不到客户而放弃&#xff0c;那么对于一个销售来说&#…