最近項(xiàng)目上線(xiàn)部署的時(shí)候侥猩,發(fā)現(xiàn)一個(gè)問(wèn)題。Tomcat在啟動(dòng)過(guò)程中耗費(fèi)了很長(zhǎng)的時(shí)間。查看日志蝶溶,發(fā)現(xiàn)耗時(shí)最長(zhǎng)的地方是:
INFO?[localhoststartStop1]?org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom?Creation?of?SecureRandom?instance?for?session?ID?generation?using?[SHA1PRNG]?took?[1,293,533]?milliseconds.
在網(wǎng)上查找資料后確定吓妆,該問(wèn)題是由于tomcat的session id的生成主要通過(guò)java.security.SecureRandom生成隨機(jī)數(shù)來(lái)實(shí)現(xiàn)赊时,隨機(jī)數(shù)算法使用的是”SHA1PRNG”。在sun/oracle的jdk里行拢,這個(gè)算法的提供者在底層依賴(lài)到操作系統(tǒng)提供的隨機(jī)數(shù)據(jù)蛋叼,在linux上,與之相關(guān)的是/dev/random和/dev/urandom。有關(guān)它倆的描述如下:
/dev/random
在讀取時(shí)狈涮,/dev/random設(shè)備會(huì)返回小于熵池噪聲總數(shù)的隨機(jī)字節(jié)狐胎。/dev/random可生成高隨機(jī)性的公鑰或一次性
密碼本。若熵池空了歌馍,對(duì)/dev/random的讀操作將會(huì)被阻塞握巢,直到收集到了足夠的環(huán)境噪聲為止。
/dev/urandom
dev/random的一個(gè)副本是/dev/urandom?(”unlocked”松却,非阻塞的隨機(jī)數(shù)發(fā)生器)暴浦,它會(huì)重復(fù)使用熵池中的數(shù)據(jù)
以產(chǎn)生偽隨機(jī)數(shù)據(jù)。這表示對(duì)/dev/urandom的讀取操作不會(huì)產(chǎn)生阻塞晓锻,但其輸出的熵可能小于/dev/random的歌焦。它
可以作為生成較低強(qiáng)度密碼的偽隨機(jī)數(shù)生成器,不建議用于生成高強(qiáng)度長(zhǎng)期密碼砚哆。
在tomcat的文檔里的建議独撇,采用非阻塞的熵源(entropy source),通過(guò)java系統(tǒng)屬性來(lái)設(shè)置:
-Djava.security.egd=file:/dev/./urandom
這個(gè)系統(tǒng)屬性egd表示熵收集守護(hù)進(jìn)程(entropy gathering daemon)躁锁,但這里值為何要在dev和random之間加一個(gè)點(diǎn)呢纷铣?是因?yàn)橐粋€(gè)jdk的bug,在這個(gè)bug的連接里有人反饋及時(shí)對(duì) securerandom.source 設(shè)置為?/dev/urandom?它也仍然使用的?/dev/random战转,有人提供了變通的解決方法搜立,其中一個(gè)變通的做法是對(duì)securerandom.source設(shè)置為?/dev/./urandom?才行。也有人評(píng)論說(shuō)這個(gè)不是bug槐秧,是有意為之啄踊。
我的最終解決方法如下:
找到?$JAVA_HOME/jre/lib/security/java.security?這個(gè)文件,找到里面的
securerandom.source=file:/dev/random
或者
securerandom.source=file:/dev/urandom
修改為
securerandom.source=file:/dev/./urandom
原文地址:http://www.roncoo.com/article/detail/125962