gpt4 book ai didi

c++ - 独立的多线程进程同时阻塞

转载 作者:可可西里 更新时间:2023-11-01 17:59:39 27 4
gpt4 key购买 nike

系统是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) 将为您提供线程应用程序的详细场景,现在是部署前的必备条件。

关于c++ - 独立的多线程进程同时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14887290/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com