self-motivation
专注LINUX系统与性能分析优化
展开
-
BPF性能分析—内存篇page_fault
性能分析—内存篇page_fault分析步骤1.sar -B 1整体分析,重点关注fault/s# sar -B 1Linux 5.4.0-92-generic (zhangxa-Precision-3650-Tower-docker) 01/17/22 _x86_64_ (16 CPU)11:35:37 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff原创 2022-01-21 21:47:52 · 1270 阅读 · 0 评论 -
BPF可移植性 CO-RE (Compile Once – Run Everywhere)
BPF CO-RE的目标是帮助BPF开发人员以简单的方式解决简单的可移植性问题(如读取结构字段),并使其仍然有可能(如果不是微不足道的话,也是可以容忍的)解决复杂的可移植问题(如不兼容的数据结构更改、复杂的用户空间控制条件等)。这允许BPF开发人员停留在“编译一次–到处运行”的范式中。这是通过组合几个BPF CO-RE构建块来实现的,如本篇文章的内容所述:vmlinux.h消除内核头文件依赖字段重定位(字段偏移、存在、大小等)使从内核提取数据变得可移植。原创 2024-07-01 16:35:05 · 48 阅读 · 0 评论 -
BPF可移植性 CO-RE (Compile Once – Run Everywhere)
BPF CO-RE的目标是帮助BPF开发人员以简单的方式解决简单的可移植性问题(如读取结构字段),并使其仍然有可能(如果不是微不足道的话,也是可以容忍的)解决复杂的可移植问题(如不兼容的数据结构更改、复杂的用户空间控制条件等)。这允许BPF开发人员停留在“编译一次–到处运行”的范式中。这是通过组合几个BPF CO-RE构建块来实现的,如本篇文章的内容所述:vmlinux.h消除内核头文件依赖字段重定位(字段偏移、存在、大小等)使从内核提取数据变得可移植。原创 2024-07-01 16:30:45 · 162 阅读 · 0 评论 -
deepE 定位系统卡顿问题实战(一) ----------- 锁造成的阻塞问题
我们可以利用这个offcputime来分析实际环境中因为各种原因造成的进程阻塞及卡顿问题.原创 2024-06-28 15:13:22 · 254 阅读 · 0 评论 -
堆栈推导两种方式fp与dwarf的差异与原理解析
堆栈推导一般用于coredump文件分析,火焰图制作等场景.了解其原理,有助于帮助我们分析异常问题,以及优化火焰图的制作流程,减少不完整栈情况的出现.堆栈推导有两种常见方式:fp与dwarf. 本篇文章介绍这2种堆栈推导方式的原理及适用场景.原创 2024-06-28 10:56:54 · 67 阅读 · 0 评论 -
deepE版本支持aarhc64 orin平台发布
欢迎参与deepE项目。原创 2024-06-25 11:18:24 · 33 阅读 · 0 评论 -
linux可观测性ebpf(一) ----------- 环境搭建
因为学习的书比较老,所以libbpf我们要使用v.8.0.0版本。原创 2024-06-01 10:04:56 · 116 阅读 · 0 评论 -
linux i/o基本原理
linux对每个磁盘或分区都维护有一个请求队列,i/o算法会进行操作的合并重排等操作以优化性能。原创 2024-05-23 10:19:34 · 41 阅读 · 0 评论 -
每天一个ebpf工具 io篇(一) ----------- biosnoop
这里的延迟是1.1中, 2和3操作之间的延迟。即从内核将i/o操作提交给块设备到块设备完成操作通知内核软中断处理的耗时.linux对每个磁盘或分区都维护有一个请求队列,i/o算法会进行操作的合并重排等操作以优化性能。i/o结束时,分别统计i/o请求在队列中的等待时间和i/o操作块设备的延迟时间.显示进行i/o操作的程序,操作的磁盘扇区,读/写操作, 字节数,以及延迟。获取当前放入i/o request_queue的时间,并放入map中。获取当前提交块设备i/o请求的时间,并放入map中。原创 2024-05-22 14:35:04 · 75 阅读 · 0 评论 -
perfetto原理之ProtoZero
ProtoZero是一个零拷贝,零分配,零系统调用的protobuf序列化库,主要用于在Perfetto里实现跟踪记录.原创 2024-04-07 11:35:43 · 71 阅读 · 0 评论 -
ebpf+perfetto实现调度延迟记录与展示
因此,我们只需在2.1.1时记录线程的tid和时间, 在2.1.2时根据tid取出2.1.1时记录的时间并与当前时间做差值,即可得到调度延迟.然后我们用bcc前端结合上面的ebpf程序实现延迟数据获取并记录perfetto支持的json的代码.perfetto支持proto与json等多种格式,为了简化我们的实现难度,我们使用json格式.这里我们只需要研究一下perfetto的数据格式,并按照其格式存储即可.我们可以跟踪线程从放入就绪队列到实际被选中并获得CPU的过程。这里要注意,我们检测系统是否支持。原创 2024-04-05 22:47:46 · 272 阅读 · 0 评论 -
使用ebpf优化FastDDS统计模块statistics
概述通过本文,你将了解到以下内容:fastdds的调试统计功能如何使用fastdds的调试统计功能有什么问题如何使用USDT(systemTap) + ebpf对fastdds调试统计功能进行改造,以实现动态开关调试功能并实现高性能.fastdds statistics官方文档及说明https://fast-dds.docs.eprosima.com/en/latest/fastdds/statistics/statistics.html已知bughttps://fast-dds.do原创 2024-04-03 19:17:00 · 132 阅读 · 0 评论 -
ROS2性能优化(一) ------------- 优化executor性能
使用ros2实现的节点,订阅了较多的topic数量(70个左右), 节点cpu使用率明显升高使用perf观察火焰图,executor耗时较多.在ros2 rclcpp的github上搜到确实有一个相关的issue.原创 2024-03-24 10:29:21 · 208 阅读 · 0 评论 -
网络优化篇(一)---------TCP重传性能优化
本文通过一个TCP重传优化的实际问题,详细讲解问题的分析、定位、优化过程。/procbcc。原创 2024-01-06 21:11:54 · 1108 阅读 · 0 评论 -
bcc实战(一)---------内存性能优化
其实我们可以针对不同类型的问题,制作相应的火焰图。因为不同cpu上linux处理page_fault的入口可能不同,所以我们先用bpftrace工具查找一下对应的函数。使用TCMalloc后可以使用火焰图和pidstat再次确认内存使用情况。如果改头善不明显,可能要针对里程内存的使用特点,对TCMalloc进行参数调整或者使用其它内存分配器。可以看到进程每秒的page_fault次数有几万次,数量还是很高的,有很大优化空间.使用TCMalloc让进程尽可能的缓存使用的物理内存,而不是频繁的交还操作系统。原创 2024-01-05 11:29:08 · 434 阅读 · 0 评论 -
epbf原理篇 -------- epbf编程语言
1.6万字bpf正如上文中提到Linus对epbf的评价ebpf的强大的可编程性几乎可以最大程度地的满足我们性能分析、追踪、安全等各种需要。既然类似于一门编程语言,我们就可以从学习一门编程语言的角度来学习它。看看ebpf都提供给我们哪些编程便利.原创 2023-12-31 09:33:57 · 1160 阅读 · 0 评论 -
ebpf基础篇(二) ----- ebpf前世今生
它提供了数据链路层的接口,可以在数据链路层发送和接收数据.如果网卡支持混杂模式,所有的数据包都可以被接收,即使这些数据包的目的地址是其它主机.安全是因为ebpf程序需要经过内核中验证器的验证,它可以进行静态代码分析,拒绝可能crash,hang或者对内核有负作用的代码.这些过滤指令实际上是由内核中运行的虚拟机执行的,这个内核中的虚拟机就是BPF的实现核心.这种验证模式和沙箱机器不同,沙箱的运行环境是有限制的,且对执行的程序没有了解能力.,程序可以关联到内核的多种hooks,并在事件触发时运行.原创 2023-12-24 19:01:17 · 912 阅读 · 0 评论 -
性能实战(一) --- clock_gettime造成系统整体cpu过高定位过程
既然clock_gettime可以通过vdso,为什么异常系统上还会有这么多系统调用呢?原创 2023-12-23 21:46:15 · 1234 阅读 · 0 评论 -
ebpf基础篇(一) -------- hello ebpf
很多东西的学习都开始于一个’hello world’, ebpf也不例外。实验环境: ubuntu 20.04。原创 2023-12-23 11:30:41 · 398 阅读 · 0 评论 -
Linux NAPI ------------- epoll边缘触发模式
表示与轮询表中其他设备相比,该设备的相对重要性。网络驱动程序对特定于设备的中断设置了一个处理例程,因此每当该中断被引发时(即分组到达),内核都调用该处理程序,将数据从网卡传输到物理内存,或通知内核在一定时间后进行处理。由于下一个分组也通过IRQ通知,如果前一个分组的IRQ尚未处理完成,则会导致问题,高速设备通常就是这样。在从 napi_struct 的容器获得特定于设备的信息之后,调用一个特定于硬件的方法(这里是。么不利之处:在没有分组还需要处理时,将停止轮询,设备将回复到通常的IRQ驱动的运行方式。原创 2023-12-15 12:10:10 · 987 阅读 · 0 评论 -
Linux PSI-----Pressure Stall information
当CPU、memory或IO设备处于竞争状态,业务负载会遭受时延毛刺、吞吐量降低,及面临OOM的风险。如果没有一种准确的方法度量系统竞争程度,则有两种后果:一种是用户过于节制,未充分利用系统资源;另一种是过度使用,经常性面临业务中断的风险。psi特性能够识别和量化资源竞争导致的业务中断,及其对复杂负载乃至整个系统在时间上的影响。准确度量因资源不足造成的生产力损失,有助于用户基于硬件调整业务负载,或基于业务负载配置硬件。原创 2023-12-10 10:33:27 · 1136 阅读 · 0 评论 -
定位分析RCU stall问题
在编译内核时打开或者在启动参数中增加这样统计信息是在采样周期中收集的。其中number行分别是发生stalled的cpu上的硬中断,软中断,和上下文的切换次数cputime行的前三列分别是硬中断,软中断和任务消耗的cpu时间,单位为ms.最后一个数字是统计的周期时间(ms).因为用户态的任务通常不会引起RCU CPU stalls,所以任务通常是内核任务,这也是为什么只统计system cpu的原因.原创 2023-12-09 21:47:47 · 1040 阅读 · 0 评论 -
ebpf实战(一)-------监控udp延迟
然后在流程2读取udp缓冲区时(__skb_recv_udp)时取出1中记录的skb时间,并与当前时间做差值得到延迟.为了分析udp数据通信中端到端的延迟,我们需要对整个通信链路的每个阶段进行监控,找出延迟最长的阶段.2和1之间可能由于调度等造成延迟,我们写一个bcc程序对指定接收端口和延迟大于某个值的情况进行监控。我们在流程1放入udp缓冲区时(udp_unicast_rcv_skb),记录此skb的时间。1.数据包到达本机后,由软中断处理程序将数据包接收并放入udp socket的接收缓冲区。原创 2023-11-23 14:30:57 · 772 阅读 · 0 评论 -
fastdds实战 ------ 订阅者使用组播
使用"default_external_unicast_locators"置空关闭默认的单播udp端口。默认情况下,FastDDS会对本机的topic使用共享内存,并默认开启一个单播udp端口接收数据.因此我们使用"useBuiltinTransports=false"关闭默认的共享内存通道。并配置一个组播地址用于接收数据,并通过代码在创建data_reader时使用它.原创 2023-11-23 10:22:19 · 314 阅读 · 0 评论 -
BPF学习之性能分析
BPF学习之性能分析1. 概览1.1.目标性能分析前我们需要先明确目标,有的放矢.明确了目标后,进一步的分析工作就有了上下文,不至于跑偏.一般来说,性能分析的目标是改进用户最终体验和降低运行成本.有了目标,最好能将其进行量化:这种量化能够表明是否已经达到优化的目标,还可以定义离目标的差距有多远.可测量的指标:延迟: 多久可以完成一次请求操作,通常以毫秒为单位.速率: 每秒操作或请求的速率.吞吐量: 通常指每秒传输的数据量,以比特(bit)或者字节(byte)为单位.利用率: 以百分比形原创 2021-01-03 10:57:45 · 575 阅读 · 0 评论