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

Independent multithreaded processes block simultaneously

本文关键字:进程 多线程 独立      更新时间:2023-10-16

系统为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中,理论上什么可以阻止整个多线程进程?

使用运行程序

valgrind --tool=helgrind ./your_program

你会发现更多你期待的问题。

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