Tomcat启动慢的测试与解决

问题:

关于Tomcat的session ID启动慢问题,相信大家已经都比较熟悉了,如果不熟悉请参考下面三篇文章:

1.  循循善诱的写程序的康德《彻底找到Tomcat启动速度慢的元凶》

2. Oracle官方Bug讲解: 《JDK-4705093 : Use /dev/urandom rather than /dev/random if it exists》

3. 被无数人复制了无数次的 《Docker中apache-tomcat启动慢的问题》

现象:

如下图所示:启动用时的30秒,基本都消耗在箭头指向的Warning里了,我们看一下Warning的具体内容:

WARNING [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [28,344] milliseconds.

正是人见人恨的产生SessionId时的SecureRandom问题。


测试解决:

测试环境:阿里云的最低配(要哭)

第一种方法:修改Java

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

  securerandom.source=file:/dev/urandom (或者 securerandom.source=file:/dev/random)
  替换成

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

  (这里加粗的u一定要带上)

  修改后结果:Server startup in 1904 ms

第二种方法:修改/apache-tomcat-8.5.16/bin/catalina.sh 

  在catalina.sh中的 “#!/bin/sh” 下面添加如下代码:

if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then
    JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
fi

  修改后的结果: Server startup in 1899 ms

第三种方法:添加环境变量

在/etc/profile里添加环境变量:

    export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"


结论:

    可见,不论是修改Java的Security还是配置Tomcat的Java参数,本质上都是不再堵塞调用/dev/random进行SessionId的生成,产生的效果也是一致的。

    第三种最简单,其实和方法二一样了




版权声明:本文为wangfei0904306原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。