Unverified Commit 71cf6ea1 authored by 赵嘉豪's avatar 赵嘉豪
Browse files

[Update] ML理论

parent b35eea12
No related merge requests found
Showing with 59 additions and 44 deletions
+59 -44
![1716989665413.png](https://img2.imgtp.com/2024/05/29/cWE0dDs6.png)
# 1.题目:PROJ292
>题目:Linux内核实时性能瓶颈分析(在stress-ng压力测试条件下)
> 题目:Linux 内核实时性能瓶颈分析(在 stress-ng 压力测试条件下)
>
>内容:在实时计算领域,Linux内核的性能表现尤为关键。尽管Linux提供了PREEMPT RT补丁等增强实时性的手段,但在极端负载条件下,如使用stress-ng工具进行压力测试时,内核的实时性能瓶颈仍然显现。本项目旨在深入分析Linux内核在应对stress-ng压力测试时的实时性能瓶颈,识别关键的延迟源,并提出有效的优化措施。
> 内容:在实时计算领域,Linux 内核的性能表现尤为关键。尽管 Linux 提供了 PREEMPT RT 补丁等增强实时性的手段,但在极端负载条件下,如使用 stress-ng 工具进行压力测试时,内核的实时性能瓶颈仍然显现。本项目旨在深入分析 Linux 内核在应对 stress-ng 压力测试时的实时性能瓶颈,识别关键的延迟源,并提出有效的优化措施。
# 2.项目结构
```
├── LICENSE (开源协议)
├── README.md
......@@ -37,8 +40,8 @@
│ │ ├── loongarch
│ │ ├── powerpc
│ │ ├── riscv
│ │ └── x86
│ │
│ │ └── x86
│ │
│ └── xgboost(机器学习框架)
│ └── doc.md
|
......@@ -62,72 +65,74 @@
# 3.开发方案及思路
## 3.1理论学习:
> 详见本仓库全文:[Doc:RT-Patch理论学习记录](https://gitlab.eduxiji.net/T202411664993243/project2210132-239754/-/blob/main/doc/RT-Patch%E7%90%86%E8%AE%BA%E5%AD%A6%E4%B9%A0.pdf)
## 3.1 理论学习:
### 3.1.1 传统Linux
> 详见本仓库全文:[Doc:RT-Patch 理论学习记录](https://gitlab.eduxiji.net/T202411664993243/project2210132-239754/-/blob/main/doc/RT-Patch%E7%90%86%E8%AE%BA%E5%AD%A6%E4%B9%A0.pdf)
### 3.1.1 传统 Linux
标准的 Linux 并不是硬时操作系统,因为以下四类区间中只有一类支持[[抢占调度]]
标准的Linux并不是硬时操作系统,因为以下四类区间中只有一类支持[[抢占调度]]
- 中断 x
- 软中断 x
- 进程上下文的`spinlock` x
- **进程上下文的其他区域**,只有这里支持抢占调度! √
- **进程上下文的其他区域**,只有这里支持抢占调度! √
![1716991392228.png](https://img2.imgtp.com/2024/05/29/EF9m6Vbd.png)
- T3时刻系统唤醒了高优先级的RT task,但由于此时系统处于不可调度区域,所以RT task无法立即运行
- T5时刻,中断都结束,但spinlock仍然没有释放,系统仍然处于不可调度区域
- T6时刻,spinlock释放,高优先级的RT task立马得到调度
从T1到T6,这个区间的时间是不可预测的,所以通用的Linux系统无法达到硬实时的标准。
- T3 时刻系统唤醒了高优先级的 RT task,但由于此时系统处于不可调度区域,所以 RT task 无法立即运行
- T5 时刻,中断都结束,但 spinlock 仍然没有释放,系统仍然处于不可调度区域
- T6 时刻,spinlock 释放,高优先级的 RT task 立马得到调度
从 T1 到 T6,这个区间的时间是不可预测的,所以通用的 Linux 系统无法达到硬实时的标准。
### 3.1.2 RT-patch改进
### 3.1.2 RT-patch 改进
> 两种思路:
>
> 1. 双内核法
> 2. **修改内核代码**:通过打补丁的方式,对内核的进程调度、中断服务程序等代码进行修改与优化,提高系统的实时性能,最出名的就是Preempt-RT补丁
> 2. **修改内核代码**:通过打补丁的方式,对内核的进程调度、中断服务程序等代码进行修改与优化,提高系统的实时性能,最出名的就是 Preempt-RT 补丁
- 原理:
最小化内核中不可抢占部分的代码,同时将为支持抢占性必须要修改的代码量最小化。对`临界区``中断处理函数`等代码进行抢占改进
最小化内核中不可抢占部分的代码,同时将为支持抢占性必须要修改的代码量最小化。对`临界区``中断处理函数`等代码进行抢占改进
1. 重新实现rt_mutex使内核里的spinlock可被抢占。以前被spinlock_trwlock_t保护的临界区现在变得可以被抢占:临界区抢占
2. 中断线程化:Preempt-RT在内核线程上下文中处理中断:中断处理线程化
1. 重新实现 rt_mutex 使内核里的 spinlock 可被抢占。以前被 spinlock_trwlock_t 保护的临界区现在变得可以被抢占:临界区抢占
2. 中断线程化:Preempt-RT 在内核线程上下文中处理中断:中断处理线程化
3. 为内核里的自旋锁(spinlock)和信号量(semaphore)实现优先级继承(PI-Priority Inheritance)
### 3.1.3 总结
- **抢占调度**
**区域:**
**区域:**
1. 中断
2. 软中断
3. 进程上下文的spinlock
3. 进程上下文的 spinlock
4. 进程上下文的其他区域
一般server仅在 **4. 进程上下文的其他区域** 支持抢占
- **优化方向**
1.中断线程化(内核线程)
2.spinlock临界区抢占(拥锁进程优先级继承)
3.硬件(如Cortex R系列)
一般 server 仅在 **4. 进程上下文的其他区域** 支持抢占
- **优化方向** 1.中断线程化(内核线程)
2.spinlock 临界区抢占(拥锁进程优先级继承) 3.硬件(如 Cortex R 系列)
## 3.2 技术路线
**技术方案**:eBPF Kprobe Hook进行数据获取 +xgBoost进行实时瓶颈根因判断。
**机器环境**:Linux Kernel 5.15.159 && RT-Patch Linux Kenel 5.15.158
**技术方案**:eBPF Kprobe Hook 进行数据获取 +xgBoost 进行实时瓶颈根因判断。
**机器环境**:Linux Kernel 5.15.159 && RT-Patch Linux Kenel 5.15.158
![99b83149b794c97b7e507f4f7b46876.png](https://img2.imgtp.com/2024/05/29/IC1vXoxt.png)
**开发框架**`bpftrace` / `libbpf-bootstrap` + `xgBoost` with C API.
**开发框架**`bpftrace` / `libbpf-bootstrap` + `xgBoost` with C API.
**环境依赖**`CONFIG_DEBUG_BTF_INFO=y`,`CONFIG_BPF=y...(BPF/eBPF相关config)`.
- 开发思路
1. **数据获取**: 阅读PREEMPT_RT补丁实现原理,并基于实现原理进行上下文的相关内核函数进行Hook,以达到数据获取。
2. **数据分析处理**:结合Hook到的关键点数据,进行数据清洗、数据整理、数据分析、数据标注,根据不同的表现和火焰时间长度来进行标注,投喂xgBoost进行小模型训练。
3. **模型部署**: 在运行本工具时,实时监控关键指标,并由xgboost进行实时关键瓶颈判断,以给出解决方案
## 3.3 环境准备
1. **数据获取**: 阅读 PREEMPT_RT 补丁实现原理,并基于实现原理进行上下文的相关内核函数进行 Hook,以达到数据获取。
2. **数据分析处理**:结合 Hook 到的关键点数据,进行数据清洗、数据整理、数据分析、数据标注,根据不同的表现和火焰时间长度来进行标注,投喂 xgBoost 进行小模型训练。
3. **模型部署**: 在运行本工具时,实时监控关键指标,并由 xgboost 进行实时关键瓶颈判断,以给出解决方案
4. **在线训练**:根据实时监控的数据,进行实时的 xgBoost 模型训练,在线更新模型,使模型的参数更加符合实际情况,以达到更好的预测效果。
## 3.3 环境准备
- 打入补丁
`RT-Patch`链接:[wiki.linuxfoundation-RealTime](https://wiki.linuxfoundation.org/realtime/preempt_rt_versions)
`RT-Patch`链接:[wiki.linuxfoundation-RealTime](https://wiki.linuxfoundation.org/realtime/preempt_rt_versions)
```shell
gnuzip patch-xxx-rt-xx
......@@ -135,22 +140,32 @@ patch -p1 < patch-xxx-rt-xx
```
- 进入`Menuconfig`界面:
![0a449252f7f12b92de34c0a7f9b24ad.png](https://img2.imgtp.com/2024/05/29/NABkoSDs.png)
![0a449252f7f12b92de34c0a7f9b24ad.png](https://img2.imgtp.com/2024/05/29/NABkoSDs.png)
- 选择`抢占模型`
![a919ad15b512c19dbddfb5acbdd685d.png](https://img2.imgtp.com/2024/05/29/qeAdYZh0.png)
![a919ad15b512c19dbddfb5acbdd685d.png](https://img2.imgtp.com/2024/05/29/qeAdYZh0.png)
- 编译内核
![80ed9407a8246edc320d1d9a96e294d.png](https://img2.imgtp.com/2024/05/29/8TBgBgSE.png)
![80ed9407a8246edc320d1d9a96e294d.png](https://img2.imgtp.com/2024/05/29/8TBgBgSE.png)
- `cyclictest`验证新内核
![7de4c132c513d5482d611922728c87a.jpg](https://img2.imgtp.com/2024/05/29/AJgklJfQ.jpg)
![7de4c132c513d5482d611922728c87a.jpg](https://img2.imgtp.com/2024/05/29/AJgklJfQ.jpg)
## 3.4 内核函数选点
- [Doc:观测点选择](https://gitlab.eduxiji.net/T202411664993243/project2210132-239754/-/blob/main/doc/%E8%A7%82%E6%B5%8B%E7%82%B9%E9%80%89%E6%8B%A9.md)
- [Doc:结构体及函数评估](https://gitlab.eduxiji.net/T202411664993243/project2210132-239754/-/blob/main/doc/%E7%BB%93%E6%9E%84%E4%BD%93%E5%8F%8A%E5%87%BD%E6%95%B0%E8%AF%84%E4%BC%B0.md)
## 3.5 机器学习实践
- [Doc:xgboost 官方文档](https://xgboost.readthedocs.io/en/stable/)
- [Doc:xgboost 原理](https://gitlab.eduxiji.net/T202411664993243/project2210132-239754/-/blob/main/doc/xgboost%E5%8E%9F%E7%90%86.md)
- 机器学习方案设计
![](https://cdn.studyinglover.com/pic/2024/05/0d6f9c9454a6e0ce5cc17f476cc2b7e3.png)
# 4.开发报告
# 5.部署测试
\ No newline at end of file
# 5.部署测试
......@@ -18,7 +18,7 @@ $$obj=\sum_{i=1}^n\:\mathcal{L}(y_i,\hat{y}_i)+\sum\Omega(f_k),f_k\in\mathcal{F}
上面的两项加号前项为在训练集上的损失函数。其中 $y_\mathrm{i}$表示真实值,$\hat{y}_i$表示预测值。加号后项为正则项,到后面再看$\Omega$这个函数的具体形式。我们现在只需要知道$\Omega$的自变量为$f_k$ ,是决策树,而不是向量,所以是没有办法用和导数有关的方法来训练的(像梯度下降等)。
Boosting 是指
$$\hat{y}_{i}^{(0)}=0\quad(\text{公式 4.2.2})\leftrightarrow $$
$$\hat{y}_{i}^{(0)}=0\quad(\text{公式 4.2.2})$$
$$\hat{y}_{i}^{(1)}=f_{1}(x*{i})=\hat{y}*{i}^{(0)}+f*{1}(x*{i}) \quad (公式 4.2.3)$$
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment