技巧 24周 Tomcat8启动非常慢

1,514 阅读2分钟

Tomcat8部署War启动时间非常长。 场景1:所有war包启动都慢 场景2:第一次启动以外都很慢

总结目前解决多种方法

1、随机数获取问题(本人试过无效)

catalina.sh 中加入

-Djava.security.egd=file:/dev/./urandom

如下

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

具体原因(转载): Tomcat的启动需要产生session id,这个产生需要通过java.security.SecureRandom生成随机数来实现,随机数算法使用的是”SHA1PRNG”,但这个算法依赖于操作系统的提供的随机数据,在linux系统中,这个值又依赖于/dev/random 和/dev/urandom

/dev/random :阻塞型,读取它就会产生随机数据,但该数据取决于熵池噪声,当熵池空了,对/dev/random 的读操作也将会被阻塞。
/dev/urandom :非阻塞的随机数产生器,它会重复使用熵池中的数据以产生伪随机数据。
这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。
它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。

通过查看java.security文件可以了解具体采用哪种方式,java.security文件调整urandom也行

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

2、调整为NIO模式(TOMCAT8默认为NIO模式)(转载)

TOMCAT启动分为bio、nio、apr

bio(blockingIO) 阻塞式IO,Tomcat6及以前版本默认运行模式,性能非常低下,没有经过任何优化处理。

nio(noblocking IO) 非阻塞式IO,Tomcat7以后的版本默认运行模式,利用java异步IO技术使Tomcat运行性能有所提升。

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8543" />

如果要在Tomcat6开启NIO模式,直接修改server.xml里的Connector节点,修改protocol为

<Connector port="8080" 	           
protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000"
               redirectPort="8543" />

org.apache.coyote.http11.Http11NioProtocol,启动生效。

Tomcat8默认配置启动完后最后三行日志如下:

http-nio-8180 ajp-nio-8109 说明默认以nio模式运行。

3、JarScanFilter Jar包扫描配置

conf/context.xml加入一下配置 该配置主要用常用于跳过一些已知无相关jar包的扫描

<Context>
    <JarScanner>
        <JarScanFilter defaultPluggabilityScan="false" />
    </JarScanner>
</Context>

启动时间减少一半左右 以上配置理由目前还不太理解。参考官方文档

注意: 目前还是不知道具体问题。公司一共有好几个docker环境,都是相同镜像拷贝。但是其中一个环境什么都没有改,启动就非常快,其他环境就很慢。所以继续研究