免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3234 | 回复: 8
打印 上一主题 下一主题

求救!程序的某几个线程在压力测试下异常“停止” [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-31 15:04 |只看该作者 |倒序浏览
redhat9,512M内存,1G交换区。
我有一个多线程程序,某些线程会访问mysql服务器(本地)进行数据存储、查询、修改等。某些线程执行网络数据发送接收等。繁忙时会占用170M内存多。
正常情况下程序运行正常。
但是我打开httpd服务后,通过web页面访问数据库的数据,疯狂占用掉大量物理内存和交换区,将我的程序逼到差不多全部转移到交换区(驻留在内存的只占用几百k了,实际待处理数据还有150多M呢)。待交换区也差不多用完后,立即停止httpd服务。
可是当系统慢慢恢复过来后,mysqld已经慢慢恢复到平时的内存占用量了。但是我的程序的数据还在交换区,没见调度进内存执行的迹象。e而且我的程序有某几个线程“永远”停止了。就是这几个线程会用到那么大量的数据。可以看到其他线程的操作结果,可是这几个线程就是不再运行。因为如果它们运行就能够看到它们的运行结果。我怀疑它们是否在永久等待某个线程条件变量信号,因为这几个线程中用到了条件变量和互斥量。
整个压力测试过程约一个小时。实际上到停止httpd服务为止只需要半个小时吧。后小半个小时都是看状态。

请问谁有相关经验,能给出指点吗?我都快晕了,被这个问题弄的。
检查程序,互斥量、条件变量的使用都没有问题。
请求高手指点啊!

[ 本帖最后由 kokobar 于 2008-1-31 15:16 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-31 19:53 |只看该作者
再提供一个重要现象,就是用gdb attach上去后,再detach,那些线程马上开始恢复运行!用top可以看到进程的100多M数据迅速的开始被交换到物理内存,那些停止的线程立即就开始运行了。
怎么回事啊?

论坛徽章:
0
3 [报告]
发表于 2008-01-31 23:21 |只看该作者
大家帮帮忙啊!程序不算小,线程的同步互斥什么的也没什么特殊的地方,所以也没代码可贴。我只能尽量描述现象了。
希望有人碰上过这样的现象或者能够凭现象给些推断也好。

论坛徽章:
0
4 [报告]
发表于 2008-02-04 10:49 |只看该作者
1.请检查那几个停止线程的数据库异常处理;
2.vmstat 1检查httpd开启时异常;
3.互斥量、条件变量的使用可以贴上主要流程逻辑,让大家帮你一起分析

论坛徽章:
0
5 [报告]
发表于 2008-02-04 10:53 |只看该作者
4.线程停止时,试一下gstack

论坛徽章:
0
6 [报告]
发表于 2008-02-15 22:07 |只看该作者
好像朋友前端时间遇到了类似的问题,照楼主的现象,应该是事件机制异常,造成事件丢失,
俺朋友是个大牛,最后定位到linux内核部分代码逻辑在特殊情况下会出现此问题,等我回去查查

论坛徽章:
0
7 [报告]
发表于 2008-02-18 11:15 |只看该作者
回apony :
1.请检查那几个停止线程的数据库异常处理;
2.vmstat 1检查httpd开启时异常;
3.互斥量、条件变量的使用可以贴上主要流程逻辑,让大家帮你一起分析
4.线程停止时,试一下gstack

那几个线程没有停止在访问数据库的地方,
httpd应该也是正常的吧,这个没有进一步检查,佐证是如果不做这个压力测试的话,运行几天也没问题,即使访问Web页面也没问题。而且httpd跟我的程序没有直接关系,仅仅是访问同一个数据库而已。我的程序往某些表里放记录,php页面处理这些数据然后显示结果给浏览者。

互斥量等的使用也是很普通的使用方式,没有使用任何特殊的特征。
主线程获得锁,往队列里放入任务信息节点,给一个条件变量信号A(是signal,不是broadcast),释放锁。当所有任务信息放入后,永久等待条件变量B的信号。
处理线程是,获得锁,在队列空的时候永久等待条件变量信号A。收到信号后看队列不空,就去拿节点,然后释放锁,处理后开始新一轮的循环。如果处理线程发现队列被处理空了之后,发一个条件变量信号B。
当然整个任务不是只用到了这么一个互斥量和条件变量;但是其他的互斥都是发生在处理具体任务信息的流程上,而加打印信息、gdb等的结果显示线程是停止在上述的主控流程处。

gstack没用过,不知道是什么,有空去看看。

论坛徽章:
0
8 [报告]
发表于 2008-02-18 11:18 |只看该作者
回fanbufan :
偶在无限期望的等待~~~ ^_^

论坛徽章:
0
9 [报告]
发表于 2008-02-18 12:40 |只看该作者
现在是我把无限等待条件变量信号改为限时等待了,pthread_cond_timedwait,只是超时后什么也不做,仍然继续等待。
异常停止的现象没再出现了。也不知道是还没复现呢,还是好歹治标了,虽然没治本。

这个问题,还是悬念……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP