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

neo*_*xic 8 c++ mutex scheduler blocking linux-kernel

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

在放了一些调试代码之后,当一个守护进程的几个实例同时阻塞时,我想出了一个奇怪的事情,据说这是由某些外部原因引起的.简而言之,我有一个这样的序列:

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

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

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

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

小智 1

运行你的程序:

valgrind --tool=helgrind ./your_program
Run Code Online (Sandbox Code Playgroud)

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

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