8

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

在放置了一些调试代码之后,我想出了一个奇怪的事情,即多个守护进程实例同时阻塞,据称这是由某种外部原因或其他原因引起的。简单地说,我有一个这样的序列:

  1. 记录时间(t1
  2. 锁定互斥锁
  3. 调用 C++ std::list::push_back()/ pop_back() (即非常简单的数学)
  4. 解锁互斥锁
  5. 记录时间(t2

有时,我清楚地看到上面的序列在步骤 2(或可能在步骤 4)在几个独立的(!)进程块中运行,在步骤 3 的数学运算中花费了一些非常多的时间(例如,0.5 - 1.0 秒)。作为证明,我看到所有进程的日志中的t2实际上是相同的(在几微秒内不同)。看起来进程的某些线程在相对不同的时间进入该部分(我可以清楚地看到t1的 0.5 - 1 秒差异),锁定互斥锁,并在同一时间解锁,据称在锁定中花费了不合理的时间根据日志(t2 - t1差异)。让我觉得毛骨悚然。

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

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

4

1 回答 1

1

运行你的程序:

valgrind --tool=helgrind ./your_program

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

Valgrind (Helgrind) 将为您提供线程应用程序的详细场景,如今这是部署之前的必备条件。

于 2013-02-15T18:35:58.957 回答