mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-19 00:46:31 +00:00
Merge branch 'master' into feat-network-rebuild
Signed-off-by: longjin <longjin@DragonOS.org>
This commit is contained in:
@ -10,4 +10,4 @@
|
||||
:maxdepth: 2
|
||||
|
||||
namespaces/index
|
||||
filesystem/unionfs/index
|
||||
../filesystem/unionfs/index
|
||||
|
@ -1,5 +1,5 @@
|
||||
====================================
|
||||
名称空间
|
||||
命名空间
|
||||
====================================
|
||||
|
||||
DragonOS的namespaces目前支持pid_namespace和mnt_namespace 预计之后会继续完善
|
||||
|
@ -1,10 +1,10 @@
|
||||
# 挂载名称空间
|
||||
# 挂载命名空间
|
||||
|
||||
## 底层架构
|
||||
|
||||
pcb -> nsproxy -> mnt_namespace
|
||||
|
||||
每一个挂载文件系统都有自立独立的挂载点,表现在数据结构上是一个挂载的红黑树,每一个名称空间中挂载是独立的,所以文件系统的挂载和卸载不会影响别的
|
||||
每一个挂载文件系统都有自立独立的挂载点,表现在数据结构上是一个挂载的红黑树,每一个命名空间中挂载是独立的,所以文件系统的挂载和卸载不会影响别的
|
||||
|
||||
## 系统调用接口
|
||||
|
||||
@ -14,6 +14,6 @@ pcb -> nsproxy -> mnt_namespace
|
||||
- unshare
|
||||
- 使用 CLONE_NEWPID 标志调用 unshare() 后,后续创建的所有子进程都将在新的命名空间中运行。
|
||||
- setns
|
||||
- 将进程加入到指定的名称空间
|
||||
- 将进程加入到指定的命名空间
|
||||
- chroot
|
||||
- 将当前进程的根目录更改为指定的路径,提供文件系统隔离。
|
@ -1,8 +1,10 @@
|
||||
# 进程名称空间
|
||||
# 进程命名空间
|
||||
:::{note} 本文作者:操丰毅 1553389239@qq.com
|
||||
|
||||
2024年10月30日 :::
|
||||
pid_namespace 是内核中的一种名称空间,用于实现进程隔离,允许在不同的名称空间中运行的进程有独立的pid试图
|
||||
2024年10月30日
|
||||
:::
|
||||
|
||||
pid_namespace 是内核中的一种命名空间,用于实现进程隔离,允许在不同的命名空间中运行的进程有独立的pid视图
|
||||
|
||||
## 底层架构
|
||||
|
||||
|
@ -9,3 +9,4 @@
|
||||
|
||||
traceback
|
||||
debug-kernel-with-gdb
|
||||
profiling-kernel-with-dadk
|
||||
|
95
docs/kernel/debug/profiling-kernel-with-dadk.md
Normal file
95
docs/kernel/debug/profiling-kernel-with-dadk.md
Normal file
@ -0,0 +1,95 @@
|
||||
# 使用DADK对内核进行性能分析
|
||||
|
||||
## 1. 概述
|
||||
|
||||
本文将教你使用DADK,对DragonOS内核进行性能分析,以识别和解决潜在的性能瓶颈。
|
||||
|
||||
### 1.1 准备工作
|
||||
|
||||
::: {note}
|
||||
在开始之前,请确保你已经安装了DADK,并且已经配置好了DragonOS内核的编译环境。
|
||||
:::
|
||||
|
||||
### 1.2 什么是火焰图?
|
||||
|
||||
如果你没有听说过火焰图,可以先阅读这篇文章:[《如何读懂火焰图?- 阮一峰》](https://www.ruanyifeng.com/blog/2017/09/flame-graph.html)
|
||||
|
||||
简单的说,火焰图是基于性能采样结果产生的 SVG 图片,用来展示 CPU 的调用栈。
|
||||
|
||||

|
||||
|
||||
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
|
||||
|
||||
火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
|
||||
|
||||
颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
|
||||
|
||||
## 2. 配置DragonOS内核
|
||||
|
||||
由于性能分析需要详尽的符号表数据,因此我们需要在编译内核时,需要进行以下配置:
|
||||
|
||||
在`kernel/Cargo.toml`中的`[profile.release]`部分,设置以下两项:
|
||||
|
||||
```toml
|
||||
[profile.release]
|
||||
debug = true
|
||||
opt-level = 1
|
||||
```
|
||||
|
||||
这样,编译出来的内核就会包含符号表数据,方便我们进行性能分析。
|
||||
|
||||
## 3. 使用DADK进行性能分析
|
||||
|
||||
### 3.1 启动内核
|
||||
|
||||
首先,我们需要启动DragonOS内核。
|
||||
|
||||
```shell
|
||||
# 使用你喜欢的方式启动内核,例如:
|
||||
make run
|
||||
# 或者
|
||||
make build && make qemu-nographic
|
||||
```
|
||||
|
||||
### 3.2 运行你的工作负载
|
||||
|
||||
在启动内核后,我们需要运行一些工作负载,以便进行性能分析。
|
||||
|
||||
这可以是一个应用程序,也可以是别的东西。甚至你可以什么都不运行,只是单纯看看DragonOS内核在空闲时的调用栈情况。
|
||||
|
||||
### 3.3 启动DADK进行性能分析
|
||||
|
||||
在DragonOS项目目录下,运行以下命令:
|
||||
|
||||
```shell
|
||||
dadk profile sample --format flamegraph --output flame.svg --interval 200ms --duration 20s --cpu-mask 0x1
|
||||
```
|
||||
|
||||
上面的命令,将会对DragonOS内核进行性能分析,并生成一个火焰图。
|
||||
|
||||
详细解释:
|
||||
|
||||
- `--format flamegraph`:指定输出格式为火焰图。
|
||||
- `--output flame.svg`:指定输出文件名为`flame.svg`。
|
||||
- `--interval 200ms`:指定采样间隔为200ms。
|
||||
- `--duration 20s`:指定采样时间为20s。
|
||||
- `--cpu-mask 0x1`:指定采样的CPU为0号CPU。(这是个按位掩码,也就是说,如果要采样0和1号CPU,那么cpu-mask为0x3)
|
||||
|
||||
*更多参数请参考`dadk profile sample --help`.*
|
||||
|
||||
::: {note}
|
||||
由于采样时会暂停vCPU,因此采样时间不宜过短,否则会影响系统的正常运行。
|
||||
:::
|
||||
|
||||
经过一段时间的等待,你将会得到一个`flame.svg`文件。
|
||||
|
||||
### 3.4 分析火焰图
|
||||
|
||||
使用浏览器打开`flame.svg`文件,你将会看到一个火焰图。
|
||||
|
||||
你可以通过点击火焰图中的某个函数,来查看它的调用栈。
|
||||
|
||||
**你可以右键下面的图片,在新的标签页打开,体验交互效果。**
|
||||
|
||||

|
||||
|
@ -13,3 +13,6 @@ musl-gcc -static -o hello hello.c
|
||||
|
||||
在移植现有程序时,可能需要配置`CFLAGS`和`LDFLAGS`,以及`CPPFLAGS`,以便正确地编译,具体请以实际为准。
|
||||
|
||||
## 配置dadk
|
||||
|
||||
请参考:[Quick Start | DADK](https://docs.dragonos.org.cn/p/dadk/user-manual/quickstart.html)
|
@ -8,3 +8,5 @@
|
||||
|
||||
rust-quick-start
|
||||
c-cpp-quick-start
|
||||
快速使用DADK打包一个应用到DragonOS <https://docs.dragonos.org.cn/p/dadk/user-manual/quickstart.html>
|
||||
DADK完整文档 <https://docs.dragonos.org.cn/p/dadk/>
|
||||
|
@ -2,19 +2,14 @@
|
||||
|
||||
## 编译环境
|
||||
|
||||
  DragonOS与Linux具有部分二进制兼容性,因此可以使用Linux的Rust编译器进行编译,但是需要进行一些配置:
|
||||
|
||||
您可以参考DragonOS的`tools/bootstrap.sh`中,`initialize_userland_musl_toolchain()`函数的实现,进行配置。
|
||||
或者,只要运行一下bootstrap.sh就可以了。
|
||||
|
||||
主要是因为DragonOS还不支持动态链接,但是默认的工具链里面,包含了动态链接解释器相关的代码,因此像脚本内那样,进行替换就能运行。
|
||||
  DragonOS与Linux具有部分二进制兼容性,因此可以使用Linux的Rust编译器进行编译。
|
||||
|
||||
## 配置项目
|
||||
|
||||
### 从模板创建
|
||||
|
||||
:::{note}
|
||||
该功能需要dadk 0.1.4及以上版本方能支持
|
||||
该功能需要dadk 0.2.0及以上版本方能支持。旧版的请参考历史版本的DragonOS文档。
|
||||
:::
|
||||
|
||||
1. 使用DragonOS的tools目录下的`bootstrap.sh`脚本初始化环境
|
||||
@ -30,7 +25,7 @@ cargo generate --git https://git.mirrors.dragonos.org/DragonOS-Community/Rust-Ap
|
||||
```
|
||||
|
||||
4. 使用`cargo run`来运行项目
|
||||
5. 在DragonOS的`user/dadk/config`目录下,使用`dadk new`命令,创建编译配置,安装到DragonOS的`/`目录下。
|
||||
5. 在DragonOS的`user/dadk/config`目录下,参考模版[userapp_config.toml](https://github.com/DragonOS-Community/DADK/blob/main/dadk-config/templates/config/userapp_config.toml),创建编译配置,安装到DragonOS的`/`目录下。
|
||||
(在dadk的编译命令选项处,请使用Makefile里面的`make install`配置进行编译、安装)
|
||||
6. 编译DragonOS即可安装
|
||||
|
||||
|
Reference in New Issue
Block a user