先来看一段tomcat8启动日志:
SecureRandom.pngtomcat7/8在启动时都会用到org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom生成一个SecureRandom实例作为session ID的生成器。而在有的时候会发现这个步骤比较耗时:
SecureRandom-1.png这将直接影响tomcat的启动速度。
接下来看看为什么会这样,有时候快,有时候慢。
linux系统中的/dev/random与/dev/urandom
在linux系统的/dev下,有两个文件:random和urondom。他们是linux系统中提供的随机数伪设备,对外提供永不为空的随机字节数据流。很多解密程序与安全应用程序需要他们提供的随机数据流。
这两个设备的差异在:
/dev/random
/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用。
/dev/random设备可以保证数据的随机性。/dev/random设备被读取的越多,它的响应越慢。
在生成高质量的加密密钥或者是需要长期保护的场景,需要使用/dev/random。
/dev/urandom
/dev/urandom不依赖系统的中断,所以不会造成进程忙等待,但是数据的随机性也不高。/dev/urandom是非阻塞式的。
解决tomcat启动慢
在上面的截图中,tomcat使用的就是阻塞式的/dev/random,一次启动是12号,一次是17号,这期间也陆续有重启操作。可以看到17号的耗时明显大于12号。解决这个问题的很简单,tomcat读取这个就是为了生成session ID使用,对随机性的要求没那么高,所以解决方案就是让tomcat使用/dev/urandom。可通过下面方式进行配置:
1. 修改tomcat的bin下的catalina.sh文件
在catalina.sh脚本中加入:
-Djava.security.egd=file:/dev/./urandom
至于中间为什么要有一个点,有的人说是jdk的bug,也有人说不是,反正这样配置就对了。
2. 配置jdk路径下的java.security
java.security文件在$JAVA_PATH/jre/lib/security/下,可以用find / -name "java.security"定位。打开文件之后找到如下内容:
# By default, an attempt is made to use the entropy gathering device
# specified by the "securerandom.source" Security property. If an
# exception occurs while accessing the specified URL:
#
# SHA1PRNG:
# the traditional system/thread activity algorithm will be used.
#
# NativePRNG:
# a default value of /dev/random will be used. If neither
# are available, the implementation will be disabled.
# "file" is the only currently supported protocol type.
#
# The entropy gathering device can also be specified with the System
# property "java.security.egd". For example:
#
# % java -Djava.security.egd=file:/dev/random MainClass
#
# Specifying this System property will override the
# "securerandom.source" Security property.
#
# In addition, if "file:/dev/random" or "file:/dev/urandom" is
# specified, the "NativePRNG" implementation will be more preferred than
# SHA1PRNG in the Sun provider.
#
securerandom.source=file:/dev/random
可以看到对于这个配置的描述,将
securerandom.source=file:/dev/random
改成
securerandom.source=file:/dev/./urandom
接下来再启动tomcat可以发现时间缩短了。
网友评论