您的位置:首页 > 运维架构 > Tomcat

tomcat启动慢的原因分析

2016-06-29 00:00 288 查看
摘要: 熵池阻塞导致tomcat启动非常慢

Tomcat严重依赖SecureRandom这个类为它的session id或其它地方取得随机数值,这取决于你的JRE。

它有可能在tomcat启动时造成非常大的耗时,比如,在启动tomcat的时候,它耗时有时候会达到3分钟。

INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [XXXXXXX] milliseconds

要解决这个问题,可以通过配置JRE使用非阻塞的Entropy Source,在bin/catalina.sh中加入这么一行:-Djava.scurity.egd=file:/dev/./urandom。

或者通过修改jre来解决这个阻塞的问题:

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

问题的核心是指向随机密码生成器中,关于环境噪音采集部分的处理。所谓环境噪音,就是来自各个设备驱动与其它来源的二进制数据,也称之为熵。熵池则是存储这些噪音数据的地方。当熵池为空的时候,采用/dev/random会存在阻塞。但是,检查环境配置,安装的java是采用/dev/urandom进行处理。其模式是熵池为空时,非阻塞。很显然,还不止如此,从stackoverflow链接中可以找到一段描述,解释了为何jdk用了/dev/urandom,但是还是不生效。
随机数生成器,基于SHA1PRNG。而SHA1PRNG重度依赖高质量的种子,如果种子不够好,随机数结果将可被预测。因此开发人员需要确保/dev/random被用作熵的来源,即便JVM配置为使用/dev/urandom。所以切换熵源为/dev/urandom,也需要确保/dev/random有足够的熵。

关于这个问题在java.com里有这么类似的小插曲:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6202721

stackoverflow关于该问题的一些解答:
http://stackoverflow.com/questions/26431922/tomcat7-starts-too-late-on-ubuntu-14-04-x64-digitalocean/26432537#26432537

关于tomcat启动快的策略在apache的官方也有相应的文档有描述

http://wiki.apache.org/tomcat/HowTo/FasterStartUp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tomcat SecureRandom java