gpt4 book ai didi

Linux HZ 和公平调度时间片

转载 作者:IT王子 更新时间:2023-10-29 00:36:32 27 4
gpt4 key购买 nike

sched_fair.c 中有:

unsigned int sysctl_sched_latency = 5000000ULL //5m 

unsigned int sysctl_sched_min_granularity = 1000000ULL //1ms

我知道 Linux 公平时间片根据 nr_running 和这个公平任务的相对权重而变化,但是通过代码研究,我想出了主要的想法是将时间片保持在 1 到 5 毫秒之间。如果我理解错误,请纠正我。我在这里一定是错的,但我就是想不通怎么办!

还知道 HZ,或每秒系统节拍数,或每秒定时器中断数,对于 arm 机器(以及大多数非桌面机器)通常为 200 或 100,这给了我们 5 到10 毫秒滴答速率。

Timeslice 通过在 set_next_entity() 中启动 rq->hrtick_timer 来运行,每次公平任务被安排运行,并在超时时调用 resched_task()回调函数 hrtick()。此计时器只是排队计时器之一,由计时器 irq 处理程序在每次滴答时处理,timer_tick()...run_local_timer()。似乎没有其他隐藏的 secret 。

那我们如何才能得到小于 5 毫秒的时间片呢?请帮助我理解这一点。非常感谢!

最佳答案

正如 Robert Love 的 Linux 内核开发中所述,缩短时间片的唯一方法是增加正在运行的进程(或优先级低于其他进程的进程)的数量。

运行进程数量的增加需要缩短时间片以保证适当的目标延迟(但时间片的下限是最小粒度)。但是不能保证在给定的时间片内进程会被抢占。这是因为时间核算是由定时器中断驱动的。

HZ 的值越大,定时器中断发生的频率越高,时间计算越宝贵,重新调度的频率就越高。


vruntime 变量存储进程的虚拟运行时间,它是由可运行进程的数量归一化的实际运行时间。在理想的多任务系统上,所有进程的 vruntime 都是相同的——所有任务都将获得平等、公平的处理器份额。

通常,时间片是目标延迟除以正在运行的进程数。但是当运行的进程数接近无穷大时,时间片接近 0。由于这最终会导致 Not Acceptable 切换成本,因此 CFS 对分配给每个进程的时间片施加了一个下限。这个下限称为最小粒度。所以时间片是 sysctl_sched_latencysysctl_sched_granularity 之间的值。 (参见 sched_timeslice())

vruntime 变量由 update_curr() 管理。 update_curr() 由系统计时器定期调用,并且每当进程变得可运行或阻塞,变得不可运行时也会调用。

为了驱动任务之间的抢占,hrtick() 在每次定时器中断时调用 task_tick_fair(),后者又调用 entity_tick()entity_tick()调用update_curr()更新进程vruntime,然后调用check_preempt_tick()check_preempt_tick() 检查当前运行时间是否大于理想运行时间(时间片),如果是,则调用 resched_task(),设置 TIF_NEED_RESCHED 标志。

TIF_NEED_RESCHED 被设置时,schedule() 会在最近的可能时刻被调用。

因此,随着 HZ 值的增加,定时器中断发生的频率更高,导致更宝贵的时间计算,并允许调度程序更频繁地重新安排任务。

关于Linux HZ 和公平调度时间片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12304246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com