Linux 内核 5.9 到 5.10 有何变化?

Linux 内核 5.9 到 5.10 有何变化?

我在 Ubuntu 中使用测量计算 DAQ 从连接到板的另一个系统执行连续模拟读取和写入。我已经使用 Ubuntu 16.04(升级到 Linux 内核 4.15)大约五年了。我最近正在探索将系统升级到 Ubuntu 20.04 - 22.04,每个操作系统都附带 Linux 内核 5.10 - 5.15。我注意到,对于每个内核 5.10 或更高版本,我收到的似乎是周期性中断,这些中断非常剧烈(大约 50 毫秒)。因此,从 5.9 内核到 5.10 内核似乎发生了一些变化,影响了 A/D 板的系统 read() 和 write() 调用。在我的数据采集软件中可以看到差异:

在此输入图像描述

在我的平均循环时间程序中(循环执行连续的读取和写入调用 - 以及中间的一些数学):

在此输入图像描述

请注意,我看到的最大时间是如何从 Linux 内核 5.9 及更低版本的大约 43 微秒变为 Linux 内核 5.10 及更高版本的 50 毫秒。我显然想解决这个问题,但我不确定是什么改变导致了这个问题。有谁知道罪魁祸首是什么,以及是否可以通过更改 GRUB 引导加载程序中的内核参数来修复它?任何指示肯定会受到赞赏。谢谢!

编辑:

我实现了一个最小的示例,其中我们不断调用写入系统命令来更新 DAC 输出。

DAC Write 命令至少调用“get_user”从用户空间获取数据到内核,并调用“outw”将数据写入DAC 寄存器。

现在,当我们执行最小示例时,我们正在执行连续写入系统命令,并且我们注意到有 50 毫秒的延迟。

然而,当我们在写入系统命令之间添加 1 微秒的延迟时,50 毫秒的延迟就会消失。这是否可能是尝试访问用户空间信息或从内核写入设备太快的问题?

有没有办法分析内核在访问用户空间和将数据从内核写入设备之间正在做什么?

答案1

在更新计算机上的内核时,我遇到了与实时线程相同的问题。对我来说sysctl -w kernel.sched_rt_runtime_us=-1有帮助。

打破这一点的变化是:默认禁用 RT_RUNTIME_SHARE

答案2

5.9 -> 5.10 差异可以在这里看到

5.10 中引入的各种调度程序更新可以在这里看到

答案3

这两个 Linux 内核之间的优先级调度似乎发生了一些变化。正在运行的程序请求调度优先级为 90,这就是导致中断的原因。删除优先级调度(或将其优先级设置为零)会删除中断。我还没有确定到底发生了什么变化,以及仍然允许优先级调度的解决方案是什么样的,但问题的根本原因似乎已经确定。

相关内容