tomcat启动信息:Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [370,632] milliseconds.
一、问题来源:
在新的服务器上搭建了新的后台,环境:Linux + tomcat 7 + JDK1.8 。
部署tomca项目,发现启动过程非常久,用时6分钟左右,查看 catalina.out 文件,日志信息如下:
Oct 24, 2018 5:14:03 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [370,632] milliseconds.
Oct 24, 2018 5:14:05 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-58020"]
Oct 24, 2018 5:14:05 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 377732 ms
特别注意这条信息:
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [370,632] milliseconds.
在正常启动情况下,是不会有这条提示信息的。
二、解决办法:两种
1、在 JVM 环境中解决 -- 修改JVM参数
打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容:
securerandom.source=file:/dev/random (在JDK1.8中是 /random )
securerandom.source=file:/dev/urandom (在JDK1.7中是 /urandom )
(都)修改为:
securerandom.source=file:/dev/./urandom
2、在Tomcat环境中解决 -- 配置JRE使用非阻塞 Entropy Source
在 catalina.sh 文件中加入一行:-Djava.security.egd=file:/dev/./urandom
解决之后,tomcat启动的日志信息如下:仅用时6秒多。
Oct 25, 2018 12:38:03 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-58020"]
Oct 25, 2018 12:38:03 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 6876 ms
三、问题根本原因分析
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [370,632] milliseconds.
Tomcat 7/8 都使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 类产生安全随机类 SecureRandom 的实例作为会话 session ID ,使用 SHA1PRNG 算法。
SHA1PRNG算法是基于SHA-1算法实现且保密性较强的伪随机数生成器。在 SHA1PRNG 算法中,有一个种子产生器,可以根据配置执行各种操作。
在Linux中随机数可以从两个特殊的文件中产生:
1)/dev/random:阻塞随机数产生器(locked)。反复使用熵池中的数据来产生伪随机数,当不能产生新的随机数时,会阻塞,直到能产生新的随机数才返回。因此随机效果好。/random 非常适合那些需要非常高质量随机性的场景,比如一次性的支付或生成密钥的场景。
2)/dev/urandom:非阻塞的随机数产生器(unlocked)。反复使用熵池中的数据来产生伪随机数,当不能产生新的随机数时,不会阻塞。因此随机数产生效果不太好。
两者产生随机数的原理都是利用当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回。
什么是熵池?
熵池(entropy pool)就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等。如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,而当前需要大量的随机比特,这时产生的随机数的随机效果就不太好。
为什么 tomcat 启动慢?
在JDK1.8中,/jre/lib/security/java.security 文件中默认使用的是 /dev/random (阻塞)。随机数产生器会评估熵池中的噪声数据的数量,当熵池为空时,来自/dev/random的读操作将被阻塞,直到熵池收集到足够的环境噪声数据,这个收集噪声数据过程就要花一定的时间,即会被阻塞较长的时间,所以,tomcat 启动慢。
修改为 /dev/./urandom(非阻塞)后,不会被阻塞,产生大量随机数的速度就比 /dev/random 快得多,tomcat 启动就快多了。