我们有一个进程负责按照时间间隔轮询硬件。我们希望将一个 CPU 核心专门用于此过程。例如,我们希望这个进程始终保持可运行。
我们解决这个问题的第一次尝试如下:
# Set process to highest priority
nice -n -20 cmd
# Set thread affinity in C for our hardware sampling thread
pthread_setaffinity_np(...)
上述两个步骤都按预期工作。我们的线程停留在core3
我们设置的位置,并且nice
位于-20
顶部。
当重新运行ftrace
时根据本次讨论和这个问题,我们通常会看到以下内容:
> cat trace | grep " 3)" | grep " => "
3) rhd_loc-2735 => <idle>-0
3) <idle>-0 => rhd_loc-2735
3) rhd_loc-2735 => <idle>-0
3) <idle>-0 => rhd_loc-2735
3) rhd_loc-2735 => <idle>-0
3) <idle>-0 => rhd_loc-2735
rhd_loc-2735
是我们的流程。
除了上面显示的内容之外,我们还看到许多kworker-2703
切换到核心的情况,有时其他较低优先级的进程也交换到核心。
我们认为上下文切换的原因是我们的进程与SPI
等待的(串行外设接口)进行通信IRQs
,并且SPI
运行时钟速率比 CPU 核心慢一个数量级。因此,我们的进程花费大量时间等待 SPI/IRQ,例如,它不处于状态Runnable
。无论优先级或关联性如何,内核都可以自由地将其他进程分配给内核。
这会导致我们的硬件采样率变得更加可变且低于应有的水平,因为我们的 CPU 内核并不总是立即准备好处理下一个值SPI
,然后提交新的采样请求。
问题:
我们是否可以 1) 强制所有其他进程远离核心,以便我们的进程可以立即响应中断请求,或者 2) 保持主线程可运行,以便它始终可用于处理下一个请求?