今天分析項目中進程中虛存一直增長問題,運行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 和系統顯示的差距比較大,這個原因不明。。等有時間在進一步查證。。