1.一文分析DPDK跟踪库tracepoint源码
2.Matrix卡顿优化之IdleHandlerLagTracer源码分析
3.用trace工具 trace trace工具
4.tracert工作原理&路由原理
一文分析DPDK跟踪库tracepoint源码
在DPDK跟踪库tracepoint的源码分析中,关键流程包括rte_eal_trace_thread_remote_launch以及初始化过程。初始化流程由`eal_trace_init`执行,挂载`tracepoint`,其核心在于`RTE_TRACE_POINT_DEFINE`宏与`RTE_TRACE_POINT_REGISTER`定义的转换。rte_eal_trace_thread_remote_launch函数定义于`lib\librte_eal\include\rte_eal_trace.h`文件,影视源码对接是远程线程操作的函数。
接着观察`__rte_trace_point_emit_header_generic`函数,通过分析其流程可以看出其主要分为两部分:获取内存区域与填充函数指针、arg指针等数据。在调用这个宏时,内存区域将用于存储时间戳及标志位等信息,然后填入由宏提供的数据类型,包括函数指针、arg指针、bits的slave_id和int型rc变量。这些操作在`rte_eal_remote_launch`函数中执行时完成,DPDK的tracepoint功能最终实现。
为了深入理解这些细节,建议参考相关资源,如《全网讲的c 连续内存源码最好的DPDK,由简到精,系统学习,资深老师带你聊透DPDK 为什么说实现CM的挑战不在硬件而在软件》等材料,并且实际操作学习DPDK的tracepoint实现方法,通过实践深化对源码的理解。
参考资料链接:t.csdn.cn/NhKEJ
Matrix卡顿优化之IdleHandlerLagTracer源码分析
IdleHandler是Android系统提供的一种机制,用于在消息队列空闲时执行任务,其任务优先级低于主线程,适用于实时性要求不高的任务。通常用于优化Android应用启动速度。然而,matrix卡顿优化中对IdleHandler进行监控的原因在于,IdleHandler属于主线程卡顿监控的关键环节。当IdleHandler中出现耗时任务执行,会明显导致主线程卡顿。
为了进行性能优化,matrix对IdleHandler进行监控变得必要。IdleHandler监控的关键在于在TracePlugin中进行初始化和调用。构造方法仅接收配置,包含IdleHandler监控开关。idea路径改成源码onStartTrace方法调用onAlive方法,初始化HandlerThread,创建IdleHandlerLagRunnable,并启动检测IdleHandler的执行。
IdleHandlerLagRunnable负责上报信息。detectIdleHandler方法通过反射获取mIdleHandlers列表,并通过MyArrayList实现hook点,监控IdleHandler的添加和移除。当消息队列添加IdleHandler时,MyArrayList的add方法将IdleHandler包装为MyIdleHandler存入,拦截queueIdle方法调用。
MyIdleHandler继承自IdleHandler,重写queueIdle方法,监控IdleHandler执行过程。当IdleHandler执行时,idleHandlerLagHandler发送延时消息到子线程。若2s内未完成,收集信息上报,发现IdleHandler导致的卡顿问题。
IdleHandlerLagTracer通过hook替换消息队列的跳空不回补源码IdleHandlers集合,拦截添加和移除逻辑,为原IdleHandler添加代理,监控queueIdle方法执行。超时未执行完成则收集信息上报,有效发现IdleHandler导致的卡顿。
性能优化是Android开发中重要的一环,掌握IdleHandler监控机制有助于更细致地进行性能调优。此外,推荐关注Android学习资源,涵盖性能优化、框架底层原理、车载开发、逆向安全、音视频技术、Jetpack全家桶、OkHttp源码解析、Kotlin、Gradle、Flutter等多领域内容,助力深入学习和提升技术能力。可编辑table源码
Android性能优化、框架底层原理、车载开发、逆向安全、音视频技术、Jetpack全家桶、OkHttp源码解析、Kotlin、Gradle、Flutter等学习资源,助力深化技术理解与应用。
用trace工具 trace trace工具
深入探讨了使用trace工具理解eBPF(eBPF)和trace工具的方法。首先,理解了使用eBPF工具进行调试以及trace工具理解trace原理的两种方式:从代码细节入手,或是先勾画大概,再深入细节。在复杂系统中,直接查看所有代码变得困难,尤其是在云环境中,此现象普遍。接下来,以`reallocarray`为例,创建了一个uprobe。
在探究如何通过trace-bpfcc生成uprobe时,通过strace工具发现使用了`perf_event_open`进行注入。进一步关注`perf_event_open`内部参数`struct perf_event_attr`,了解了`config1`和`config2`的作用:`config1`类似uprobe的路径名,而`config2`是特定偏移量。通过尝试不同方法,最终确认`config1`指向`libc.so`文件路径,`config2`为`reallocarray`在`libc-2..so`中的偏移。
创建uprobe后,编写了小程序来触发其执行。eBPF与uprobe的关联通过`trace trace-bpfcc`实现,最终调用`__uprobe_register`。对于`__uprobe_register`的实现,通过进一步查找代码获取信息。`mymem`触发uprobe的机制大致为程序加载或执行过程中会触发先前创建的uprobe,通过`ftrace`的`function_graph`功能筛选并打印调用函数链。
通过分析uprobe_mmap的调用栈,可以了解到在操作vma时会触发uprobe_mmap。uprobe_mmap内部的关键调用有助于理解其工作流程。总结以上trace分析,得出理解uprobe的实现和工作原理,主要通过trace和源码分析相结合的方式,掌握工具和方法是关键。
通过trace过程演示了使用trace工具的能力和方法,更多关于uprobe的实现细节,可以通过进一步的trace或阅读源码进行深入探索。这一过程展示了如何利用trace工具理解复杂系统中的特定功能和行为,为深入学习和调试提供了一条有效路径。
tracert工作原理&路由原理
1:1 <1 ms <1 ms <1 ms proxy.huayuan.hy [...1]
2 * ms ms ..2.3
3 ms ms ms ...
4 ms ms ms ..7.
5 ms ms ms ..3.
6 ms ms ms ..3.
7 ms ms ms xd--5-a8.bta.net.cn [...5]
Trace complete.
看一下上面这个过程 应该不用解释了
下面我们来分析一下 我们是怎么看到这个回显的
大家都知道我们所发送的tracert数据包 属于icmp数据包的一种
关于ttl的概念不知道能否理解
ttl 就是生存时间的意思 也就是我们所发送的数据包 在转发过程中的寿命问题
很好理解 如果寿命为0的话 就不能到达目的地 每经过一个三层设备我们的数据包的
ttl值都会减一 如果减到0 就证明不能到达就会给我们的源主机一个回应显示
并告知源主机 在哪个三层设备将这个生存值置0的 然后将这个三层设备的ip地址转发给
源主机
上面我们说的是ttl的一个原理和作用
下面我们来说 tracert包的原理
我们发送TRACERT包时 第一次的包的ttl值为1 这样到第一个三层设备那就会给
源主机一个回应 并告知其IP
依次类推 第二次发送的时候的TTL值等于2
第三次为3 默认最大hop为
也就是说ttl最大升到
这样我门就能清楚的看到 我们的数据包是怎么到达目的地的
2:当IP子网中的一台主机发送IP分组给同一IP子网的另一台主机时,它将直接把IP分组送到网络上,对方就能收到。而要送给不同IP子网上的主机时,它要选择一个能到达目的子网上的路由器,把IP分组送给该路由器,由路由器负责把IP分组送到目的地。如果没有找到这样的路由器,主机就把IP分组送给一个称为“缺省网关(default gateway)”的路由器上。“缺省网关”是每台主机上的一个配置参数,它是接在同一个网络上的某个路由器端口的IP地址。
路由器转发IP分组时,只根据IP分组目的IP地址的网络号部分,选择合适的端口,把IP分组送出去。同主机一样,路由器也要判定端口所接的是否是目的子网,如果是,就直接把分组通过端口送到网络上,否则,也要选择下一个路由器来传送分组。路由器也有它的缺省网关,用来传送不知道往哪儿送的IP分组。这样,通过路由器把知道如何传送的IP分组正确转发出去,不知道的IP分组送给“缺省网关”路由器,这样一级级地传送,IP分组最终将送到目的地,送不到目的地的IP分组则被网络丢弃了。目前TCP/IP网络,全部是通过路由器互连起来的,Internet就是成千上万个IP子网通过路由器互连起来的国际性网络。网络称为以路由器为基础的网络(router based network),形成了以路由器为节点的“网间网”。在“网间网”中,路由器不仅负责对IP分组的转发,还要负责与别的路由器进行联络,共同确定“网间网”的路由选择和维护路由表。路由动作包括两项基本内容:寻径和转发。寻径即判定到达目的地的最佳路径,由路由选择算法来实现。由于涉及到不同的路由选择协议和路由选择算法,要相对复杂一些。为了判定最佳路径,路由选择算法必须启动并维护包含路由信息的路由表,其中路由信息依赖于所用的路由选择算法而不尽相同。路由选择算法将收集到的不同信息填入路由表中,根据路由表可将目的网络与下一站(nexthop)的关系告诉路由器。路由器间互通信息进行路由更新,更新维护路由表使之正确反映网络的拓扑变化,并由路由器根据量度来决定最佳路径。这就是路由选择协议(routing protocol),例如路由信息协议(RIP)、开放式最短路径优先协议(OSPF)和边界网关协议(BGP)等。
转发即沿寻径好的最佳路径传送信息分组。路由器首先在路由表中查找,判明是否知道如何将分组发送到下一个站点(路由器或主机),如果路由器不知道如何发送分组,通常将该分组丢弃;否则就根据路由表的相应表项将分组发送到下一个站点,如果目的网络直接与路由器相连,路由器就把分组直接送到相应的端口上。这就是路由转发协议(routed protocol)。
路由转发协议和路由选择协议是相互配合又相互独立的概念,前者使用后者维护的路由表,同时后者要利用前者提供的功能来发布路由协议数据分组。