问题标签 [cfs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
84 浏览

c - 为什么空闲 CPU 没有分配给 linux 中的进程?

我有一个程序 P1 有 N (100) 个线程。最初,除了线程 0,所有线程都处于阻塞状态(使用信号量)。

我在程序 P1 中使用timer_create()创建了一个计时器(并且所有线程都使用相同的计时器),将计时器设置为间隔 T。当计时器间隔到期时,调用计时器处理程序将信号发送到下一个线程 i+1 以唤醒。

这是我的程序的工作方式

这很好用,我的所有线程都被计时器处理程序唤醒并以循环顺序运行。

我有另一个程序 P2 连续运行很长时间(所以 vruntime 非常高),甚至在 P1 开始运行并且 P2 与 P1 位于同一个 CPU 内核(所有线程)之前。

因此,当没有正在运行的线程时,P2 应该正在运行。

所以,我的期望是在 Step-1 线程 0 正在释放 CPU,P2 应该被调度并且当计时器到期并且在 Step-3 中下一个线程唤醒时,P2 应该根据 CFS 调度策略立即被抢占(因为唤醒线程的 vruntime 是与 P2 相比非常低)。这意味着,当所有线程都处于阻塞状态、CPU 空闲且下一个线程尚未唤醒时,我希望 P2 被安排在 Step1-Step3 、 Step3-Step5 之间。

为了获得上下文切换中涉及的所有进程,我在内核中进行了更改(kernel/sched/core.c并在 context_switch 函数中添加了以下打印语句)

这样我就可以获得所有已安排和取消安排的流程详细信息。根据以上信息,我计算了 P2 在每次运行中获得了多少时间才被抢占。

这是我的一些发现,我无法理解为什么?

  1. 在 CPU 频率 =2.2GHz 的情况下,如果我将定时器间隔设置为 1700ns 甚至更少,则 P2 不会在两个线程之间进行调度。为什么即使没有其他进程/线程正在运行并且 CPU 空闲 1700 ns 也没有调度 P2?

  2. CPU 频率 =3.4GHz 时,如果我将定时器间隔设置为 1000ns 甚至更少,则 P2 不会在两个线程之间进行调度。为什么即使没有其他进程正在运行并且 CPU 空闲 1000 ns,P2 也没有被调度?

不同的 CPU 频率和不同的定时器间隔,其他进程 P2 没有被调度?

CPU频率和定时器到期时间之间有什么关系吗?它与上下文切换时间有关吗?

我的最后一个问题 - 如果一个上下文切换正在进行中并且一个新的更高优先级的进程准备好,当前正在运行的上下文切换是否会完成,执行一段时间,然后安排下一个更高优先级的进程,或者它将停止当前的上下文切换并安排下一个更高优先级的进程?

我正在使用 Core-i7 @3.40 GHz,Ubuntu-16.04,cgroups 被禁用,P1 和 P2 在同一个终端中运行。cpupower 用于设置用户频率。

提前致谢。

0 投票
1 回答
43 浏览

javascript - cfs 集合在 react.component 中显示错误

我有用于文件上传的 cfs 集合。我已经在模板中使用了它并且它运行良好。现在我必须使用这个 react.component 但它显示这个错误Uncaught ReferenceError: fsFile is not defined。我添加了 FS.Collection 但它仍然显示错误。它在我使用模板但不在反应组件中工作时工作。我该如何解决这个问题?

0 投票
0 回答
344 浏览

linux - 为什么 Linux 的 CFS 调度程序中正在运行的进程的 vruntime 会减少?

我正在探索 CFS 调度程序。根据 CFS,vruntime 是进程在 CPU 上运行的时间。因此,一旦一个进程消耗了一些 CPU,它的 vruntime 就会增加。

为了深入理解 context_switch 的概念,我研究了 kernel/sched/core.c 文件的 context_switch 方法实现。

要了解上下文切换所涉及的进程 - 特别是要知道哪个进程被调度出来以及哪个进程被调度进来,我添加了

在 kernel/sched/core.c 文件的 context_switch() 函数内部。

清理后的一些样本数据

从上面的数据我们可以推断出每个进程在被调度之前执行了多少时间。

一切看起来都很完美 - 每次运行都会增加进程的 vruntime。

令我惊讶的是,在最后一行中,正在运行的进程的 vruntime 减少了

  1. pid 7560 进程的 vruntime 在最后一行减少(从 24498429471802 到 6056741110796) - 为什么?

  2. 即使进程被固定到特定的 CPU 核心(因此没有机会迁移到其他 CPU 核心),如何减少正在运行的进程的 vruntime?

  3. 另一个重要的观察结果是,在其他运行 7560 进程中运行的时间片较短,但最后一次它获得了更高的时间片。更大的时间片和减少 vruntime 之间有什么关联吗?

我正在使用 Debian 8.0 和 Ubuntu 16.04,内核 3.16.35,这在两个操作系统中都发生了。

任何了解原因的链接都会有很大帮助。

0 投票
0 回答
145 浏览

linux - 如何在 CFS 调度程序 linux 中初始化新创建的进程的 vruntime?

在 CFS 调度程序中,它总是选择一个具有最小 vruntime 的进程。正在运行的进程的 vruntime 会随着它消耗的 CPU 量而增加。

我有以下两个与 CFS 和 vruntime 相关的问题。

  1. 当新创建多个进程/线程时,新创建的进程/线程的初始 vruntime 是多少?是在创建时那个就绪队列中的最小 vruntime 还是其他什么?

  2. 如果一个进程已经运行了很长时间并且它的 vruntime 已经很高,那么在这种情况下会创建一个新进程。现在新创建的进程的初始 vruntime 将是什么(记住最大的不公平性)。

0 投票
0 回答
92 浏览

c - 为什么 Linux CFS 不将空闲 CPU 分配给 Core2Duo 中运行队列的其他可用进程?

我在具有 Ubuntu-12.04 操作系统、3.18.26 内核的 Core2Duo、2.20GHz 系统中工作。

我对 Linux 内核源代码进行了一些更改。

为了让上下文切换中涉及的所有进程(被调度和取消调度),我在内核中进行了更改(kernel/sched/core.c 并在 context_switch 函数中添加了以下打印语句)。

我在同一个 CPU 内核中运行两个不同的进程 P1(具有 100 个线程 - T0、T1、...、T99)和 P2。P2 已经运行了很长时间,所以它的 vruntime 很高。

在 P1 内部,前 100 个线程被创建,除 T0 之外的所有线程都处于阻塞状态(等待信号量)。

  1. T0 执行一些任务,然后设置一个持续时间为 2000 纳秒的计时器并自愿释放 CPU。由于没有可用的线程,P2 被调度。
  2. 2000 纳秒后,定时器超时,它唤醒下一个线程 T1,该线程立即抢占 P2。
  3. T1 执行一些任务,然后设置一个持续时间为 2000 纳秒的计时器并主动释放 CPU。由于没有可用的线程,P2 被调度。
  4. 2000 纳秒后,定时器超时,它唤醒下一个线程 T2,该线程立即抢占 P2。

这重复并且线程 T0,T1,...T99 以循环方式执行。

所以,执行顺序如下

我的实验结果表明,

当我将计时器间隔设置为 1800 纳秒时,P2 进程平均为 1450 纳秒。

当我将计时器间隔设置为 2000 纳秒时,P2 进程平均为 1600 纳秒。

当我将计时器间隔设置为 2500 纳秒时,P2 进程的平均时间为 2050 纳秒。

当我将定时器间隔设置为 3000 纳秒时,P2 进程平均为 2600 纳秒。

因此,我得出结论,在我的 Core2Duo 系统中,上下文切换时间约为 350-450ns。我这样说对吗?

另一个观察结果是,当我将计时器间隔设置为 1600 纳秒或 1700 纳秒时,尽管 CPU 空闲,但 P2 进程不会在两个线程之间调度 - 这意味着尽管 P2 已准备好,但 CPU 在大约 1200 -1300 纳秒内空闲排队,准备运行。为什么会这样?

这是我的代码片段:

内核跟踪显示,CPU 空闲,有足够的时间可用于上下文切换 - 线程 Ti 到 P2,仍然没有安排 P2,稍后在 Ti 和 T(i+1) 之间发生上下文切换。 为什么在这种情况下,当计时器持续时间小于 1700 纳秒时,linux CFS 不选择下一个进程进行调度?

0 投票
1 回答
1215 浏览

cpu - cgroup 上下文中的 cpu.shares 和 cpu.cfs_quota_us 是什么关系?

我正在使用 centos6/7 并使用 cgroup 来管理 cpu 资源。我已通读RHEL 文档,但没有回答以下问题:

如果我同时设置 cfs_quota_us 和 cgroups 之间的共享,那么会发生什么?

(例如 cfs_quota_us 会优先于共享吗?)

谢谢你的期待!

0 投票
0 回答
224 浏览

linux - RT 进程如何为 CFS 进程释放 CPU,并在没有准备好的 CFS 进程时将其取回

一个关于Linux调度的问题:

  • 我有几个使用CFSA调度的进程和一个使用 (SCHED_FIFO) 调度运行的进程“ ” Real-Time (RT)——所有进程都绑定到一个特定的 CPU 内核。
  • 进程 " " 在RTA (SCHED_FIFO)上运行,因为它不应该被其他CFS进程抢占。
  • 相反,进程 " A" 会在它决定时自动释放 CPU,并让其他进程(使用CFS调度)来使用 CPU。

现在的问题:

  • 进程“”如何A释放 CPU,让其他准备运行的CFS进程来占用 CPU?
  • 如果“A”将其策略更改为CFS (SCHED_OTHER),则Linux 调度程序可能也会让它运行。
  • 此外,如果 " A" 将其策略更改为IDLE,调度程序仍然可以让它运行。

我希望进程“ A”在以下情况下恢复 CPU:

  • 没有准备好运行的其他CFS进程,或者经过了预定义的时间 ( e.g. 10ms) - 以先发生者为准。
  • 第二个条件可以通过另一个进程(在 CPU 内核上运行)将“ A”策略更改回RT来实现。

关于如何实现这一点的任何想法?

更具体地说,如何保证只有其他准备好的CFS 进程才会运行,而不是“ A”,直到满足上述条件之一?

谢谢!

0 投票
0 回答
37 浏览

docker - cron-job 与控制台的 Linux CFS 调度

我已经创建了一些工作(天气预报),并且很长一段时间内负载很重,主要是 CPU 和内存。我注意到,当我从 cli 运行作业时,我仍然可以使用浏览器而不会卡顿。但是当我把同一份工作转移到一个 cron 工作时,到处都是口吃。

我认为这与来自内核的 CFS 调度将进程分组(通过 tty)的方式有关。有关文档,请参见此处

现在该链接确实提供了一些关于如何修复它的指针,可能。但我想知道是否有人已经做过这样的事情,结果如何。

Linux xyz 4.4.0-170-generic #199-Ubuntu SMP Thu Nov 14 01:45:04 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

0 投票
0 回答
148 浏览

c - 我们的 C 代码中用于 CFS 调度的示例代码

我有一个 C 代码,它有一些线程,我研究了 CFS 内核调度,但我不知道如何在我的程序中使用它。我可以通过 CFS 方法以不同的优先级安排我的线程吗?是否有任何教程、API 或 C 中好的示例代码可供入门?

谢谢

0 投票
1 回答
286 浏览

linux - update_rq_clock 和 update_rq_clock_task 的区别

我理解 update_rq_clock 的概念,因为它定期更新系统滴答的运行队列时钟。但是这个函数调用 update_rq_clock_task()。这个功能背后的目的是什么?