什么可能导致我的程序在一段时间后不使用所有核心?

Nio*_*reh 8 c++ linux pthreads affinity amd-processor

我编写了一个程序,可以捕获并显示来自三个视频卡的视频.对于每一帧,我产生一个线程,将帧压缩为Jpeg,然后将其放入队列以写入磁盘.我还有其他线程从这些文件中读取并在自己的线程中解码它们.通常情况下这很好用,它是一个相当CPU密集型的程序,占所有六个CPU内核的70-80%.但过了一会儿,编码突然变慢,程序无法足够快地处理视频并开始丢帧.如果我检查CPU利用率,我可以看到一个核心(通常是核心5)不再做太多了.

发生这种情况时,如果我退出并重新启动程序并不重要.CPU 5的利用率仍然很低,程序会立即开始丢帧.删除所有已保存的视频也没有任何效果.重新启动计算机是唯一有用的.哦,如果我将我的程序的亲和力设置为使用除半空闲核心以外的所有核心,它将起作用直到另一个核心发生同样的情况.这是我的设置:

  • AMD X6 1055T(Cool&Quiet OFF)
  • GA-790FX-UD5主板
  • 4Gig RAM未组合1333Mhz'
  • Blackmagic Decklink DUO采集卡(x2)
  • Linux - Ubuntu x64 10.10,内核2.6.32.29

我的应用使用:

  • libjpeg的涡轮增压
  • posix线程
  • decklink api
  • Qt的
  • 用C/C++编写
  • 所有库都动态链接

在我看来,Linux在核心上调度线程的方式会出现某种问题.或者是否有某种方式我的程序可能会如此糟糕,以至于无法重启程序?

感谢您阅读,欢迎任何和所有输入.我被困了:)

thi*_*ton 4

首先,确保这不是您的程序 - 也许您正在遇到复杂的并发错误,即使您的程序架构不太可能发生这种情况,并且重新启动内核会有所帮助。我发现,通常情况下,事后调试是一个好方法。使用调试符号进行编译,当程序行为异常时使用 -SEGV 终止程序,并使用 gdb 检查核心转储。