独立的多线程进程同时阻塞
Independent multithreaded processes block simultaneously
系统为Linux(Gentoo x64),代码为C++。我有一个守护程序应用程序,其中的几个实例在同一台机器上运行。应用程序本身是多线程的。一段时间以来,我一直观察到它的性能出现了奇怪的延迟。
在放入一些调试代码后,我发现了一件奇怪的事情,即守护进程的几个实例实际上同时阻塞,这据称是由某种外部原因或其他原因引起的。简单地说,我有一个这样的序列:
- 日志时间(t1)
- 锁定互斥
- 调用C++
std::list::push_back()
/pop_back()
(即非常简单的数学) - 解锁互斥
- 日志时间(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++中使用cURL和多线程
- 多线程:线程或进程.h - C++
- 优化吞吐量:多线程与多进程
- 多线程中的 std::basicstring 的运行时分段错误C++点燃进程
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- Boost-在多个会话中对多个进程进行线程处理
- 使用 c++ 的多线程和并行进程
- 与多线程一起登录多进程应用程序
- 多线程排挤了其他进程
- C++如何检查文件是否在使用-多线程多进程系统
- 多线程和多进程应用程序的锁定机制之间有什么区别
- gdb是如何连接到多线程进程的
- 提振.Asio复合操作在单线程和多线程进程
- c++多线程和进程中的向量
- gdb如何连接到多线程进程
- 独立的多线程进程同时阻塞
- 在多线程进程中处理信号的示例
- 多线程进程中的信号处理
- 多线程/分叉服务器守护进程的模型
- 如果一个且只有一个线程被停止,可以从多线程进程中跟踪读/写数据