tomcat 启动速度慢背后的真相
1. tomcat 启动慢在线上环境中,我们经常会遇到类似的问题,就是tomcat 启动比较慢,查看内存和cpu,io都是正常的,但是启动很慢,有的时候长达几分钟,这到底是什么原因导致的。 1.1 tomcat 获取随机值阻塞? tomcat的启动需要产生session id,这个产生需要通过
我们通过查看java.security 文件,(我的java版本是1.8.0_131) 发现依赖的是/dev/random tomcat 启动产生session id 最终依赖的是/dev/random ,/dev/random 又依赖于熵池, 对于熵池,百度百科这样写到
那么如何查看熵池 的大小,文件 /proc/sys/kernel/random/entropy_avail 保存着 熵池的大小。/proc/sys/kernel/random/poolsize 保存着熵池的最大容量,单位都是bit。
总结 tomcat 启动慢的原因是随机数产生遭到阻塞,遭到阻塞的原因是 熵池大小 。 解决方法:
1 . 更换产生随机数的源 ? 官方文档链接 ? 因为/dev/urandom 是非阻塞的随机数产生器,所以我们可以从这边获取,但是生产的随机数的随机性比较低。我们可以在 我们的tomcat启动脚本(catalina.sh)里面添加
或者是更改java的java.security 文件,将securerandom.source=file:/dev/random
? 注意一下,为什么我们这里使用的路径是"/dev/./urandom",而不是 "/dev/urandom",是因为在java 8之前的版本设置了/dev/urandom ,但是实际还是使用/dev/random,设置为"/dev/./urandom"才能正常使用 "/dev/urandom" , 这个bug在java8版本已经修复了,如果你是java7版本的话,需要按照上面设置,java8的话可以不用加 "./"。官方bug链接 2 .增大熵池 的值 要增大熵池 的值首先得你的cpu支持DRNG 特性, 如何查看我们的服务器的是否支持DRNG特性?
如果不支持的话,那么就只能通过上面的第一种方法来解决了 安装rngd服务(关于rngd服务的介绍)
然后我们进行查看我们的熵池 的值,会发现变大了
然后我们启动tomcat 会发现启动速度快很多。 1.2 tomcat 需要部署的web应用程序太多? 有的时候,我们tomcat启动比较慢是因为它需要部署的web应用程序太多,但是其中有些应用程序是我们不需要的,比如在webapps下的 doc 、example、ROOT 等等,我们可以将我们不需要的webapps删除,然后再进行发布,这些不需要的web,不仅会占用我们的资源,还有可能是入侵者的入侵对象。如果我们想并行启动多个web应用程序,我们可以Host 的属性 startStopThreads 值设置大于1 ,但这也取决于我们的服务器是不是多核的。如果是多核的建议调大 startStopThreads 的值,但不超过内核数。 1.3 tomcat启动内存不足? 如果是项目比较大的话,我们使用默认的参数去启动的tomcat是很有可能内存不足的,我们需要设置JVM,将内存调整,JVM 的最大值和最小值建议是不要相差太大(最好一致.) 在启动脚本catalina.sh加上:
具体的内存大小,根据业务调整。 以上就是解决tomcat 启动慢的问题和解决方案,可根据自己的项目情况进行使用。后面也会有一篇tomcat 调优的文章,请大家点波关注哦。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |