首页 > 代码库 > Linux 多线程编程--线程退出

Linux 多线程编程--线程退出

今天分析项目中进程中虚存一直增长问题,运行10个小时虚存涨到121G ,RSS占用为16G 非常恐怖。

顺便查了下Linux单进程能创建线程的上限,以及相关内容。内存32G 64bit系统信息如下:

技术分享

Linux线程使用方式是主进程依据请求的多少动态创建和退出线程。通过pmap -x pid查看进程内个部分内存分配情况:

发现大量如下占用:

技术分享

通过查询可知[anon]为未实际分配的内存,即虚存;通过如下命令计算出一共有11946个,每个对应10M总大小为 119460≈119G

 1 cat process_info.txt |grep 10240|wc -l   

好到此大概定位到,是这个部分虚存占用过多;

查看系统进程虚存限制:

技术分享

从倒数第二项可知,系统对进程虚存无限制。栈大小为10M 刚好和[anon]每一项的大小相等,现在怀疑是线程创建后未释放内存

返回去查看代码,发现每个工作线程都调用了pthread_exit了,后面再进一步分析发现链接线程中在调用pthread_exit之前未调用pthread_detach,

导致线程虽然调用了pthread_exit,但是系统并不会真正释放线程所占资源。

 

总结

两种解决方式:

1.创建线程设置线程属性为

 1 pthread_attr_init(&attr);

2 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 

2.在线程函数第一行调用  

1 pthread_detach(pthread_self()); 

 

 

顺便查看了下系统中如下信息:

查看系统进程和线程数上限:

进程上限为:32768

技术分享

进程内的线程上限为:514960  计算方式为512G/10M = 512*1024M/10M = 52428.8 和系统显示的差距比较大,这个原因不明。。等有时间在进一步查证。。

技术分享

 

Linux 多线程编程--线程退出