系统环境
- 腾讯云服务器
- CentOS 7.2
问题描述
通过URL访问网站迟迟加载不出来,一直处于等待响应状态,通过命令查看tomcat的启动日志发现tomcat启动时间很长。
问题分析
通过仔细观察日志,tomcat启动主要是卡在了初始化 Session步骤。通过搜索和分析,Tomcat 的 SessionID 是通过 SHA1PRNG 算法计算得到的,SHA1 算法需要一个密钥,这个密钥在 Tomcat 启动的时候随机生成一个,生成是使用了 Linux 随机函数生成器/dev/random。读取它相当于生成随机数字。搜索/dev/random,大概知道是什么鬼了:/dev/random会根据 噪音 产生随机数,如果噪音不够它就会阻塞。Linux 是通过 I/O,键盘终端、内存使用量、CPU 利用率等方式来收集噪音的,如果噪音不够生成随机数的时候就会被阻塞,所以tomcat启动巨慢无比。
解决方案
方案一:使用伪随机函数生成器
使用伪随机函数生成器/dev/unrandom,/dev/urandom并不是真正的随机行为(其实一般不容易重复),主要有两个地方可以修改。
- 通过修改 Tomcat 启动文件 -Djava.security.egd=file:/dev/urandom
- 通过修改 JRE 中的 java.security 文件 securerandom.source=file:/dev/urandom
方案二:加大/dev/random的熵池(推荐)
问题的原因是由于熵池不够大,所以增大它是最彻底的方法。我们可以通过软件的方法实现,下面是软件的安装和配置流程。
1.安装熵服务
yum install rng-tools
2.启动熵服务
systemctl start rngd
3.如果你的 CPU 不支持 DRNG 特性或者像我一样使用虚拟机,可以使用/dev/unrandom来模拟。
cp /usr/lib/systemd/system/rngd.service /etc/systemd/system
vim /etc/systemd/system/rngd.service
#以下是编辑内容
ExecStart=/sbin/rngd -f -r /dev/urandom
4.重新载入服务
systemctl daemon-reload
systemctl restart rngd
经过上面的修改,我们再观察 /proc/sys/kernel/random/entropy_avail 基本上在 3000 左右。这个时候重新启动 Tomcat,发现启动时间正常。
点击查看原文
- 本文链接: http://hjwblog.com/archives/腾讯云服务器启动tomcat慢导致浏览器无法加载
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!