aops-ceres/0010-Soft-links-for-documents.patch
LHesperus 591d5cb9ae [bugfix]da-tool cmd check, sched miss proc
(cherry picked from commit d06fa481f77e2f15cd8a248ca4bd20988b299d84)
2023-11-28 14:23:50 +08:00

233 lines
12 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 904d42948317e9ebfc1b3ae2a83778de4c9b8d2c Mon Sep 17 00:00:00 2001
From: LHesperus <2639350497@qq.com>
Date: Sun, 26 Nov 2023 22:17:01 +0800
Subject: [PATCH] Soft links for documents
---
extra-tools/da-tool/README.md | 200 ++--------------------------------
1 file changed, 8 insertions(+), 192 deletions(-)
diff --git a/extra-tools/da-tool/README.md b/extra-tools/da-tool/README.md
index 209b43b..157af65 100644
--- a/extra-tools/da-tool/README.md
+++ b/extra-tools/da-tool/README.md
@@ -1,26 +1,9 @@
# da-tool
-通过`uprobe`或`kprobe`采样可获得函数执行的`trace`,但配置比较复杂,`trace`包含的信息很多,显示不直观。本工具旨在简易配置采样,以及分析所配置的函数的时延特征。
+通过`uprobe`或`kprobe`采样可获得函数执行的`trace`,但配置比较复杂,`trace`包含的信息很多,显示不直观。本工具旨在简易配置采样,以及分析所配置的函数的时延特征。
-主要应用场景分析tcp/udp收发相关函数时延特征。
-
-## 原理
-基于u/kprobe 采样可获得内核态和用户态函数的起止执行时间和结束执行时间的trace。
-可推导出:
-+ 函数间的调用关系
-+ 函数的执行时间
-+ 线程的调度特征
-
-## 主要功能
-
-+ 推导调用关系(乱序)
-+ 统计各函数调用栈时延信息
-+ 线程调度特征
-+ 记录系统信息
-
-## 使用限制
-+ 不支持递归函数分析
+主要应用场景:分析`tcp/udp`收发相关函数时延特征。
## 文件夹说明
**工程文件夹**
@@ -39,180 +22,13 @@
+ CMakeLists.txt
+ test : 测试程序
-**本地文件夹**
-
-+ /etc/da-tool.conf : 配置文件,主要配置需要抓取的函数
-+ /var/da-tool:
- + tmp
- + sample_output_* : 采样文件存放位置,可打包
- + analysis_input : 临时用于分析程序的依赖文件
- + analysis_output
- + debug : 可用于调试的参考日志
- + output : 时延结果信息
-
-## 使用方法
-### 命令格式
-时延分析工具通过`da-tool.sh`命令采集和分析函数时延,使用格式为
-
-**da-tool.sh** [-t <*probe time*>]
-
-|参数|是否必选|参数函数|
-|----|--------|-------|
-|-t |否| 采集函数 `trace` 的时长,单位秒,最大限制 100默认10|
-
-### 自定义配置函数
-配置文件:`/etc/da-tool.conf`
-
-举例如下:
-```
-# /etc/da-tool.conf
-
-# kernel symbol config (ref: /proc/kallsyms)
-k,udp_recvmsg,udp_sendmsg,dev_queue_xmit,udp_send_skb,sock_recvmsg,__skb_recv_udp,udp_rcv
-
-# sched config
-s,sched_switch
-
-# user symbol config (format : u,path,bin_name,func1,func2,...,funcN)
-# u,/path/,bin_name,sendto
-u,/home/git_repo/nda-tool/nda-tool/test/net_demo2/,server_no_blk,recvfrom
-u,/home/git_repo/nda-tool/nda-tool/test/net_demo2/,client_to_noblk,sendto
-u,/home/git_repo/nda-tool/nda-tool/test/base_demo/,base_demo_cpp,_Z5func1v,_Z5func2v,_Z5func2i,_Z5func3v,_Z5func4v
-# end
-```
-
-+ k 开头为 kernel 符号u 开头为用户态程序符号, s 开头为调度配置(目前仅支持`sched_switch`且必须配置)
-+ k 和 s 只能一行配置完
-+ u 可以多行配置, 格式:`[u,程序路径,二进制名称,追踪的函数]`
-+ 请确保函数存在,否则 `uprobe` 配置不成功,所配置的内核符号应在`/proc/kallsyms`能够查询到,所配置的用户态程序符号仅支持`C/C++`,且通过`objdump`应能够查询到
-+ 每行末尾不要有逗号
-
-
-注意,为了支持用户态不同二进制重名函数采集,配置`event`时,命名为`u0_func1`、`u1_func1`...,以上面配置为例,`_Z5func1v`为`u2__Z5func1v`。
-### 分析结果说明
-
-+ 终端输出结果:各函数调用栈的时延信息
-+ 文件夹输出结果 `/var/da-tool/analysis-output/ouput/`
- + func_delay_stack : 函数调用栈时延结果
- + process_sched_info :进程的调度信息
- + summary_delay.csv 时延分析总结报告
- + summary_sched.csv 调度分析总结报告
-
-#### 终端输出结果介绍
-```
-├──pid: 222459{local:(450040, 44.988%), global:(1000346, 100.000%)}
-│ ├─────sched_switch{local:(13160, 1.316%, 453.793), global:(13160, 1.316%, 453.793), times:29, (int)ret>=0 times:29}
-│ └─────u0_recvfrom{local:(422312, 42.217%, 10.729), global:(537146, 53.696%, 13.646), times:39362, (int)ret>=0 times:20}
-│ ├─────sched_switch{local:(2927, 0.293%, 209.071), global:(2927, 0.293%, 209.071), times:14, (int)ret>=0 times:14}
-│ └─────sock_recvmsg{local:(55313, 5.529%, 1.405), global:(111907, 11.187%, 2.843), times:39362, (int)ret>=0 times:20}
-│ └─────udp_recvmsg{local:(36357, 3.634%, 0.924), global:(56594, 5.657%, 1.438), times:39362, (int)ret>=0 times:20}
-│ └─────__skb_recv_udp{local:(20237, 2.023%, 0.514), global:(20237, 2.023%, 0.514), times:39362, (int)ret>=0 times:39342}
-
-```
-以此结果为例该进程是一个udp非阻塞收包进程。
-+ `u0_recvfrom` 为该进程在运行后执行的用户态函数,`u0_` 前缀表示第一个应用程序的函数,实际函数名为`recvfrom``sched_switch` 为调度函数;其余函数为内核函数
-+ `global` 和 `local` 对应的括号内为该函数执行的时延信息,其中 `local` 是剔除掉子函数和调度所执行的时间 `global` 为该函数实际执行时长
-+ 每个函数的 `global` 和 `local` 的括号内三个信息分别为,时延,该时延所占进程全部时间的百分比,平均时延(时延/执行次数)
-+ 每一级函数的 `global` 时间等于本级函数`local`时间与下一级所有函数的 `global` 时间之和
-+ `times` 是该函数调用栈的次数,
-+ `(int)ret>=0 times`:表示该函数返回值转换为`int`后大于等于0的次数无返回值函数返回值是无效的值
-+ 以上时间单位为微秒
-
-#### 文件夹结果介绍
-
-**时延和调用关系信息**`/var/da-tool/analysis_output/output/func_delay_stack`
-```
-# 此部分信息为终端输出结果的文件格式存储
-pid_222459;sched_switch 13160, localDelaySum ,13160, localAvedelay ,453.793103, localPercentage, 1.316%, globalDelaySum ,13160, globalAvedelay, 453.793103, globalPercentage, 1.316%, times , 29, (int)ret>=0 times ,29
-pid_222459;u0_recvfrom;sched_switch 2927, localDelaySum ,2927, localAvedelay ,209.071429, localPercentage, 0.293%, globalDelaySum ,2927, globalAvedelay, 209.071429, globalPercentage, 0.293%, times , 14, (int)ret>=0 times ,14
-pid_222459;u0_recvfrom 422312, localDelaySum ,422312, localAvedelay ,10.728926, localPercentage, 42.217%, globalDelaySum ,537146, globalAvedelay, 13.646309, globalPercentage, 53.696%, times ,39362, (int)ret>=0 times ,20
-pid_222459;u0_recvfrom;sock_recvmsg 55313, localDelaySum ,55313, localAvedelay ,1.405239, localPercentage, 5.529%, globalDelaySum ,111907, globalAvedelay, 2.843021, globalPercentage, 11.187%, times ,39362, (int)ret>=0 times ,20
-pid_222459;u0_recvfrom;sock_recvmsg;udp_recvmsg 36357, localDelaySum ,36357, localAvedelay ,0.923657, localPercentage, 3.634%, globalDelaySum ,56594, globalAvedelay, 1.437783, globalPercentage, 5.657%, times ,39362, (int)ret>=0 times ,20
-pid_222459;u0_recvfrom;sock_recvmsg;udp_recvmsg;__skb_recv_udp 20237, localDelaySum ,20237, localAvedelay ,0.514125, localPercentage, 2.023%, globalDelaySum ,20237, globalAvedelay, 0.514125, globalPercentage, 2.023%, times ,39362, (int)ret>=0 times ,39342
-```
-
-**调度信息**`/var/da-tool/analysis_output/output/process_sched_info`
-```
-# delaySum : 该pid分析的总时长
-# schedSwitchDelay : 调度所占的时间
-# runtime delaySum - schedSwitchDelay
-# cpuSwitchTimes 该pid从一个核切换到另一个核的次数
-# core 2, run time 704927 表示在cpu2 上运行时长为 704927
-# startTime,67551.691078,endTime,67551.701193,coreIndex,2 在这个时间段内在cpu2上运行
-# coreIndex,-1 表示该pid被切走的时长(sched_switch)
-
-pid,222459,delaySum ,1000368,schedSwitchDelay ,37201,runtime ,963167,cpuSwitchTimes ,1,
- core 2, run time 704927
- core 3, run time 258240
-startTime,67551.691078,endTime,67551.701193,coreIndex,2
-startTime,67551.701193,endTime,67551.701970,coreIndex,-1
-startTime,67551.701970,endTime,67551.702503,coreIndex,2
-startTime,67551.702503,endTime,67551.713700,coreIndex,-1
-startTime,67551.713700,endTime,67551.723964,coreIndex,2
-startTime,67551.723964,endTime,67551.724119,coreIndex,-1
-...
-
-```
-**时延分析总结报告**`/var/da-tool/analysis_output/output/summary_delay.csv`
-
-包含信息如下,其中`(r>=0)`表示函数返回值转成`int`后大于等于0的情况。
-`ave,sum,min,max,p50,p80,p95,p99`等为时延信息的平均值、总和、极值、各百分位下的数值。
-```
-pid,function,call_times,ave,sum,min,max,p50,p80,p95,p99,
-call_times(r>=0),ave(r>=0),sum(r>=0),min(r>=0),max(r>=0),p50(r>=0),p80(r>=0),p95(r>=0),p99(r>=0),
-call_times(r<0),ave(r<0),sum(r<0),min(r<0),max(r<0),p50(r<0),p80(r<0),p95(r<0),p99(r<0),
-```
-
-**调度分析总结报告**`/var/da-tool/analysis_output/output/summary_sched.csv`
-```
-pid,delaySum,schedSwitchDelay,schedSwitchPercentage,schedSwitchTimes,cpuSwitchTimes
-```
-+ delaySum : 总耗时
-+ schedSwitchDelay 调度总耗时
-+ schedSwitchPercentage schedSwitchDelay 占 delaySum 的百分比
-+ schedSwitchTimes 调度次数
-+ cpuSwitchTimes : cpu 切换次数
-
-### 扩展功能
-`da-tool` 生成的结果信息可调用 火焰图生成工具,可视化分析结果,
-`./flamegraph.pl` 可在 `https://gitee.com/mirrors/FlameGraph` 中获取
-```shell
-# 全部信息
-cat /var/da-tool/analysis_output/output/func_delay_stack | grep -o '^[^,]*' | ./flamegraph.pl --countname "delay sum" > allpid.svg
-# 指定pid
-cat /var/da-tool/analysis_output/output/func_delay_stack | grep -o '^[^,]*' | grep -E 'pid1|pid2' | ./flamegraph.pl --countname "delay sum" > pid.svg
-```
-### 常见错误说明
-**配置了不存在的符号**
-```
-Failed to find symbol aaaa in kernel
- Error: Failed to add events.
-```
-**符号已存在,重复配置**
-```
-Error: event "aaaa" already exists.
- Hint: Remove existing event by 'perf probe -d'
- or force duplicates by 'perf probe -f'
- or set 'force=yes' in BPF source.
- Error: Failed to add events.
-```
+## 详情
-采集后会在`/var/da-tool/tmp`文件夹下生成一个`output_时间`格式的文件夹,包含此次采样的结果。
-采样脚本的采样日志在此路径下:
-```
-/var/da-tool/tmp/sample_output_时间/da-tool/sample.log
-```
+|主题|内容简介|是否发布|
+|:----|:-----|:----|
+|[openEuler指南](https://gitee.com/openeuler/community/blob/master/zh/contributors/README.md)| 如何参与openEuler社区 | 已发布 |
+|[da-tool 使用指南](https://gitee.com/openeuler/docs/blob/stable2-20.03_LTS_SP3/docs/zh/docs/A-Ops/da-tool%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C.md)|1. 安装、配置和运行应用程序<br>2. 分析结果说明<br>3. 使用注意事项|已发布|
+|da-tool设计文档|1. 技术原理<br> 2. 开发指南 |暂未发布|
-### 注意事项
-+ 配置注意事项
- + 配置`/etc/da-tool.conf` 时,注意所配置符号一定存在
- + 某些函数名可能存在点(eg:A.B.C),暂**不支持配置此类函数**例如经过gcc优化选项`-fipa-sra`优化后,函数符号后缀会有`.rsra.num`。
- + 应用程序名也不要有点,建议函数和应用程序**不要包含特殊符号**
- + 某些函数可能短时间执行大量次数,此时`trace`很大,解析时间会很长,需要认为评估配置的函数运行情况,合理设置采样时间
- + 由于`trace`可能存在不完整的调用关系,很有可能在`trace`中存在的数据分析时舍弃如果单次采样没有抓到需要的pid信息建议多采样几次
- + 有时`trace`中会有数据丢失,结果可能异常,常见的异常原因为`trace`过大,内核刷新数据时不正常,比如会出现同一个函数只有返回时间没有进入时间的现象,建议减小采样时间。
- + 不支持递归函数
-+ 本工具单个CPU所使用的跟踪缓存`RingBuffer`大小为 `40960kb` ,当单核的`trace`大小接近此值时数据可能异常,进而导致分析结果错误。
-+ 确保`trace` 中有需要采集的函数的完整调用栈
--
2.33.0