如何强制 Linux 内核“冻结”(或几乎冻结)几百毫秒

如何强制 Linux 内核“冻结”(或几乎冻结)几百毫秒

我们在非实时内核(CentOS 6)上运行实时进程,这可能不会改变。

我们有一个流视频应用程序,需要来自定制 FPGA 的大约 500 MB/s 的 PCIe 流量,每次持续 1.5 小时。该应用程序在大多数情况下都运行得很好。然而,我们也遇到过这样的情况:内核似乎一次停止响应 PCIe 服务或内存请求长达 500 毫秒。这似乎发生在来自另一个线程的突发文件 IO 期间。我发现不可能通过在主应用程序运行时从用户空间执行大量虚拟文件 IO 来尝试复制此问题。

有没有办法强制(模拟)Linux 内核的全局“冻结”(特别是停止 PCIe 或所有 DDR3 内存访问或类似的操作),以便我们可以重现此问题?

我们现在在内部 FPGA 内存中实现了长达 10 毫秒的缓冲,但这还不够。我们可以缓冲到 FPGA DDR3,然后转储到主机,但我们需要一种方法来在胁迫下测试这个新功能。

我们不希望内核永久冻结或锁定。我们希望能够设置时间间隔。

我正在寻找类似/proc/sys/vm暂时写入魔法值的东西,使系统几乎爬行,然后在几百毫秒后恢复回来,但是查看打破它的可能方法的数量并不适合像我这样的新手(https://www.kernel.org/doc/Documentation/sysctl/vm.txt)。也许有些numactl魔法?

答案1

进行快速测试的一种选择是使用启用 KGDB 的内核并手动停止内核并进行测试,看到这个链接

另一方面,我记得可能会导致你停顿的事情:

  • cpufreq,,cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency该值以 ns 为单位(在我的 AMD FX(tm)-8120 八核处理器中为 4000)应该不是问题,但请检查
  • 对 CPU 本身或稳压器模块进行热节流。
  • NAPI 和/或网络流量大
  • PCIe ASPM ( cat /sys/module/pcie_aspm/parameters/policy)
  • 目标设备(硬盘、网卡...)的缓冲区中存在争用
  • PCIe总线中某些设备的固件存在错误(即使您没有使用它),您可以尝试使用以下命令关闭它们的电源/sys/bus/pci/devices/$DEVICE/power/control

答案2

我们能否了解有关您的应用程序如何与 FPGA 通信的更多详细信息?是应用程序从 FPGA 读取缓冲区,还是 FPGA 向内核发送中断(如网卡)?

我希望它在 /dev 中打开一个块/字符,然后与其通信。这意味着它使用驱动程序在应用程序和 /dev/XXX 文件之间进行通信。

我想要的输出: cat /proc/interrupts; lsmod;ls -al /dev/yourmod

这是想法:

  • 如果是中断驱动的,可以设置CPU PIC来禁用相应的IRQ,然后重新启用它。这将导致卡的每个请求被忽略(卡不知道它)。
  • 如果它像缓冲区读取,您可以:
    • 将您的应用程序置于睡眠状态,这样来自 FPGA 的数据将不会被读取,并且您的缓冲区将填满,然后唤醒您的应用程序并继续读取。
    • 使用“crash”或“kgdb”将“read”值更改为“noop”几秒钟,然后将其设置回默认功能。

请提供您可能认为有用的所有信息。

答案3

不确定是否有帮助。但是,如果您可以编写一个内核模块来调用suspend另一个设备的内核模块的功能,那就可以了。

每个PCI设备都可以根据头文件暂停http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479

例如,这里是Intel e1000网卡的挂起功能http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643

据我所知,这个功能主要是在系统进入休眠状态时使用,设备驱动程序需要保存当前的运行状态并自行关闭。

答案4

我认为你的想法是错误的。你的目标很明确。

方法不是停止其余进程,而是为主要进程提供接近实时调度的优先级。使用好的对于您重要的用户空间进程。

更困难的问题是 PCIe 中断处理,它驻留在内核空间中。

由于涉及硬件,您应该开始仔细查看主板上涉及的 PCIe 通道以及它如何连接到特定的 CPU 插槽。

中断平衡通常在这里做得很好,但您可以配置其行为以满足您的需要。

相关内容