1

在尝试调度高速线程时,我注意到有时有很长一段时间(多个毫秒)没有调度线程。我想知道在我正在使用的配置中可以对调度程序执行此操作。

  • 带有 RT (i686) 的最新 Debian 伸展(稳定)
  • 双核英特尔 (2237MHz)
  • PS2 键盘和鼠标
  • CPU 1 保留(通过 grub)
  • 用于将我的测试过程放在核心 1 上的任务集
  • SMI 禁用、速度步禁用等(典型的 RT BIOS 设置)
  • USB 端口未禁用但未插入任何内容
  • IRQ 平衡禁用

我确认 CPU1 上只有 worker、timer 等。其他一切都在 CPU0 上。

我的线程是 SCHED_DEADLINE(唯一一个这样安排的线程),周期为 300us。我使用 schedules_yield() 在预订完成之前很久就释放线程(只是一个测试循环),所以我确定它没有过度运行。

我得到的是一个近乎完美的 3333Hz 输出(通过 o-scope),它时不时地被阻塞,每次超过 15 毫秒。我已经查看了中断(除了计时器,在那个 CPU 上没有递增),我已经禁用了 NMI 中断等等,但没有找到干扰进程是什么。我不相信我完全理解什么可以优先考虑并导致调度程序跳过周期所以我希望有人可能有一个想法?

我认为这可能是磁盘 IO,但这似乎与差距不符(有时确实如此......)。VGA/控制台的使用似乎使情况变得更糟,但即使不使用,差距仍然存在。

是的,在你问之前......这只是一个实验,看看这是否可以可靠地完成。我的实际代码在 QNX 上运行,它在同一硬件上以这种速度稳定运行。我正在试验是否可以使用 PREEMPT_RT 将其移植到 Debian。

谢谢!

4

1 回答 1

0

SCHED_DEADLINE任务比所有其他具有不同优先级的用户级任务具有更高的优先级(即SCHED_RR, SCHED_FIFO, SCHED_OTHER)。

请注意,从内核 4.16 开始,可以通过SCHED_FLAG_DL_OVERRUN对信号使用 和 用户级处理程序来检查溢出SIGXCPU(请参见此处)。

如果您需要检查 CPU 在做什么,ftrace可能是最好的方法。

于 2018-09-11T09:59:55.837 回答