【Linux 内核】实时调度类 ② ( 实时调度实体 sched_rt_entity 源码分析 | run_list、timeout、watchdog_stamp、time_slice 字段 )

本文深入剖析Linux内核源码中的实时调度实体`sched_rt_entity`结构体,涵盖run_list、timeout、watchdog_stamp、time_slice等关键字段,解析其在实时进程调度中的作用,帮助理解Linux内核的实时调度机制。





一、sched_rt_entity 源码分析



上一篇博客 【Linux 内核】实时调度类 ① ( 进程分类 | 实时进程、普通进程 | Linux 内核 SCHED_FIFO、SCHED_RR 调度策略 | 实时调度实体 sched_rt_entity ) 引入了 实时调度实体 sched_rt_entity 结构体源码 , 在 Linux 内核源码的 linux-5.6.18\include\linux\sched.h 头文件中 ;

下面开始分析该 实时调度实体 sched_rt_entity 结构体源码 ;


sched_rt_entity 结构体 表示 " 实时调度实体 " 类型 ;


1、run_list 字段


sched_rt_entity 结构体的 run_list 字段 , 是用于将 " 实时调度实体 " 加入到 优先级队列 中的 ;

struct list_head		run_list;

2、timeout 字段


sched_rt_entity 结构体的 timeout 字段 , 用于 设置 调度 超时时间 ;

unsigned long			timeout;

3、watchdog_stamp 字段


sched_rt_entity 结构体的 watchdog_stamp 字段 , 用于 记录 jiffies 的值 ;

unsigned long			watchdog_stamp;

4、time_slice 字段


sched_rt_entity 结构体的 time_slice 字段 , 表示 时间片 ;

unsigned int			time_slice;

5、back 字段


sched_rt_entity 结构体的 back 字段 , 用于 由上到下 连接 " 实时调度实体 " ;

struct sched_rt_entity		*back;

6、parent 字段


sched_rt_entity 结构体的 parent 字段 , 指向 父类 " 实时调度实体 " ;

struct sched_rt_entity		*parent;

7、rt_rq 字段


sched_rt_entity 结构体的 rt_rq 字段 , 表示 " 实时调度实体 " 所属的 " 实时运行队列 " ;

	/* rq on which this entity is (to be) queued: */
	struct rt_rq			*rt_rq;

8、my_q 字段


sched_rt_entity 结构体的 my_q 字段 , 表示 " 实时调度实体 " 所拥有的 " 实时运行队列 " , 用于管理 " 子任务 " ;

	/* rq "owned" by this entity/group: */
	struct rt_rq			*my_q;




二、总结



实时调度实体 sched_rt_entity 源码注释 :

struct sched_rt_entity {
	struct list_head		run_list; 		// 用于将 " 实时调度实体 " 加入到 优先级队列 中的
	unsigned long			timeout; 		// 用于 设置 调度 超时时间
	unsigned long			watchdog_stamp;	// 用于 记录 jiffies 的值
	unsigned int			time_slice;		// 时间片
	unsigned short			on_rq;			
	unsigned short			on_list;

