0

我在几个地方有一个非常奇怪的系统行为,简而言之:用户或内核空间中有一个进程等待事件,虽然事件发生,但进程没有唤醒。

我将在下面对此进行描述,但由于问题出在许多不同的地方(至少 4 个),我开始寻找系统问题而不是本地问题,例如抢占标志(已经检查而不是问题),这将使区别。

该系统是在飞思卡尔 IMX6 上运行的 Linux,它是全新的,仍处于测试阶段。相同的代码在许多其他 Linux 系统上运行良好。

该系统正在运行 2 个独立的进程,一个是使用 gstreamer 从文件播放视频,使用从未使用过的新图像处理器显示视频。如果这个过程单独运行,系统可以运行一夜。

另一个过程是使用通过 USB 连接的数字调谐器。该过程仅在循环中获取设备版本,再次单独运行时可以运行过夜。

如果这两个进程同时在系统上运行,一个在几分钟内就会卡住。如果我们更改测试参数(如定期获取版本时间),其他进程将卡住。
进程总是停留在等待事件(wait_event_interruptible在内核驱动程序中,或在用户空间中pthread_cond_wait)。事件本身发生了,我有日志可以看到。但进程不会唤醒。

试图杀死这个过程会导致僵尸。我设法找到了一个有非常具体的时间问题的地方,其中条件检查放错了位置,如果进程切换到正确的位置,可能会导致这种卡住。它解决了一个问题,而我又遇到了另一个具有相同特征的问题。无论如何,发现的错误无法解释为什么它会如此频繁地发生,它可以解释理论上会在很多时间卡住一次的错误,但不会这么快。

无论如何-即使问题是真实的,系统中的某些东西也会导致它很快出现。再一次 - 这段代码(除了新的显示驱动程序)在其他系统中工作,甚至在单独工作时也在同一个系统上工作。这些进程不相关,也不相互协作,它们的共同点是它们正在运行的机器。

它可能与系统资源(1G内存使用100M,CPU使用率为5%),调度程序行为或系统配置有关。任何人都有想法可能导致这些问题?

4

1 回答 1

0

如果它是一个全新的 Linux 端口,那么它可能是你实际上有一个真正的内核错误 - 如果它是新硬件,则可能是一个硬件错误。

但是,您需要非常好的证据,因此straceftrace甚至可能需要对相关内核代码进行一些检测,以向能够真正解决问题的人展示这一点——我猜,既然您以您的方式提出这个问题,那你不是一个普通的内核黑客。

抱歉,如果这不是您正在寻找的答案。

于 2012-12-25T11:19:54.330 回答