【DPDK】Trace Library

news2024/11/24 4:47:50

概述

跟踪是一种用于了解运行中的软件系统中发生了什么的技术。用于跟踪的软件被称为跟踪器,在概念上类似于磁带记录器。记录时,放置在软件源代码中的特定检测点会生成保存在巨大磁带上的事件:跟踪文件。稍后可以在跟踪查看器中打开跟踪文件,以使用时间戳和多核视图可视化和分析跟踪事件。这样的机制将有助于解决一系列问题,如多核同步问题、延迟测量、找出分析后的信息(如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)字节将设置为零。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows XP安装SVN软件

SVN全称为SubVersion&#xff0c;是Apache开源软件协议下&#xff0c;一个用于代码分布式管理的工具&#xff0c;其孵化的软件产品是TortoiseSVN&#xff0c;该软件是带图形界面的代码管理工具&#xff0c;类似于Git&#xff0c;多了一个图形界面&#xff0c;方便鼠标操作。  …

【每日OJ —— 145. 二叉树的后序遍历】

每日OJ —— 145. 二叉树的后序遍历 1.题目&#xff1a;145. 二叉树的后序遍历2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;145. 二叉树的后序遍历 2.解法 2.1.算法讲解 1.首先如果在每次每个节点遍历的时候都去为数组开辟空间&#xff0c;这样的效率太…

MATLAB - 评估拟合优度、评价拟合效果

系列文章目录 文章目录 系列文章目录前言一、如何评估拟合优度二、拟合优度统计2.1 SSE - 误差引起的平方和2.2 R 平方2.3 自由度调整 R 平方2.4 均方根误差 三、MATLAB - 评估曲线拟合度3.1 加载数据并拟合多项式曲线3.2 绘制拟合方程、数据、残差和预测范围图3.3 评估指定点3…

外包干了2个月,技术倒退2年。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

c++--面向对象特性

1.面向对象指的是继承&#xff0c;封装&#xff0c;多态。 继承主要关注类的构造&#xff0c;赋值&#xff0c;析构。 以下对多态&#xff0c;封装进行补充说明。 2、多态 2.1.定义 a.赋值 派生类的指针&#xff0c;可以赋值给基类的指针。 派送类的对象&#xff0c;可以赋值给…

某60区块链安全之JOP实战二学习记录

区块链安全 文章目录 区块链安全Jump Oriented Programming实战二实验目的掌握对EVM逆向能力实验环境实验工具实验原理实验内容Jump Oriented Programming实战二 实验步骤Jump Oriented Programming实战二 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中中Jum…

MySQL_1. mysql数据库介绍

shell脚本差不多快完结了接下来会为大家更新MySQL系列的相关的基础知识笔记&#xff0c;希望对大家有所帮助&#xff0c;好废话不多说&#xff0c;接下来开始正题&#xff01; 1.mysql数据库介绍 mysql 是一款安全、跨平台、高效的&#xff0c;并与 PHP、Java 等主流编程语言…

C#,数值计算——计算实对称矩阵所有特征值与特征向量的三角分解与QL迭代法源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Computes all eigenvalues and eigenvectors of a real symmetric matrix by /// reduction to tridiagonal form followed by QL iteration. /// </summary> pu…

Linux磁盘阵列raid

RAID介绍 RAID &#xff08; Redundant Array of Independent Disks &#xff09;即独立磁盘冗余阵列&#xff0c;通常简称为磁盘阵列。简单地说&#xff0c; RAID 是由多个独立的高性能磁盘驱动器组成的磁盘子系统&#xff0c;从而提供比单个磁盘更高的存储性能和数据冗余的技…

使用 javascript 模拟 git diff 命令实现文本文件差异比较

diff.html&#xff1a; <!DOCTYPE html> <html> <head><title>文件比较</title><meta charset"UTF-8"> </head> <body> <h1>文件比较</h1> <form><label for"file1">版本1&…

微服务1 springcloud学习笔记P1-P40

b微服务技术栈_哔哩哔哩_bilibili 文档资料: 链接&#xff1a;https://pan.baidu.com/s/1P_Ag1BYiPaF52EI19A0YRw?pwdd03r 提取码&#xff1a;d03r 一 了解微服务技术 二 Eureka (1) Eureka配置 (2) 注册user-service (3) 总结 Ribbon 负载均衡 (1) 流程 三 nacos配置管理…

CFS三层靶机内网渗透

CFS三层靶机内网渗透 一、靶场搭建1.基础参数信息2.靶场搭建2.1网卡配置2.2Target1配置2.2.1 网卡配置2.2.2 Target1 BT配置 2.3Target2配置2.3.1 网卡配置2.3.2 Target2 BT配置 2.4Target3配置 二、内网渗透Target11.1信息收集1.1.1IP收集1.1.2端口收集1.1.3目录收集 1.2 webs…

思维模型 移情效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。情感迁移&#xff0c;爱屋及乌。 1 移情效应的应用 1.1 移情效应在市场营销中应用-多芬&#xff08;Dove&#xff09;“真美运动” 多芬&#xff08;Dove&#xff09;是一家知名的个人护理…

园区规划技术要点

&#xff08;一&#xff09;技术点介绍 1.WLAN&#xff1a;无线局域网WLAN&#xff08;Wireless Local Area Network&#xff09;是一种无线计算机网络&#xff0c;使用无线信道代替有线传输介质连接两个或多个设备形成一个局域网LAN&#xff08;Local Area Network&#xff09…

BUU UPLOAD COURSE 1

传一个cmd.php木马文件 访问一下这个图片地址 发现什么都没有&#xff0c;在hackbar里面连接一下我们的木马 然后看到了一些目录 然后直接查看flag就出来了 这里也可以用蚁剑去连接 直接访问地址&#xff0c;拿着地址去连接就行了。

从零开始,轻松实现Python接口自动化测试(基于PyCharm)

1.接口清单整理 &#xff08;1&#xff09;请求&#xff1a; 请求URL请求方法请求参数请求报文 &#xff08;2&#xff09;响应 状态码响应数据 2.用例设计 &#xff08;1&#xff09;单接口测试用例 模板&#xff1a;id、模块、接口名称、请求URL、用例名称、请求方法、…

用Python手把手教你WordCloud可视化

目录 WordCloud是什么&#xff1f; 具体使用 总结 WordCloud是什么&#xff1f; WordCloud是一种数据可视化技术&#xff0c;通过根据文本中单词的频率或权重来生成一个视觉上吸引人的词云图。在词云图中&#xff0c;单词的大小和颜色通常与其在文本中的出现频率相关&#…

【Java Web学习笔记】5 - XML

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/xml 零、在线文档 XML系列教程 一、XML引出 1.为什么需要XML 1.需求1 :两个程序间进行数据通信? 2.需求2:给一台服务器&#xff0c;做-一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去…

synxflow 安装环境

介绍&#xff1a; 该软件可以动态模拟洪水淹没&#xff0c;滑坡跳动和泥石流使用多个cuda支持的gpu。它还提供了一个用户友好但多功能的Python界面&#xff0c;可以完全集成到数据科学工作流程中&#xff0c;旨在简化和加速危害风险评估任务。 这个包我从网上找到的资源特别特…

【WPF.NET开发】构造动态布局

本文内容 系统必备创建项目配置默认的 Grid Panel 控件向面板中添加控件测试布局汇总所有内容后续步骤 在动态定位中&#xff0c;您通过指定子元素相对于父元素应该如何排列以及应该如何包装来排列子元素。 您还可以将窗口和控件设置为在其内容扩展时自动扩展。 适用于 Vis…