1*e8b1db32SLoGin# 使用DADK对内核进行性能分析 2*e8b1db32SLoGin 3*e8b1db32SLoGin## 1. 概述 4*e8b1db32SLoGin 5*e8b1db32SLoGin本文将教你使用DADK,对DragonOS内核进行性能分析,以识别和解决潜在的性能瓶颈。 6*e8b1db32SLoGin 7*e8b1db32SLoGin### 1.1 准备工作 8*e8b1db32SLoGin 9*e8b1db32SLoGin::: {note} 10*e8b1db32SLoGin在开始之前,请确保你已经安装了DADK,并且已经配置好了DragonOS内核的编译环境。 11*e8b1db32SLoGin::: 12*e8b1db32SLoGin 13*e8b1db32SLoGin### 1.2 什么是火焰图? 14*e8b1db32SLoGin 15*e8b1db32SLoGin如果你没有听说过火焰图,可以先阅读这篇文章:[《如何读懂火焰图?- 阮一峰》](https://www.ruanyifeng.com/blog/2017/09/flame-graph.html) 16*e8b1db32SLoGin 17*e8b1db32SLoGin简单的说,火焰图是基于性能采样结果产生的 SVG 图片,用来展示 CPU 的调用栈。 18*e8b1db32SLoGin 19*e8b1db32SLoGin![](https://web-static2.dragonos.org.cn//longjin/flame2.svg?imageSlim) 20*e8b1db32SLoGin 21*e8b1db32SLoGinx 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。 22*e8b1db32SLoGin 23*e8b1db32SLoGin火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。 24*e8b1db32SLoGin 25*e8b1db32SLoGin颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。 26*e8b1db32SLoGin 27*e8b1db32SLoGin## 2. 配置DragonOS内核 28*e8b1db32SLoGin 29*e8b1db32SLoGin由于性能分析需要详尽的符号表数据,因此我们需要在编译内核时,需要进行以下配置: 30*e8b1db32SLoGin 31*e8b1db32SLoGin在`kernel/Cargo.toml`中的`[profile.release]`部分,设置以下两项: 32*e8b1db32SLoGin 33*e8b1db32SLoGin```toml 34*e8b1db32SLoGin[profile.release] 35*e8b1db32SLoGindebug = true 36*e8b1db32SLoGinopt-level = 1 37*e8b1db32SLoGin``` 38*e8b1db32SLoGin 39*e8b1db32SLoGin这样,编译出来的内核就会包含符号表数据,方便我们进行性能分析。 40*e8b1db32SLoGin 41*e8b1db32SLoGin## 3. 使用DADK进行性能分析 42*e8b1db32SLoGin 43*e8b1db32SLoGin### 3.1 启动内核 44*e8b1db32SLoGin 45*e8b1db32SLoGin首先,我们需要启动DragonOS内核。 46*e8b1db32SLoGin 47*e8b1db32SLoGin```shell 48*e8b1db32SLoGin# 使用你喜欢的方式启动内核,例如: 49*e8b1db32SLoGinmake run 50*e8b1db32SLoGin# 或者 51*e8b1db32SLoGinmake build && make qemu-nographic 52*e8b1db32SLoGin``` 53*e8b1db32SLoGin 54*e8b1db32SLoGin### 3.2 运行你的工作负载 55*e8b1db32SLoGin 56*e8b1db32SLoGin在启动内核后,我们需要运行一些工作负载,以便进行性能分析。 57*e8b1db32SLoGin 58*e8b1db32SLoGin这可以是一个应用程序,也可以是别的东西。甚至你可以什么都不运行,只是单纯看看DragonOS内核在空闲时的调用栈情况。 59*e8b1db32SLoGin 60*e8b1db32SLoGin### 3.3 启动DADK进行性能分析 61*e8b1db32SLoGin 62*e8b1db32SLoGin在DragonOS项目目录下,运行以下命令: 63*e8b1db32SLoGin 64*e8b1db32SLoGin```shell 65*e8b1db32SLoGindadk profile sample --format flamegraph --output flame.svg --interval 200ms --duration 20s --cpu-mask 0x1 66*e8b1db32SLoGin``` 67*e8b1db32SLoGin 68*e8b1db32SLoGin上面的命令,将会对DragonOS内核进行性能分析,并生成一个火焰图。 69*e8b1db32SLoGin 70*e8b1db32SLoGin详细解释: 71*e8b1db32SLoGin 72*e8b1db32SLoGin- `--format flamegraph`:指定输出格式为火焰图。 73*e8b1db32SLoGin- `--output flame.svg`:指定输出文件名为`flame.svg`。 74*e8b1db32SLoGin- `--interval 200ms`:指定采样间隔为200ms。 75*e8b1db32SLoGin- `--duration 20s`:指定采样时间为20s。 76*e8b1db32SLoGin- `--cpu-mask 0x1`:指定采样的CPU为0号CPU。(这是个按位掩码,也就是说,如果要采样0和1号CPU,那么cpu-mask为0x3) 77*e8b1db32SLoGin 78*e8b1db32SLoGin*更多参数请参考`dadk profile sample --help`.* 79*e8b1db32SLoGin 80*e8b1db32SLoGin::: {note} 81*e8b1db32SLoGin由于采样时会暂停vCPU,因此采样时间不宜过短,否则会影响系统的正常运行。 82*e8b1db32SLoGin::: 83*e8b1db32SLoGin 84*e8b1db32SLoGin经过一段时间的等待,你将会得到一个`flame.svg`文件。 85*e8b1db32SLoGin 86*e8b1db32SLoGin### 3.4 分析火焰图 87*e8b1db32SLoGin 88*e8b1db32SLoGin使用浏览器打开`flame.svg`文件,你将会看到一个火焰图。 89*e8b1db32SLoGin 90*e8b1db32SLoGin你可以通过点击火焰图中的某个函数,来查看它的调用栈。 91*e8b1db32SLoGin 92*e8b1db32SLoGin**你可以右键下面的图片,在新的标签页打开,体验交互效果。** 93*e8b1db32SLoGin 94*e8b1db32SLoGin![](https://web-static2.dragonos.org.cn//longjin/flame2.svg?imageSlim) 95*e8b1db32SLoGin 96