我有一个centos minimal Hexcore3.5ghz机器,我不明白为什么一个SCHED_FIFO实时线程只固定在一个核心上,冻结了终端?如何避免这种情况,同时保持线程的实时行为,而不在循环中使用休眠或阻塞它?为了简化我的问题,此线程尝试在无限循环中将项从非阻塞、无锁的并发队列中出列。内核在内核0上运行,所有其他内核都是空闲的。所有其他线程和我的进程都是SCHED_OTHER相同的优先级,20。这是唯一一个我需要超低延迟来进行一些高频计算的线程。启动应用程序后,似乎一切正常,但我的终端冻结(我通过ssh远程连接)。我能够看到创建的线程,并从htop强制关闭我的应用程序。RT线程似乎100%地耗尽了预期分配的内核。当我关闭应用程序时,冻结的终端被释放,我可以再次使用。看起来该线程在所有内核中的优先级高于其他所有线程,但我希望将此线程放在内核上,我只将其固定在内核上。
谢谢
发布于 2019-06-21 01:28:49
您好,您需要将内核与linux调度器隔离,这样它就不会尝试将较低优先级的任务(如运行终端)分配给正在运行具有较高优先级的SCHED_*作业的内核。您可以通过将内核选项isolcpus=1添加到您的grub.cfg (或您正在使用的任何引导加载程序配置)中来实现隔离core 1。
在重新引导之后,您可以通过运行dmesg | grep isol来确认您已经成功隔离了core1,并可以看到您的内核是使用该选项引导的。
以下是有关isolcpus的更多信息:https://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re46.html
https://stackoverflow.com/questions/47121236
复制相似问题