Skip to content
GitLab
Explore
Projects
Groups
Topics
Snippets
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
educg-net-22022-2210132
proj292-XUPT-SwardArtOnline-10
Commits
71cf6ea1
Unverified
Commit
71cf6ea1
authored
11 months ago
by
赵嘉豪
Browse files
Options
Download
Patches
Plain Diff
[Update] ML理论
parent
b35eea12
main
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
README.md
+58
-43
README.md
doc/xgboost原理.md
+1
-1
doc/xgboost原理.md
with
59 additions
and
44 deletions
+59
-44
README.md
+
58
−
43
View file @
71cf6ea1

# 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
-
**进程上下文的其他区域**
,只有这里支持抢占调度! √
-
**进程上下文的其他区域**
,只有这里支持抢占调度! √

-
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_t
和
rwlock_t保护的临界区现在变得可以被抢占:临界区抢占
2.
中断线程化:Preempt-RT在内核线程上下文中处理中断:中断处理线程化
1.
重新实现
rt_mutex
使内核里的
spinlock
可被抢占。以前被
spinlock_t
和
rwlock_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

**开发框架**
:
`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
)
-
选择
`抢占模型`

!
[
a919ad15b512c19dbddfb5acbdd685d.png
](
https://img2.imgtp.com/2024/05/29/qeAdYZh0.png
)
-
编译内核

!
[
80ed9407a8246edc320d1d9a96e294d.png
](
https://img2.imgtp.com/2024/05/29/8TBgBgSE.png
)
-
`cyclictest`
验证新内核

!
[
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.部署测试
This diff is collapsed.
Click to expand it.
doc/xgboost原理.md
+
1
−
1
View file @
71cf6ea1
...
...
@@ -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_
\m
athrm{i}$表示真实值,$
\h
at{y}_i$表示预测值。加号后项为正则项,到后面再看$
\O
mega$这个函数的具体形式。我们现在只需要知道$
\O
mega$的自变量为$f_k$ ,是决策树,而不是向量,所以是没有办法用和导数有关的方法来训练的(像梯度下降等)。
Boosting 是指
$$
\h
at{y}_{i}^{(0)}=0
\q
uad(
\t
ext{公式 4.2.2})
\l
eftrightarrow
$$
$$
\h
at{y}_{i}^{(0)}=0
\q
uad(
\t
ext{公式 4.2.2})$$
$$
\h
at{y}_{i}^{(1)}=f_{1}(x
*{i})=\hat{y}*
{i}^{(0)}+f
*{1}(x*
{i})
\q
uad (公式 4.2.3)$$
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Topics
Snippets