我在几个地方有一个非常奇怪的系统行为,简而言之:用户或内核空间中有一个进程等待事件,虽然事件发生,但进程没有唤醒。
我将在下面对此进行描述,但由于问题出在许多不同的地方(至少 4 个),我开始寻找系统问题而不是本地问题,例如抢占标志(已经检查而不是问题),这将使区别。
该系统是在飞思卡尔 IMX6 上运行的 Linux,它是全新的,仍处于测试阶段。相同的代码在许多其他 Linux 系统上运行良好。
该系统正在运行 2 个独立的进程,一个是使用 gstreamer 从文件播放视频,使用从未使用过的新图像处理器显示视频。如果这个过程单独运行,系统可以运行一夜。
另一个过程是使用通过 USB 连接的数字调谐器。该过程仅在循环中获取设备版本,再次单独运行时可以运行过夜。
如果这两个进程同时在系统上运行,一个在几分钟内就会卡住。如果我们更改测试参数(如定期获取版本时间),其他进程将卡住。
进程总是停留在等待事件(wait_event_interruptible
在内核驱动程序中,或在用户空间中pthread_cond_wait
)。事件本身发生了,我有日志可以看到。但进程不会唤醒。
试图杀死这个过程会导致僵尸。我设法找到了一个有非常具体的时间问题的地方,其中条件检查放错了位置,如果进程切换到正确的位置,可能会导致这种卡住。它解决了一个问题,而我又遇到了另一个具有相同特征的问题。无论如何,发现的错误无法解释为什么它会如此频繁地发生,它可以解释理论上会在很多时间卡住一次的错误,但不会这么快。
无论如何-即使问题是真实的,系统中的某些东西也会导致它很快出现。再一次 - 这段代码(除了新的显示驱动程序)在其他系统中工作,甚至在单独工作时也在同一个系统上工作。这些进程不相关,也不相互协作,它们的共同点是它们正在运行的机器。
它可能与系统资源(1G内存使用100M,CPU使用率为5%),调度程序行为或系统配置有关。任何人都有想法可能导致这些问题?