556|0

220

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

奔跑吧Linux内核+进程调度与负载计算 [复制链接]

Linux内核中进程优先级、nice值、权重(weight)以及它们之间的关系。Linux内核使用一套复杂的调度机制来管理进程的执行,其中进程的优先级和权重是调度决策的关键因素。

首先,关于进程的优先级和nice值:

  • 进程的优先级是一个数值,范围从0到139。数值越低,优先级越高。
  • 优先级0到99是为实时进程保留的,而100到139是为普通进程使用的。
  • nice值是一个传统的用户空间变量,它映射到普通进程的优先级范围(100到139)。nice值的范围是-20到19,其中默认值为0。
  • nice值越高,进程的优先级越低,反之亦然。每增加或减少一个nice级别,进程获得的CPU时间将相应减少或增加约10%。

接下来,关于权重(weight)和load_weight数据结构:

  • 内核使用load_weight数据结构来记录调度实体的权重信息。这个结构包含weight和inv_weight两个字段。
  • weight字段表示调度实体的权重。对于进程来说,这个权重与nice值相关,并可以通过查表的方式快速获取。
  • inv_weight字段是权重的倒数或某种中间计算结果,用于优化后续的计算。

关于查表方式获取权重:

  • 内核预先计算了一个名为sched_prio_to_weight的表,该表的下标对应nice值-20到19。通过查表方式,内核可以快速获取与给定nice值对应的权重值。
  • 查表方式是一种高效的优化手段,因为它避免了在运行时进行复杂的计算。相比于编写一个函数来计算权重,查表方式通常更快。

最后,关于Con Kolivus和BFS调度器:

  • Con Kolivus是Linux内核社区中的一位传奇开发者,尽管他的主业是麻醉师,但他在内核开发中取得了显著的成就。
  • 他关注用户体验的提升,并设计了相当不错的调度器算法。尽管这些算法最终没有被社区采纳,但他后来设计了一款名为BFS(Brain Fuck Scheduler)的调度器,这在某些场景下可能具有其独特的优势。

 

 

vruntime 是一个关键概念,在 Linux 的 CFS(完全公平调度器,Completely Fair Scheduler)中扮演着重要角色。CFS 是 Linux 内核中用于普通进程的默认调度器,它的设计目标是确保所有进程公平地分享 CPU 时间。

vruntime(虚拟运行时间)是一个用于比较不同进程应该运行多久的度量。在CFS中,vruntime 不直接对应于真实时间,而是根据进程的权重和已经运行的时间来动态计算。进程的权重越高(即 nice 值越低),其 vruntime 增长得越慢,意味着该进程相对于其他进程更有可能获得 CPU 时间。

当进程的 nice 值不为 0 时,其权重会发生变化,进而影响 vruntime 的计算。nice 值较小的进程(优先级较高)的 vruntime 增长较慢,因为它们有更高的权重;而 nice 值较大的进程(优先级较低)的 vruntime 增长较快,因为它们的权重较低。

关于您提到的计算公式,CFS 调度器确实使用了一些技巧来避免浮点数运算,因为浮点数运算在处理器上通常比整数运算要慢得多。inv_weight(权重的倒数)和 shift(移位值)是用来优化计算的参数。通过将权重和逆权重的乘法运算转换为乘法和移位运算,CFS 可以更高效地计算 vruntime。

calc_delta_fair() 函数是用来计算给定时间片(delta_exec)内进程应增加的 vruntime 的。如果进程的权重不是默认的 NICE_0_LOAD(对应于 nice 值为 0 的权重),则需要进行额外的计算来调整 delta_exec。

 

 

 

task_struct 是 Linux 内核中用于描述进程的主要数据结构。这个数据结构包含了进程的几乎所有信息,从进程的标识、状态、内存管理信息、文件系统信息、到调度信息等等。task_struct 实际上是一个相当复杂的数据结构,包含了大量的字段,用于记录和管理进程的各种属性和状态。

