当前位置: 首页 > 知识库问答 >
问题:

执行2小时后,pthread\u create与EAGAIN一起失败

谷梁星雨
2023-03-14

我有一个在linux系统上运行的多线程linux应用程序

该应用程序已经在不同的Linux系统和内核中成功工作,而从未注意到这个问题。

我们目前正在使用这个内核

#ulimits -a
Linux AM38 4.9.0-8-rt-amd64 #1 SMP PREEMPT RT Debian 4.9.130-2 (2018-10-27) x86_64 GNU/Linux

我们已经使用这个内核1年了,没有问题。

应用程序可以有一些外部连接的客户端。当客户端连接每个客户端的几个线程时,就会创建一个客户端。

最近我遇到了一个问题,pthread\u create return EAGAIn。我设法设计了一个压力测试来再现失败。复制需要2个小时。生产失败所需的时间相似。

一旦我能够重现问题,我就可以毫无问题地返回到生产中使用的版本,但问题现在也出现在旧版本上。所以我认为我们一直都有这个问题,但现在我们有了一个用户案例来突出这个问题。

基本上,测试模拟通信中断30秒,因此所有客户端都断开连接,然后我让系统正常工作30秒,让客户端重新连接。我增加了450毫秒的延迟,以使尝试重新连接时的压力更大。只有30个客户端。

在生产和我的压力实验室条件下,问题出现在开始给系统施加压力2小时后。

我已经检查了僵尸,以确保我正确地加入了线程。htop或ps从不显示任何线程为Z或已失效。

我用htop监控了系统,在系统中我从未看到超过46个任务和140个线程。

我检查了系统限制,看起来不错。

# ulimit -a
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31414
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31414
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

# cat /proc/sys/kernel/pid_max
327687
# cat /proc/sys/kernel/threads-max
62828
# free -h
              total        used        free      shared  buff/cache   available
Mem:           7.7G        470M        3.7G         83M        3.5G        7.0G
Swap:            0B          0B          0B

如果我做一个ps

# ps -axH | grep myapplication
 3910 tty5     Sl+    4:23 myapplication -v
 3910 tty5     Sl+    1:41 myapplication -v
 3910 tty5     Sl+    0:02 myapplication -v
 3910 tty5     Sl+    0:00 myapplication -v
 3910 tty5     Sl+    0:46 myapplication -v

.... same looking lines here

 3910 tty5     Sl+    0:00 myapplication -v
 3910 tty5     Sl+    0:47 myapplication -v
 3910 tty5     Sl+    0:00 myapplication -v
 3910 tty5     Sl+    0:48 myapplication -v
 3910 tty5     Sl+    0:00 myapplication -v
 3910 tty5     Sl+    0:49 myapplication -v
 3910 tty5     Sl+    0:51 myapplication -v

总线程数:134

我可以连接到系统并执行程序,系统上的Web服务器运行。只有那个过程似乎失败了。

如果我停止/启动该过程,所有恢复正常2小时。

这里pthread\u create与EAGAIN一起失败,我发现我可能遇到了这个bug

https://bugzilla.kernel.org/show_bug.cgi?id=154011

但是我不知道如何确认它,以及如何解决我的问题。它似乎没有固定下来。

共有1个答案

郤飞英
2023-03-14

我已经找到它是什么了。

我不是在一个地方调用join\u线程,但我希望看到线程与ps的zoombies,这个问题是stackoverflow。com/questions/31765867/…给了我看的地方。

我找到的确认问题的最佳提示是虚拟内存使用情况。在我的例子中,未连接的线程正在增加保留的虚拟内存量。我的应用程序是32位的,所以一旦我们实现了4GB的虚拟内存,游戏就结束了。只需执行htop,就可以很容易地看到线程虚拟内存的使用情况。

我找到的链接提出了一种技术,如果您可以修改源代码并且直接使用pthreadfuncions,它可以为您提供泄漏位置的答案。

虚拟内存增加是一种间接数据,可以在生产中引起故障的原因。

谢谢大家的帮助。

 类似资料:
  • 考虑下面的代码片段,我试图创建一组线程,这些线程最终处理模拟竞争条件的给定任务。 事情通常工作正常,除了偶尔pthread_create失败与errno EAGAIN"资源暂时不可用",我尝试诱导usap,并重试创建但没有真正的效果。 故障是零星的,在一些盒子上没有故障,在一些盒子上发生得非常频繁。 知道这里会出什么问题吗? 编辑-1 更新最大线程数 编辑2 我认为这里的输入让我思考,我可能会做下

  • 问题内容: 我开始在Linux上进行pthread编程,而在最初的程序中,我完全感到困惑。下面是我正在运行的程序 我想知道的第一件事是线程执行的顺序不是顺序的? 第二件事是我故意放置print(“ amit”); 看到main确实在线程1终止期间停止了,但是在输出中我们看到的是首先执行了printf语句。整个过程的输出是 线程1 线程2 amitThread 1返回:0 线程2返回:0 问题答案:

  • 我在一个项目中工作,我想插入到两个不同的表中,所以我写了这两个查询(query1,query2),当我只使用一个查询运行程序时,我没有得到任何异常,但当一起执行时,我有一堆异常,我使用了preparedStatement execute(),但没有工作注意:我不是很有经验,请简单解释

  • 问题内容: 介绍 让我为这个长期的问题表示歉意。它要尽我所能,但是很不幸,它不是很短。 设定 我定义了两个接口A和B: 然后,我有一个共享库“ testc”,它构造类C的对象,实现A和B,然后传递指向其A接口的指针: 最后,我有一个第二共享库“TESTD”,需要一个作为输入,并尝试将其转换为一个,使用 最后,我有一个主要应用程序,在库之间传递: 题 如果我构建主应用程序,并链接到“ testc”和

  • 我有以下代码: 我不明白为什么在thr\u num=291的情况下运行此代码时,会出现一个错误:pthread\u create failure,I=291,errno=11(EAGAIN) 使用thr_num=290工作正常。我在Linux-0.2默认值(SLES 11)上运行此代码2.6.27.54rlim.rlim_currlim.rlim_max值6906。我在“最大用户进程”的“ulim

  • 我在3个VM上运行Spark1.6(即1x主服务器;2x从服务器),它们都有4个内核和16GB RAM。 正如你所看到的,这需要很长的时间。我的表实际上相当大(存储了大约2.2亿行,每行11个字段),但是这样的查询可以立即使用“普通”sql(例如pyodbc)执行。 我想我没有理解/没有使用Spark,你会有这样的想法或建议来让它更好地工作吗?