1. tomcat 启动慢

在线上环境中,我们经常会遇到类似的问题,就是tomcat 启动比较慢,查看内存和cpu,io都是正常的,但是启动很慢,有的时候长达几分钟,这到底是什么原因导致的。

1.1 tomcat 获取随机值阻塞

​ 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版本是1.8.0_131) 发现依赖的是/dev/random

tomcat 启动产生session id 最终依赖的是/dev/random ,/dev/random 又依赖于熵池,

对于熵池,百度百科这样写到

     Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。

那么如何查看熵池 的大小,文件 /proc/sys/kernel/random/entropy_avail 保存着 熵池的大小。/proc/sys/kernel/random/poolsize 保存着熵池的最大容量,单位都是bit。

[root@haha cwd]# cat  /proc/sys/kernel/random/entropy_avail
146

总结 tomcat 启动慢的原因是随机数产生遭到阻塞,遭到阻塞的原因是 熵池大小 。

解决方法:

  1. 更换产生随机数的源,(也是tomcat的官方文档的启动比较慢的解决办法)
  2. 增大熵池 的值

1 . 更换产生随机数的源

​ 官方文档链接

​ 因为/dev/urandom 是非阻塞的随机数产生器,所以我们可以从这边获取,但是生产的随机数的随机性比较低。我们可以在 我们的tomcat启动脚本(catalina.sh)里面添加

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

或者是更改java的java.security 文件,将securerandom.source=file:/dev/random

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

​ 注意一下,为什么我们这里使用的路径是"/dev/./urandom",而不是 "/dev/urandom",是因为在java 8之前的版本设置了/dev/urandom ,但是实际还是使用/dev/random,设置为"/dev/./urandom"才能正常使用 "/dev/urandom" , 这个bug在java8版本已经修复了,如果你是java7版本的话,需要按照上面设置,java8的话可以不用加 "./"。官方bug链接

2 .增大熵池 的值

要增大熵池 的值首先得你的cpu支持DRNG 特性, 如何查看我们的服务器的是否支持DRNG特性?

cat /proc/cpuinfo | grep rdrand

如果不支持的话,那么就只能通过上面的第一种方法来解决了

安装rngd服务(关于rngd服务的介绍)

yum -y install rng-tools
systemctl enable   rngd
systemctl start  rngd

然后我们进行查看我们的熵池 的值,会发现变大了

 cat  /proc/sys/kernel/random/entropy_avail

然后我们启动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加上:

JAVA_OPTS='-server -Xms1024m -Xmx1024m'

具体的内存大小,根据业务调整。

以上就是解决tomcat 启动慢的问题和解决方案,可根据自己的项目情况进行使用。后面也会有一篇tomcat 调优的文章,请大家点波关注哦。

转载于:https://www.cnblogs.com/operationhome/p/10494620.html

tomcat 启动速度慢背后的真相相关推荐

  1. Jvm 系列(十一)Java 语法糖背后的真相

    语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言 ...

  2. 有关 VS Code 的五大谣言,背后的真相到底是如何的?

    2015 年 4 月 29 日,在微软 Build 2015 大会上,微软发布了 Visual Studio Code 第一个预览版本.随着 Visual Studio Code 有了越来越多的使用者 ...

  3. 内嵌tomcat启动速度慢

    项目上最近要把内置的jetty换成tomcat, 来更好的支持servlet 3.0 本来以为换个容器, 几十行代码就好了. 实际上换了tomcat后, 一开始启动tomcat, 非常的慢. jett ...

  4. Tomcat 启动速度慢,一直转圈的原因

    问题现象 在新安装的centos7 系统上Tomcat启动很慢.开始我以为是程序写的问题,所以把webapps下所有程序都删除掉.(只保留Tomcat自带)灵异的事情发生了,Tomcat停止在--彻底 ...

  5. 网络营销推广怎么做 一封神奇的文案策划背后的真相

     网络营销推广怎么做 很多人觉得销售高手总有与众不同的魅力,他们是少数的精英人士,有着四天王的血统,转轮王的相貌,我们望尘莫及!其实这些概念都是误区,你知道吗?如果我在这里把这层神秘的面纱揭开,那么销 ...

  6. 美团外卖强杀门背后的真相,你看到的是真的吗?

    美团外卖"强杀门"背后的真相,你看到的是真的吗? 最近知乎上的文章 [ 如何评价美团外卖商家版强杀竞争对手的商家版 App 进程 ]非常火,初看到这个文章的时候确实笔者也是义愤填膺 ...

  7. 炸鸡鸭背后的真相 —— 一位良心发现者的自白[转]--希望提起大家的注意力

    炸鸡鸭背后的真相 -- 一位良心发现者的自白 学习传统文化一年多了,今年四月,偶然回家乡一趟,闻到满大街油炸食品的香味,想起两年前我做炸鸡鸭生意时的一段生涯,真的是不堪回首,因此把一些永生难忘的经历写 ...

  8. cf3月14服务器维护,CF3月14在线活动背后的真相详情

    穿越火线官方即将在3月14日为所有的小伙伴们准备一个3.14在线盛典好礼活动,大量黄金武器.英雄级武器以及稀有永久武器等着小伙伴们来领取.但是有论坛水友分析出这个活动背后的真相,一起随我们看看吧! C ...

  9. 频繁跳槽真的好吗?十年资深HR告诉你背后的真相!!!

    导读 昨天,帮一位小妹妹指导简历和面试,发现她有很严重的频繁跳槽现象,而且从毕业起跨越了三个行业,最长的一份工作也仅仅是干满了一年而已. 这并不是个案,在常年的招聘中,我发现很多初入职场的年轻人都存在 ...

最新文章

  1. 分享26个关于Java开发视频教程(免费下载)
  2. 北京钛谷诚泽网络通讯科技有限公司
  3. 字符识别Python实现 图片验证码识别
  4. python字符串小数转化整数_python – Pandas将字符串列和NaN(浮点数)转换为整数,保持NaN...
  5. 为什么relativelayout.layoutParams的width为-1
  6. java中final的意义
  7. STM32----ADC多通道采集
  8. 一阶倒立摆的输入和输出是什么_了解一阶高通滤波器传递函数
  9. Spring源码分析之SpringMVC的DispatcherServlet是如何处理Http请求的
  10. git pull的理解 以及 git conflict的解决
  11. abp 基于api接口的页面内容提交
  12. TCP和UDP Socket
  13. 为什么 我的博客还没文章?
  14. 11.13 什么是媒体?什么是媒体引用?媒体引用的本地同步?
  15. cdn 导致跨域问题
  16. 微信表情商店视频动态暂停使用 6日恢复
  17. java汉诺塔递归算法
  18. 分享一个我常用的信息差赚钱渠道
  19. 角度值计算机符号,数学角度符号_请问各种数学符号的读音比如αβγδελζηθξσφψω等等的读音_淘题吧...
  20. 基于异质图神经网络的未知恶意程序检测

热门文章

  1. SQL Server 查询表备注信息的语句
  2. ASCII码、HEX、字符、BCD 等等 基础知识思考
  3. centos 下使用sublime
  4. ichat在线客服jQuery插件(可能是历史上最灵活的)
  5. Lession 14 Do you speak Englist?
  6. springmvc 中文文档
  7. css --- [读书笔记] 盒模型(边框、内外边距)
  8. vue --- 基本的表单元素
  9. Mysql:This version of MySQL doesn’t yet support ‘LIMIT IN/ALL/ANY/SOME 错误解决
  10. Linux系统rootpassword改动