【问题标题】:SCHED_FIFO thread freezes terminalSCHED_FIFO 线程冻结终端
【发布时间】:2019-06-21 01:28:48
【问题描述】:

我有一台 centos 最小 hexacore 3.5ghz 机器,我不明白为什么 SCHED_FIFO 实时线程只固定到 1 个核心,冻结终端?如何避免这种情况,同时保持线程的实时行为而不在循环中使用睡眠或阻塞它?为了简化我的问题,该线程尝试在无限循环中从非阻塞、无锁、并发队列中取出项目。 内核在核心 0 上运行,所有其他核心都是空闲的。所有其他线程和我的进程也是 SCHED_OTHER 相同的优先级,20。这是我需要超低延迟进行一些高频计算的唯一线程。启动应用程序后,似乎一切正常,但我的终端死机(我通过 ssh 远程连接)。我能够看到创建的线程并从 htop 强制关闭我的应用程序。 RT 线程似乎按预期运行 100% 耗尽分配的核心。当我杀死应用程序时,冻结的终端被释放,我可以再次使用。 看起来该线程的优先级高于所有内核中的其他所有线程,但我只希望在我固定它的内核上使用它。

谢谢

【问题讨论】:

  • 所以只是终端冻结,而不是整个机器?确切地说,哪个过程不再反应?贝壳? sshd? (终端是你在电脑本地运行的程序,如果确实卡住了,和调度优先级没有关系。)
  • 您好 Florian,sshd 会话冻结。我可以创建一个新会话并终止进程或使用机器。此外,我的项目似乎在该冻结会话之后正常工作。
  • 如果我创建另一个会话并启动 htop,我会看到 sshd: root@pts/0 进程状态为 D 的冻结会话..
  • 下一步是将调试器附加到进程并找出sshd 阻塞的位置。您还可以使用tw sysrq 键(如有必要,通过/proc/sysrq-trigger)获取内核回溯。

标签: c++ pthreads scheduler


【解决方案1】:

您好 victor,您需要将内核与 linux 调度程序隔离开来,这样它就不会尝试将较低优先级的任务(例如将您的终端运行)分配给正在运行具有较高优先级的 SCHED_* 作业的内核。您可以通过将内核选项 isolcpus=1 添加到您的 grub.cfg(或您正在使用的任何引导加载程序配置)来实现隔离核心 1。

重新启动后,您可以通过运行 dmesg | 确认您已成功隔离核心 1。 grep 隔离 并查看您的内核是否已使用该选项启动。

以下是有关 isolcpus 的更多信息: https://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re46.html

【讨论】:

  • 我应该补充一点,隔离内核的效果是 linux 调度程序不会将这些内核用于任何未通过 sched_set_affinity 或通过任务集以编程方式分配的任务。
猜你喜欢
  • 2023-04-08
  • 2013-02-17
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2011-06-22
相关资源
最近更新 更多