Tomcat启动时SecureRandom非常慢

今天重置服务器并重新安装 tomcat 的时候,原来的项目突然需要很长时间才可以启动,于是进行了一番排查...

21-Feb-2019 17:56:58.631 WARNING [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [425,505] milliseconds.

查看 Tomcat 日志发现上面的问题。

网上说是 SecureRandom generateSeed 的原因,当会使用 /dev/random 生成种子。但是 /dev/random 是一个阻塞数字生成器,如果它没有足够的随机数据提供,它就一直等,这迫使 JVM 等待。

解决方案大致为两种:

1.在Tomcat环境中解决:
在 catalina.sh 中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。

2.在 JVM 环境中解决:
打开 $JAVA_PATH/jre/lib/security/java.security 这个文件,找到下面的内容:
securerandom.source=file:/dev/random
替换成:
securerandom.source=file:/dev/./urandom

那么是什么原因导致 Tomcat 突然就慢了呢?

原因出在这是一台新的 Linux 服务器。

Tomcat 的 session id 的生成主要通过 java.security.SecureRandom 生成随机数来实现,随机数算法使用的是”SHA1PRNG”。

在linux上,与之相关的是 /dev/random 和 /dev/urandom。这两个设备会返回小于熵池噪声总数的随机字节。若熵池空了,对/dev/random 的读操作将会被阻塞,直到收集到了足够的环境噪声(鼠标、键盘、输入等)为止。

而我今天启动的是一台新的刚刚装好的 Linux 系统,并且 Tomcat 在启动的时候在使用 /dev/random 这个阻塞随机数获取,从而出现上面的长时间的耗时。

你可能感兴趣的:(Tomcat启动时SecureRandom非常慢)