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