我编写了一个程序,可以捕获和显示来自三个视频卡的视频。对于每一帧,我产生一个线程,将帧压缩为Jpeg,然后将其放入队列以写入磁盘。我还有其他线程从这些文件读取并在自己的线程中解码它们。通常情况下这很好用,它是一个相当CPU密集型的程序,占所有六个CPU内核的70-80%。但过了一会儿,编码突然变慢,程序无法足够快地处理视频并开始丢帧。如果我检查CPU利用率,我可以看到一个核心(通常是核心5)不再有用了。
如果发生这种情况,我退出并重新启动程序无关紧要。 CPU 5的利用率仍然很低,程序会立即开始丢帧。删除所有已保存的视频也没有任何效果。重新启动计算机是唯一有用的。哦,如果我将我的程序的亲和力设置为使用除半空闲核心以外的所有核心,它将起作用直到另一个核心发生同样的情况。这是我的设置:
我的应用使用:
在我看来,Linux在核心上调度线程的方式会出现某种问题。或者是否有某种方式我的程序可能会如此糟糕,以至于无法重启程序?
感谢您的阅读,欢迎任何和所有输入。我被卡住了。)
答案 0 :(得分:4)
首先,确保它不是你的程序 - 也许你遇到了一个复杂的并发错误,即使你的程序架构并不是那么可能,重新启动内核会有所帮助。我发现,通常,一个好的方法是验尸调试。使用调试符号进行编译,在程序奇怪的情况下使用-SEGV终止程序,并使用gdb检查核心转储。
答案 1 :(得分:2)
我会尝试在生成新的帧处理线程时选择核心循环,并将线程固定到此核心。保留有关线程运行所需时间的统计信息。如果这实际上是Linux调度程序中的错误 - 您的线程将花费大致相同的时间在任何核心上运行。如果核心实际上忙于其他东西 - 固定到这个核心的线程将减少CPU时间。