我有一个在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
但是我不知道如何确认它,以及如何解决我的问题。它似乎没有固定下来。
我已经找到它是什么了。
我不是在一个地方调用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,你会有这样的想法或建议来让它更好地工作吗?