【问题标题】:Is it possible to "hang" a Linux box with a SCHED_FIFO process?是否可以使用 SCHED_FIFO 进程“挂起”Linux 机器?
【发布时间】:2011-04-05 01:38:22
【问题描述】:

我想让一个实时进程接管我的计算机。 :)

我一直在玩这个。我创建了一个本质上是while (1) 的进程(从不阻塞也不会产生处理器)并使用schedtoolSCHED_FIFO 策略运行它(也尝试过chrt)。但是,该进程也让其他进程运行。

然后有人告诉我sched_rt_runtime_ussched_rt_period_us。所以我将运行时设置为-1,以使实时进程接管处理器(并尝试使两个值相同),但它也不起作用。

我在 Linux 2.6.27-16-server 上,在只有一个 CPU 的虚拟机中。我做错了什么?

谢谢,

编辑:我不想要叉子炸弹。我只想让一个进程永远运行,而不让其他进程运行。

【问题讨论】:

  • 如果您的意思是“挂起”如“减速并崩溃”,请尝试使用叉形炸弹。如果我对您的理解正确(并且您不依赖于内核实现),那么 fork 炸弹将完全满足您的需求。
  • 我同意 ^ 叉炸弹会更有效地做到这一点。
  • 不,我不想这样。我只想让一个进程永远运行,而不让其他进程运行。
  • 这在某些情况下实际上是一种有用的技术(特别是如果你只做一个任务并且拥有>1个核心)

标签: linux process linux-kernel scheduling real-time


【解决方案1】:

还有另一种我不知道的保护措施。

如果你只有一个处理器,并且想要一个像这样的SCHED_FIFO 进程(一个从不阻塞或自愿让出处理器)来垄断它,除了给予它高优先级(在大多数情况下不是真的必要,但没有'不疼)你必须:

  1. sched_rt_runtime_us 设置为-1sched_rt_period_us 中的值
  2. 如果您配置了组调度,请将/cgroup/cpu.rt_runtime_us 设置为-1(以防万一 您将 cgroup 文件系统挂载到 /cgroup)

显然,我配置了组调度并且没有绕过最后的保护。

如果您有N 处理器,并希望您的N 进程独占处理器,您只需执行相同的操作,但从您的shell 中启动所有它们(shell 不应该卡住,直到您启动最后一个,因为它将有处理器运行)。如果您想真正确定每个进程将转到不同的处理器,请相应地设置其 CPU 亲和性。

感谢大家的回复。

【讨论】:

    【解决方案2】:

    我不确定 schedtool,但如果您成功地将使用 sched_setscheduler 的调度程序更改为 SCHED_FIFO,然后运行一个不阻塞的任务,那么一个内核将完全分配给该任务。如果这是唯一的核心,则根本不会运行任何 SCHED_OTHER 任务(即除了几个内核线程之外的任何任务)。

    我自己试过了。

    所以我推测您的“非阻塞”任务正在阻塞,或者您的 schedtool 程序未能更改调度程序(或为错误的任务更改它)。

    【讨论】:

    • 特别是,您是否以 root 身份运行 chrt
    • @caf:是的,我是。正如我刚刚在回答中所说,问题不在于过程本身,也不在于schedtoolchrt。还有一些我不知道的其他保护措施。谢谢。
    【解决方案3】:

    您还可以让您处理最高优先级为 1 的 SCHED_FIFO。因此该进程将永远运行并且不会被抢占。

    【讨论】:

    • 另外,你需要有一些非常繁忙的等待循环,这样其他人就没有机会运行了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    相关资源
    最近更新 更多