独立的多线程进程同时阻塞

时间:2013-02-15 01:57:41

标签: c++ linux-kernel mutex blocking scheduler

系统是Linux(Gentoo x64),代码是C ++。我有一个守护程序应用程序,其中几个实例在同一台机器上运行。该应用程序本身就是多线程的。一段时间以来,我一直在观察其性能的奇怪延迟。

在输入一些调试代码之后,当一个守护进程的几个实例同时阻塞时,我想出了一个奇怪的事情,据说这是由某些外部原因造成的。简单来说,我有一个这样的序列:

  1. 记录时间( t1
  2. lock mutex
  3. 致电C ++ std::list::push_back() / pop_back()(即非常简单的数学)
  4. 解锁互斥锁
  5. 记录时间( t2
  6. 我有时会清楚地看到上面的序列在几个独立的(!)进程中在第2步(或第4步的probaby)中运行,因为在步骤3中有一些关于数学的过多时间(例如,0.5) - 1.0秒)。作为证据,我看到所有进程的日志中的 t2 实际上是相同的(在几微秒内不同)。看起来这些进程的某些线程在相对不同的时间进入该部分(我可以清楚地看到 t1 的0.5 - 1秒差异),锁定互斥锁,并在涉嫌花费的相同时间解锁根据日志锁定的时间不合理( t2 - t1 差异)。看起来令人毛骨悚然。

    该问题的表现相对较少,在中等负荷下约5-10分钟。测试中没有记录NTP时间偏移(这实际上是我的第一个想法)。如果是NTP,则服务中不会出现实际延迟,只会在日志中出现错误的时间。

    我从哪里开始?我是否开始调整调度程序?什么理论上可以阻止Linux中的整个多线程进程?

1 个答案:

答案 0 :(得分:1)

运行您的程序:

valgrind --tool=helgrind ./your_program

您会发现更多您期望的问题。

Valgrind(Helgrind)将为您提供线程应用程序的详细方案,现在是部署之前必须的。