docker+tomcat 启动时非常慢原因之JRE /dev/random阻塞

Posted 低调人生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker+tomcat 启动时非常慢原因之JRE /dev/random阻塞相关的知识,希望对你有一定的参考价值。

docker+tomcat 启动时非常慢,一般正常启动几十秒的,发现docker+tomcat启动竟需要几分钟,不可思议

根本原因是 SecureRandom 这个 jre 的工具类的问题。那为什么 SecureRandom generateSeed 这么慢,甚至挂在 Linux 操作系统呢?

Tomcat 7/8 都使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 类产生安全随机类 SecureRandom 的实例作为会话 ID。

SecureRandom generateSeed  使用 /dev/random 生成种子。但是 /dev/random 是一个阻塞数字生成器,如果它没有足够的随机数据提供,它就一直等,这迫使 JVM 等待。键盘和鼠标输入以及磁盘活动可以产生所需的随机性或熵。但在一个服务器缺乏这样的活动,可能会出现问题。

 

有2种解决方案:

1. 在Tomcat环境中解决:

可以通过配置 JRE 使用非阻塞的 Entropy Source:

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

 

2. 在 JVM 环境中解决(本人使用此方法):

打开jdk安装路径 $JAVA_PATH/jre/lib/security/java.security 这个文件,找到下面的内容:

securerandom.source=file:/dev/random

 

替换成:

securerandom.source=file:/dev/./urandom

 

问题完美解决

这里值为何要在 dev 和 random 之间加一个点呢?是因为一个 JDK 的 bug,有人反馈即使对 securerandom.source 设置为 /dev/urandom 它也仍然使用的 /dev/random,有人提供了变通的解决方法,其中一个变通的做法是对 securerandom.source 设置为 /dev/./urandom 才行。也有人评论说这个不是 bug,是有意为之。

以上是关于docker+tomcat 启动时非常慢原因之JRE /dev/random阻塞的主要内容,如果未能解决你的问题,请参考以下文章

tomcat启动非常慢原因深入分析

myeclipse6.5 启动tomcat 特别慢,请高手分析下原因。

tomcat8启动慢原因及解决办法

IntelliJ IDEA 调试(debug)时非常慢的原因

tomcat启动越来越慢了?

Eclipse启动项目超级的慢,这是为啥