	struct sched_rt_entity		*back;		// 用于 由上到下 连接 " 实时调度实体 "
#ifdef CONFIG_RT_GROUP_SCHED
	struct sched_rt_entity		*parent;	// 指向 父类 " 实时调度实体 "
	/* rq on which this entity is (to be) queued: */
	struct rt_rq			*rt_rq;			// 表示 " 实时调度实体 " 所属的 " 实时运行队列 " 
	/* rq "owned" by this entity/group: */
	struct rt_rq			*my_q; // 表示 " 实时调度实体 " 所拥有的 " 实时运行队列 " , 用于管理 " 子任务 "
#endif
} __randomize_layout;
<think>我们正在讨论如何调整Linux内核实时调度参数,特别是`sched_rt_runtime_us`参数。根据引用[1]和引用[2],我们可以知道`sched_rt_runtime_us`的含义以及调整方法。 引用[1]说明了`sched_rt_runtime_us`的含义:它定义了在`sched_rt_period_us`周期内,所有实时进程可以使用的最大CPU时间。通常设置为小于周期值(比如周期为1秒,即1000000微秒,运行时间设置为950000微秒),表示实时进程最多可以使用95%的CPU时间。如果设置为-1,则表示禁用实时进程的CPU带宽限制,允许实时进程使用100%的CPU时间。 调整方法: 这些参数是sysctl参数,位于`/proc/sys/kernel/`目录下。因此,我们可以使用sysctl命令临时调整,或者通过修改sysctl配置文件永久调整。 步骤: 1. 临时调整(重启后失效): 使用sysctl命令或直接写入proc文件系统。 例如,将实时进程的运行时间限制设置为950000微秒(0.95秒): ```bash sudo sysctl -w kernel.sched_rt_runtime_us=950000 ``` 或者: ```bash echo 950000 | sudo tee /proc/sys/kernel/sched_rt_runtime_us ``` 如果要禁用限制(允许实时进程使用100%的CPU时间): ```bash sudo sysctl -w kernel.sched_rt_runtime_us=-1 ``` 2. 永久调整: 需要修改sysctl配置文件,例如`/etc/sysctl.conf`或`/etc/sysctl.d/`目录下的文件。 在文件中添加或修改以下行: ```bash kernel.sched_rt_runtime_us = 950000 ``` 或者禁用限制: ```bash kernel.sched_rt_runtime_us = -1 ``` 保存后,运行以下命令使配置生效: ```bash sudo sysctl -p ``` 注意事项: - 修改这些参数需要root权限。 - 调整这些参数会影响实时进程的调度。如果设置不当(比如将运行时间设置得过大或禁用限制),可能会导致普通进程(非实时进程)无法获得足够的CPU时间,从而影响系统整体响应。 - 在禁用限制(设置为-1)时,实时进程将完全占用CPU,普通进程可能被饿死(得不到运行)。因此,只有在确定实时进程不会一直运行(比如会有阻塞)或者系统是专用实时系统的情况下才建议禁用。 另外,引用[2]提到,对于实时调度策略(如`SCHED_FIFO`和`SCHED_RR`)的进程,调整这些参数非常重要。尤其是在需要确保实时进程获得足够CPU时间的场景。 引用[1]还提到,与`sched_rt_runtime_us`相关的另一个参数是`sched_rt_period_us`,它定义了周期长度,默认是1秒(1000000微秒)。如果需要调整周期,也可以类似地通过sysctl调整。 例如,调整周期为500000微秒(0.5秒): ```bash sudo sysctl -w kernel.sched_rt_period_us=500000 ``` 但注意,调整周期可能会影响实时进程的调度粒度,需谨慎。 总结:通过sysctl工具可以调整这些参数,临时调整立即生效但重启失效,永久调整需修改配置文件。 根据用户要求,生成相关问题: §§相关问题§§ 1. 调整`sched_rt_runtime_us`参数会对系统产生什么影响? 2. 如何监控实时进程的CPU使用情况? 3. 在多核系统中,实时调度参数是如何应用的?(例如,`sched_rt_runtime_us`是全局的还是每个CPU的?) </think>### 调整 Linux 内核实时调度参数的方法 在 Linux 系统中,调整实时调度参数(如 `sched_rt_runtime_us`)主要通过 **sysctl 接口**实现。以下是详细操作步骤: #### 1. **查看当前参数值** ```bash # 查看实时任务的时间配额 cat /proc/sys/kernel/sched_rt_runtime_us # 查看实时任务的时间周期 cat /proc/sys/kernel/sched_rt_period_us ``` 默认值通常为: - `sched_rt_period_us = 1,000,000`(1秒周期) - `sched_rt_runtime_us = 950,000`(实时任务最多占95% CPU时间)[^1] #### 2. **临时调整(重启失效)** ```bash # 允许实时任务使用100% CPU时间(解除限制) sudo sysctl -w kernel.sched_rt_runtime_us=-1 # 自定义时间配额(示例:允许80% CPU时间) sudo sysctl -w kernel.sched_rt_runtime_us=800000 ``` #### 3. **永久调整(需重启)** 编辑 `/etc/sysctl.conf` 文件: ```bash sudo nano /etc/sysctl.conf ``` 添加以下配置: ```conf # 禁用实时任务时间限制 kernel.sched_rt_runtime_us = -1 # 或设置自定义配额(示例:90% CPU时间) kernel.sched_rt_runtime_us = 900000 ``` 应用配置: ```bash sudo sysctl -p ``` #### 4. **参数解释** - **`sched_rt_runtime_us`** 在 `sched_rt_period_us` 周期内,实时任务可使用的最大 CPU 时间(单位:微秒)。 - 值 `-1`:禁用限制,实时任务可使用 100% CPU(需谨慎)[^1] - 值 `0`:完全禁止实时任务运行 - 正数值:配额比例(例如 950,000 = 95%) - **`sched_rt_period_us`** 实时任务调度的基准周期(默认 1,000,000 μs = 1秒)[^2] #### 5. **验证调整结果** ```bash # 检查实时任务CPU使用率 watch -n 1 "ps -eo pid,rtprio,cls,pcpu,cmd | grep 'FF\|RR'" # 监视调度延迟 sudo cyclictest -t1 -p80 -n -i 1000 -l 10000 ``` #### ▶ 注意事项 1. **权限要求**:需 `root` 权限修改 2. **系统稳定性**: - 设置 `-1` 可能导致普通任务饿死 - 生产环境建议保留至少 5% CPU 给非实时任务[^4] 3. **多核影响**:参数对系统中所有 CPU 核心生效 4. **实时性需求**:硬实时系统需配合 `PREEMPT_RT` 补丁[^3] > ⚠️ 修改后务必测试系统响应性,避免关键服务被阻塞。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值