去年刚开始遇到这样的问题很郁闷,总以为是服务器的问题,网上的也不好找到很好的答案,花了不少时间,现在感觉这样的问题多了网上的答案也随之很多
启动巨慢问题分析:
启动慢主要是卡在初始化 Session,通过搜索和分析,Tomcat 的 SessionID 是通过 SHA1PRNG 算法计算得到的,SHA1 算法需要一个密钥,这个密钥在 Tomcat 启动的时候随机生成一个,生成是使用了 Linux 随机函数生成器/dev/random。读取它相当于生成随机数字。搜索/dev/random,大概知道是什么鬼了:/dev/random会根据 噪音 产生随机数,如果噪音不够它就会阻塞。Linux 是通过 I/O,键盘终端、内存使用量、CPU 利用率等方式来收集噪音的,如果噪音不够生成随机数的时候就会被阻塞。
解决方案A和B
A.使用伪随机函数生成器/dev/unrandom /dev/urandom并不是真正的随机行为(其实一般不容易重复),主要有两个地方可以修改。
- 通过修改 Tomcat 启动文件 -Djava.security.egd=file:/dev/urandom
- 通过修改 JRE 中的 java.security 文件 securerandom.source=file:/dev/urandom
B.增大/dev/random的熵池(推荐) 问题的原因是由于熵池不够大,所以增大它是最彻底的方法。我们可以通过软件的方法实现,下面是软件的安装和配置流程。
- 安装熵服务
yum install rng-tools - 启动熵服务
systemctl start rngd - 如果你的 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 - 重新载入服务
systemctl daemon-reload systemctl restart rngd
经过上面的修改,我们再观察 /proc/sys/kernel/random/entropy_avail 基本上在 3000 左右。这个时候重新启动 Tomcat,发现启动时间正常。
这两种方案A自己没有试过,也是网上看的,我一般用的是B方案,安装熵服务和启动熵服务这两步操作就可以了,最好是在linux的根目录下操作
本文分析了Tomcat启动速度缓慢的原因,主要集中在初始化Session时的随机数生成问题。介绍了两种解决方案:一是修改Tomcat使用伪随机数生成器/dev/urandom;二是通过安装和配置熵服务rng-tools增加熵池大小,从而提高随机数生成效率。

3462

被折叠的 条评论
为什么被折叠?



