【发布时间】: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阻塞的位置。您还可以使用t和wsysrq 键(如有必要,通过/proc/sysrq-trigger)获取内核回溯。