以下是一些 task_struct 中重要的字段和它们的基本用途:

  • pid: 进程的唯一标识符。
  • state: 进程状态,如运行、就绪、阻塞等。
  • mm: 指向进程内存描述符的指针,描述了进程的虚拟内存布局。
  • files: 指向进程打开文件的描述符数组。
  • fs: 指向进程文件系统信息的指针。
  • sighand: 指向进程信号处理的指针。
  • sched_class: 指向进程调度类的指针,决定了进程的调度策略。
  • se: 进程调度实体,包含了进程调度相关的所有信息。
  • comm: 进程的命令行名称。
  • parent: 指向父进程的指针。
  • children: 子进程的链表。
  • real_parent: 在某些情况下,如进程被其他进程通过 ptrace 系统调用跟踪时,这个字段指向真正的父进程。
  • start_time: 进程启动时间。
  • total_vm, vm_area_structs, vm_rss, rss_stat: 与进程内存使用相关的统计信息。

task_struct 结构体是内核调度器进行进程调度的核心数据结构,调度器通过修改 task_struct 中的调度相关字段来管理进程的执行。例如,调度器会更新进程的 se.vruntime 来反映进程的虚拟运行时间,从而决定下一个应该运行的进程。

 

 

在Linux内核的CFS(完全公平调度器)中,rq(运行队列,run queue)是一个关键的数据结构,用于管理等待CPU时间的进程。rq通常与CPU核心相关联,每个CPU核心都有自己的运行队列。这个数据结构包含了调度器在决策哪个进程应该运行时需要的信息。

rq数据结构中一些重要的成员包括:

  1. nr_running: 当前在rq上运行的或可运行的进程数量。这个值对于调度决策非常重要,因为它告诉调度器有多少进程是活跃的,需要被调度。

  2. cfs: 指向CFS调度类特定数据的指针。CFS调度类使用这些数据来跟踪进程的vruntime和其他与CFS调度相关的状态。

  3. nr_switches: 在这个rq上发生的上下文切换次数。这个统计信息对于性能分析和调试很有用。

  4. load: 表示rq上的负载情况。这个值通常与CPU的利用率有关,用于负载平衡和其他调度决策。

  5. tasks: 指向在rq上等待运行的进程的链表。这个链表包含了所有当前可运行的进程。

  6. idle: 一个标志,表示rq是否处于空闲状态(即没有进程在运行或等待运行)。

  7. clock: 用于跟踪时间的数据结构,用于计算进程的vruntime和其他与时间相关的调度指标。

  8. prev_task: 上一个在这个rq上运行的进程的指针。这个信息在上下文切换时很有用,因为它允许调度器知道哪个进程刚刚被替换。

  9. curr: 当前正在这个rq上运行的进程的指针。这个指针在调度器选择下一个要运行的进程时被更新。

  10. hrtick: 用于高精度计时器的数据结构,用于实现更精确的调度决策。

 

衡量一个CPU的负载并不是一个简单的任务,因为它涉及到多个因素,包括进程的数量、优先级、权重,以及进程对CPU的使用模式(例如,是否是CPU密集型或IO密集型)。在Linux系统中,有多种方式和工具可以用来衡量CPU的负载。

  1. 就绪队列的长度:虽然单独使用就绪队列的长度可能不够准确,但它仍然是一个有用的参考指标。较长的就绪队列可能意味着较高的潜在负载。
  2. 进程的优先级和权重:这些因素仍然对调度决策有重要影响,因此应该考虑在内。
  3. CPU使用率:如上所述,CPU使用率是一个重要的衡量指标,可以反映系统的实际工作情况。
  4. IO等待时间:IO密集型进程可能会导致CPU空闲,但仍然会对系统性能产生影响。因此,考虑IO等待时间也是重要的。
  5. 系统响应时间:系统的响应时间(例如,用户界面的响应速度)也是衡量负载的一个方面。

 

 

通过这种方式,我们不仅可以知道CPU的忙碌程度(通过运行时间与总时间的比例),还可以知道这种忙碌是由哪些进程(或优先级的组合)引起的。

将负载量化为权重使得不同运行行为的进程可以用一个统一的标准来衡量负载。例如,一个权重很高但运行时间很短的进程可能不会对整体负载产生太大影响,而一个权重较低但持续运行的进程可能会显著贡献到负载中。

 

 

此帖出自Linux开发论坛
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表