我最近有一项任务是在linux内核中实现一个用例。 由于一些保密信息,我无法解释所有细节,但我会尽力解释我们的目标,已知和不知道的目标。 我们有一个在smp机器上运行的Linux发行版。这就是我们对系统和流程的了解:
总结:必须强制SMP系统中的所有核心在一个窗口或多个窗口中停止15ms,每50ms一次。核心的关闭窗口可以完全重叠或根本不重叠。
这里的问题:
smp_call_function_*
API的IPI:在这里我们不知道其影响。还有用于重新安排的IPI,主要通过负载平衡触发。由于大多数线程将绑定到核心,并且我们的线程将具有高RT优先级,我们假设重新安排后台线程不是问题(?)我主要关注由于IRQ,线程,定时器等被阻止而导致的系统响应能力,并且我正在寻找如何实现用例的解决方案,对整个系统的影响很小。我们还考虑到在启用irqs的情况下保持cpus停止,这将提高响应速度,但也会影响我们的用例,这个用例很可能需要更复杂的设计。
到目前为止我尝试了什么:
sched_setscheduler
)。核心数分为2组。由于15ms完全关闭cpu有点长时间,我将时间间隔分成5个时隙,每个时隙为3ms。所以我们有2组4 cpus应该每50毫秒运行5次空闲线程。主管线程会跟踪时间并为应该运行的组中的每个cpu调用wake_up_process
。当一个组中的空闲线程完成时,它们会在struct cpumask
中设置相应的标志以表示完成。然而,我试图弄清楚的一个问题是如何强制映射到一个组中的核心的所有线程在同一时间内或多或少地达到停止/ mwait点(如上所述最大100us时间)在第1和最后之间)。从主管线程调用的wake_up_process
导致~50us组中的2个连续线程之间的增量。这是不可接受的,对于4核我们到200us。
我必须提到当前内核我有4.9次运行,HZ = 1000且CONFIG_PREEMPT被禁用,因此,afaik,虽然我的空闲线程在RT调度程序中运行,只要CONFIG_PREEMPT被禁用,它们必须等待其他线程自愿放弃核心在CFS调度程序中运行,因此不会发生抢占。真正?
在这里,我关注的是如何确保cpu组中的所有线程同时启动,以使halt / mwait非常接近彼此。
我在下面尝试制作图形表示:
Group1 Group2
____|___ ____|____
/ \ / \
C0 C1 C2 C3 C4 C5 C6 C7
-------------------------- TIME 0
| | | | <- OFF time group 1
| | | | <- OFF time group 2
| | | | ......
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
--------------------------- TIME 50ms
我也在寻找有关如何实施这一概念的其他想法。
我知道这里有很多文字,我希望我能够澄清用例。
非常感谢任何帮助/想法。
此致 丹尼尔。