Linux系統(tǒng)下Tomcat8啟動(dòng)速度很慢的解決方法
前言
最近在工作中遇到一個(gè)問題,在Linux下Tomcat 8啟動(dòng)很慢,且日志上無任何錯(cuò)誤,在日志中查看到如下信息:
Log4j:[2017-08-2715:47:11] INFO ReadProperty:172 - Loading properties file from class path resource [resources/jdbc.properties] Log4j:[2017-08-27 15:47:11] INFO ReadProperty:172 - Loading properties file from class path resource [resources/common.properties] 27-Aug-2017 15:52:53.587 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [342,445] milliseconds.
原因
Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom
類產(chǎn)生安全隨機(jī)類SecureRandom的實(shí)例作為會(huì)話ID,這里花去了342秒,也即接近6分鐘。
SHA1PRNG算法是基于SHA-1算法實(shí)現(xiàn)且保密性較強(qiáng)的偽隨機(jī)數(shù)生成器。
在SHA1PRNG中,有一個(gè)種子產(chǎn)生器,它根據(jù)配置執(zhí)行各種操作。
1)如果java.security.egd
屬性或securerandom.source
屬性指定的是”file:/dev/random”或”file:/dev/urandom”,那么JVM會(huì)使用本地種子產(chǎn)生器NativeSeedGenerator,它會(huì)調(diào)用super()
方法,即調(diào)用SeedGenerator.URLSeedGenerator(/dev/random)
方法進(jìn)行初始化。
2)如果java.security.egd
屬性或securerandom.source
屬性指定的是其它已存在的URL,那么會(huì)調(diào)用SeedGenerator.URLSeedGenerator(url)
方法進(jìn)行初始化。
這就是為什么我們設(shè)置值為”file:///dev/urandom”或者值為”file:/./dev/random”都會(huì)起作用的原因。
在這個(gè)實(shí)現(xiàn)中,產(chǎn)生器會(huì)評估熵池(entropy pool)中的噪聲數(shù)量。隨機(jī)數(shù)是從熵池中進(jìn)行創(chuàng)建的。當(dāng)讀操作時(shí),/dev/random設(shè)備會(huì)只返回熵池中噪聲的隨機(jī)字節(jié)。/dev/random非常適合那些需要非常高質(zhì)量隨機(jī)性的場景,比如一次性的支付或生成密鑰的場景。
當(dāng)熵池為空時(shí),來自/dev/random的讀操作將被阻塞,直到熵池收集到足夠的環(huán)境噪聲數(shù)據(jù)。這么做的目的是成為一個(gè)密碼安全的偽隨機(jī)數(shù)發(fā)生器,熵池要有盡可能大的輸出。對于生成高質(zhì)量的加密密鑰或者是需要長期保護(hù)的場景,一定要這么做。
那么什么是環(huán)境噪聲?
隨機(jī)數(shù)產(chǎn)生器會(huì)手機(jī)來自設(shè)備驅(qū)動(dòng)器和其它源的環(huán)境噪聲數(shù)據(jù),并放入熵池中。產(chǎn)生器會(huì)評估熵池中的噪聲數(shù)據(jù)的數(shù)量。當(dāng)熵池為空時(shí),這個(gè)噪聲數(shù)據(jù)的收集是比較花時(shí)間的。這就意味著,Tomcat在生產(chǎn)環(huán)境中使用熵池時(shí),會(huì)被阻塞較長的時(shí)間。
解決
有兩種解決辦法:
1)在Tomcat環(huán)境中解決
可以通過配置JRE使用非阻塞的Entropy Source。
在catalina.sh中加入這么一行: -Djava.security.egd=file:/dev/./urandom
即可。
加入后再啟動(dòng)Tomcat,整個(gè)啟動(dòng)耗時(shí)下降到Server startup in 2912 ms。
2)在JVM環(huán)境中解決
打開$JAVA_PATH/jre/lib/security/java.security這個(gè)文件,找到下面的內(nèi)容:
securerandom.source=file:/dev/urandom
替換成
securerandom.source=file:/dev/./urandom
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Apache虛擬主機(jī)VirtualHost配置項(xiàng)詳解
在Apache中,VirtualHost容器用于定義一個(gè)虛擬主機(jī)的配置,它允許在單一的物理服務(wù)器上托管多個(gè)不同的網(wǎng)站,每個(gè)網(wǎng)站可以有自己的域名、文檔根目錄、錯(cuò)誤日志等,這篇文章主要介紹了Apache虛擬主機(jī)VirtualHost配置項(xiàng)詳解,需要的朋友可以參考下2024-07-07Linux平臺安裝redis及redis擴(kuò)展的方法
這篇文章主要介紹了Linux平臺安裝redis及redis擴(kuò)展的方法,較為詳細(xì)的分析了Linux平臺redis安裝步驟、操作命令與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-08-08Linux無法為立即文檔創(chuàng)建臨時(shí)文件:設(shè)備上沒有空間的問題解決
這篇文章主要介紹了Linux無法為立即文檔創(chuàng)建臨時(shí)文件的問題解決方案,文中通過圖文結(jié)合的形式講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-10-10Linux Ubuntu實(shí)現(xiàn)查看磁盤剩余空間及內(nèi)存
這篇文章主要介紹了Linux Ubuntu實(shí)現(xiàn)查看磁盤剩余空間及內(nèi)存方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Linux中搭建完整的samba服務(wù)器全攻略(centos版)
smb是一個(gè)協(xié)議名,它能被用于Web連接和客戶端與服務(wù)器之間的信息溝通。這篇文章主要介紹了Linux中搭建samba服務(wù)器全攻略(centos版),需要的朋友可以參考下2018-11-11socket unix domain IPC的實(shí)例代碼
下面小編就為大家?guī)硪黄猻ocket unix domain IPC的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12Linux虛擬機(jī)&Docker安裝RabbitMQ方式
這篇文章主要介紹了Linux虛擬機(jī)&Docker安裝RabbitMQ方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07linux expect 自動(dòng)登錄交換機(jī)保存配置的方法
今天小編就為大家分享一篇linux expect 自動(dòng)登錄交換機(jī)保存配置的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07centeros7 安裝配置環(huán)境jdk1.8的教程
這篇文章主要介紹了centeros7 安裝配置環(huán)境jdk1.8的教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09