開始以為是內存不足導致無法創建線程,把jvm的-Xms,-Xmx的2個參數都加大一倍:-Xms2048m -Xmx2048m。把-Xss參數調小,還是啟動失敗。應該是系統方面的限制了,這台機器上搞了100個過tomcat進程,還有不少其他軟件,東西比較多且雜。確認過機器的內存還是足夠的,先排查系統參數,之后再清理垃圾資源了。
系統可生成最大線程數
cat /proc/sys/kernel/threads-max
這個值很大,tomcat進程的全部線程數肯定沒有超過它,如果實際線程數比它大可改大(實際可能是代碼問題,開啟了太多線程)。
進程最大線程數
ps -eLf | grep 項目名 | wc -l 查看單個項目線程數,啟動失敗的這個項目線程數一般在600左右
cat /proc/sys/vm/max_map_count
65530
這個值沒有問題,jvm的啟動參數為-Dconfig.server.maxThreads=3000,也沒有問題
用戶最大進程數
ulimit -a
其中max user processes就是表示用戶的最大進程數,我的這個值很大,進程數也沒有超過它。如果超過的話,可以修改最大進程數的配置
vi /etc/security/limits.d/90-nproc.conf
* soft nproc 1024
root soft nproc unlimited
上面可以看除了root用戶外的所有用戶均限制為1024,因此通過可以注釋此行或者將值改大,保存后修改立刻生效
#* soft nproc 1024
root soft nproc unlimited
整個系統已用的線程或進程數
cat /proc/sys/kernel/pid_max
該值是32678(32位Linux系統可創建的最大pid數是32678),查詢當前整個系統已用的線程或進程數:pstree -p | wc -l,結果比32678稍小,問題就在這了
vim /proc/sys/kernel/pid_max,改為65535保存退出的時候報錯如下
/proc/sys/kernel/pid_max E667 Fsync failed
改成下面方式即可:
echo "65535" > /proc/sys/kernel/pid_max
不需要重啟,保存后立刻生效,重啟項目終於好了