今天分析项目中进程中虚存一直增长问题,运行10个小时虚存涨到121G ,RSS占用为16G 非常恐怖。
Valgrind测试无内存泄漏。
内存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,但是系统并不会
真正释放线程所占资源。而valgrind测试时是进程退出,线程所占内存会全部释放。
所以valgrind测试不出内存泄漏。
总结
两种解决方式:
1.创建线程设置线程属性为
1 pthread_attr_init(&attr);
2 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
2.在线程函数第一行调用
1 pthread_detach(pthread_self());
顺便查看了下系统中如下信息:
顺便查了下Linux单进程能创建线程的上限,以及相关内容。
查看系统进程和线程数上限:
进程上限为:32768
进程内的线程上限为:514960 计算方式为512G/10M = 512*1024M/10M = 52428.8 和系统显示的差距比较大,这个原因不明。。等有时间在进一步查证。。