tomcat 启动速度慢背后的真相
1. tomcat 啟動慢
在線上環(huán)境中,我們經(jīng)常會遇到類似的問題,就是tomcat 啟動比較慢,查看內(nèi)存和cpu,io都是正常的,但是啟動很慢,有的時候長達幾分鐘,這到底是什么原因?qū)е碌摹?/p>
1.1 tomcat 獲取隨機值阻塞
? tomcat的啟動需要產(chǎn)生session id,這個產(chǎn)生需要通過java.security.SecureRandom生成隨機數(shù)來實現(xiàn),隨機數(shù)算法使用的是”SHA1PRNG”,但這個算法依賴于操作系統(tǒng)的提供的隨機數(shù)據(jù),在linux系統(tǒng)中,這個值又依賴于/dev/random 和/dev/urandom
/dev/random :阻塞型,讀取它就會產(chǎn)生隨機數(shù)據(jù),但該數(shù)據(jù)取決于熵池噪聲,當(dāng)熵池空了,對/dev/random 的讀操作也將會被阻塞。 /dev/urandom: 非阻塞的隨機數(shù)產(chǎn)生器,它會重復(fù)使用熵池中的數(shù)據(jù)以產(chǎn)生偽隨機數(shù)據(jù)。這表示對/dev/urandom的讀取操作不會產(chǎn)生阻塞,但其輸出的熵可能小于/dev/random的。它可以作為生成較低強度密碼的偽隨機數(shù)生成器,不建議用于生成高強度長期密碼。我們通過查看java.security 文件,(我的java版本是1.8.0_131) 發(fā)現(xiàn)依賴的是/dev/random
tomcat 啟動產(chǎn)生session id 最終依賴的是/dev/random ,/dev/random 又依賴于熵池,
對于熵池,百度百科這樣寫到
Linux內(nèi)核采用熵來描述數(shù)據(jù)的隨機性。熵(entropy)是描述系統(tǒng)混亂無序程度的物理量,一個系統(tǒng)的熵越大則說明該系統(tǒng)的有序性越差,即不確定性越大。在信息學(xué)中,熵被用來表征一個符號或系統(tǒng)的不確定性,熵越大,表明系統(tǒng)所含有用信息量越少,不確定度越大。計算機本身是可預(yù)測的系統(tǒng),因此,用計算機算法不可能產(chǎn)生真正的隨機數(shù)。但是機器的環(huán)境中充滿了各種各樣的噪聲,如硬件設(shè)備發(fā)生中斷的時間,用戶點擊鼠標(biāo)的時間間隔等是完全隨機的,事先無法預(yù)測。Linux內(nèi)核實現(xiàn)的隨機數(shù)產(chǎn)生器正是利用系統(tǒng)中的這些隨機噪聲來產(chǎn)生高質(zhì)量隨機數(shù)序列。內(nèi)核維護了一個熵池用來收集來自設(shè)備驅(qū)動程序和其它來源的環(huán)境噪音。理論上,熵池中的數(shù)據(jù)是完全隨機的,可以實現(xiàn)產(chǎn)生真隨機數(shù)序列。為跟蹤熵池中數(shù)據(jù)的隨機性,內(nèi)核在將數(shù)據(jù)加入池的時候?qū)⒐浪銛?shù)據(jù)的隨機性,這個過程稱作熵估算。熵估算值描述池中包含的隨機數(shù)位數(shù),其值越大表示池中數(shù)據(jù)的隨機性越好。那么如何查看熵池 的大小,文件 /proc/sys/kernel/random/entropy_avail 保存著 熵池的大小。/proc/sys/kernel/random/poolsize 保存著熵池的最大容量,單位都是bit。
[root@haha cwd]# cat /proc/sys/kernel/random/entropy_avail 146總結(jié) tomcat 啟動慢的原因是隨機數(shù)產(chǎn)生遭到阻塞,遭到阻塞的原因是 熵池大小 。
解決方法:
1 . 更換產(chǎn)生隨機數(shù)的源
? 官方文檔鏈接
? 因為/dev/urandom 是非阻塞的隨機數(shù)產(chǎn)生器,所以我們可以從這邊獲取,但是生產(chǎn)的隨機數(shù)的隨機性比較低。我們可以在 我們的tomcat啟動腳本(catalina.sh)里面添加
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"或者是更改java的java.security 文件,將securerandom.source=file:/dev/random
securerandom.source=file:/dev/./urandom? 注意一下,為什么我們這里使用的路徑是"/dev/./urandom",而不是 "/dev/urandom",是因為在java 8之前的版本設(shè)置了/dev/urandom ,但是實際還是使用/dev/random,設(shè)置為"/dev/./urandom"才能正常使用 "/dev/urandom" , 這個bug在java8版本已經(jīng)修復(fù)了,如果你是java7版本的話,需要按照上面設(shè)置,java8的話可以不用加 "./"。官方bug鏈接
2 .增大熵池 的值
要增大熵池 的值首先得你的cpu支持DRNG 特性, 如何查看我們的服務(wù)器的是否支持DRNG特性?
cat /proc/cpuinfo | grep rdrand如果不支持的話,那么就只能通過上面的第一種方法來解決了
安裝rngd服務(wù)(關(guān)于rngd服務(wù)的介紹)
yum -y install rng-tools systemctl enable rngd systemctl start rngd然后我們進行查看我們的熵池 的值,會發(fā)現(xiàn)變大了
cat /proc/sys/kernel/random/entropy_avail然后我們啟動tomcat 會發(fā)現(xiàn)啟動速度快很多。
1.2 tomcat 需要部署的web應(yīng)用程序太多
? 有的時候,我們tomcat啟動比較慢是因為它需要部署的web應(yīng)用程序太多,但是其中有些應(yīng)用程序是我們不需要的,比如在webapps下的 doc 、example、ROOT 等等,我們可以將我們不需要的webapps刪除,然后再進行發(fā)布,這些不需要的web,不僅會占用我們的資源,還有可能是入侵者的入侵對象。如果我們想并行啟動多個web應(yīng)用程序,我們可以Host 的屬性 startStopThreads 值設(shè)置大于1 ,但這也取決于我們的服務(wù)器是不是多核的。如果是多核的建議調(diào)大 startStopThreads 的值,但不超過內(nèi)核數(shù)。
1.3 tomcat啟動內(nèi)存不足
? 如果是項目比較大的話,我們使用默認的參數(shù)去啟動的tomcat是很有可能內(nèi)存不足的,我們需要設(shè)置JVM,將內(nèi)存調(diào)整,JVM 的最大值和最小值建議是不要相差太大(最好一致.)
在啟動腳本catalina.sh加上:
JAVA_OPTS='-server -Xms1024m -Xmx1024m'具體的內(nèi)存大小,根據(jù)業(yè)務(wù)調(diào)整。
以上就是解決tomcat 啟動慢的問題和解決方案,可根據(jù)自己的項目情況進行使用。后面也會有一篇tomcat 調(diào)優(yōu)的文章,請大家點波關(guān)注哦。
轉(zhuǎn)載于:https://www.cnblogs.com/operationhome/p/10494620.html
總結(jié)
以上是生活随笔為你收集整理的tomcat 启动速度慢背后的真相的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7 Ambari2.7.5编
- 下一篇: APP版本号命名规范及原则,2018an