45

我正在寻找我的 Linux 内核的时间片(或量子)的值。

具体问题:

  • 是否有/proc公开此类信息的文件?
  • (或者)它在我的发行版的 Linux 标头中是否明确定义?
  • (或者)Linux API(可能是 sysinfo)的 C 函数是否公开了这个值?
4

5 回答 5

39

分配给特定进程的量程可能会有所不同

您可以通过调整sched_latency_nssched_min_granularity_ns来调整“slice” ,但请注意“slice”不是固定量。另请注意,CFS 抢占决策基于瞬时状态。一个任务可能已经收到了一个完整的(可变的)“切片”的 CPU 时间,但只有在更值得的任务可用时才会触发抢占,因此“切片”并不是您可能期望的“最大不间断 CPU 时间”是..但它有点相似。

这是因为完全公平的调度器,默认的 Linux 调度器,将处理器的一部分分配给一个进程,而不是一个固定的时间片。这意味着每个进程的时间片与当前负载成正比,并由进程的优先级值加权

对于使用 SCHED_RR 的专用实时进程,默认时间片在 Linux 内核中定义为RR_TIMESLICEinclude /linux/sched/rt.h

/*
 * default timeslice is 100 msecs (used only for SCHED_RR tasks).
 * Timeslices get refilled after they expire.
 */
#define RR_TIMESLICE            (100 * HZ / 1000)

您可以使用sched_rr_get_interval()获取特定 SCHED_RR 进程的 SCHED_RR 间隔。

于 2013-05-06T16:13:38.837 回答
35

CFS(这是进程的默认调度程序)没有固定的时间片,它是在运行时根据目标延迟 ( sysctl_sched_latency) 和正在运行的进程数计算的。时间片永远不能小于最小粒度 ( sysctl_sched_min_granularity)。

时间片将始终介于sysctl_sched_min_granularity和之间sysctl_sched_latency,默认分别为 0.75 毫秒和 6 毫秒,并在kernel/sched/fair.c中定义。

但实际时间片不会导出到用户空间。

于 2013-07-01T22:29:08.563 回答
11

SCHED_OTHER在进程(即在(默认)非实时循环分时策略下运行的那些)和进程之间接受的答案存在一些混淆SCHED_RR

和文件(用于调试目的,只有在内核配置了 时才可见sched_latency_ns)影响进程的调度。正如 Alexey Shmalko 的回答中所指出的,CFS 下的时间片不是固定的(并且不会导出到用户空间),并且将取决于内核参数和进程的 nice 值等因素。sched_min_granularity_nsCONFIG_SCHED_DEBUGSCHED_OTHER

sched_rr_get_interval()返回一个固定值,该值是SCHED_RR进程保证获得的量,除非它被抢占或阻塞。在传统 Linux 上,SCHED_RR时间间隔为 0.1 秒。从 Linux 3.9 开始,限制可以通过文件进行调整/proc/sys/kernel/sched_rr_timeslice_ms,其中量子表示为毫秒值,默认值为 100。

于 2015-06-25T13:11:54.067 回答
9

我试图用谷歌搜索这个问题与 Linux 中时间片的相同疑问SCHED_RR,但我没有从这里和内核的源代码中得到明确的答案。

经过进一步检查,我发现关键是RR_TIMESLICEjiffies 中的默认时间片,而不是毫秒!SCHED_RR因此,无论HZ您配置了什么,默认时间片始终为 100 毫秒。

与 的值相同/proc/sys/kernel/sched_rr_timeslice_ms,输入值以毫秒为单位,但它以jiffies的形式存储和输出!

所以,当你CONFIG_HZ=100设置好后,你会发现:

# echo 100 > /proc/sys/kernel/sched_rr_timeslice_ms
# cat /proc/sys/kernel/sched_rr_timeslice_ms
10

有点糊涂,希望能帮助你理解!

于 2016-11-28T05:48:12.777 回答
5

sysctl用于在运行时读取和写入内核参数。可用的参数列在下面/proc/sys/。此外,Linux 3.9 添加了一种用于调整(和查看)SCHED_RR量程的新机制:/proc/sys/kernel/sched_rr_timeslice_ms 文件将量程公开为毫秒值,默认值为 100。将 0 写入此文件会将量程重置为默认值。所以你可能想尝试:

sysctl kernel.sched_rr_timeslice_ms
于 2019-04-10T18:10:34.477 回答