云服务器启动tomcat巨慢,很慢
增加随机数生成熵池
0、查看熵池
- cat /proc/sys/kernel/random/entropy_avail
1、
- yum install rng-tools
2、
- systemctl start rngd
3、
重复查看熵池
正文:
自己再阿里云申请了一台1G1核的机器,每次重启自己的服务tomcat都需要卡住很长时间,每次都是日志停在
Root WebApplicationContext: initialization completed in 744 ms这个地方,然后也不知道发生了什么,在等待
什么,网上看到了一篇博文,mark下
问题现象
美女同事找我解决一个问题,说Tomcat启动很慢。开始我以为是程序写的问题,所以把webapps下所有程序都删除掉。(只保留Tomcat自带)灵异的事情发生了,Tomcat停止在——
我查看了一下进程,Tomcat所在的JVM进程已经被启动了所以可以排除是JVM退出引起的问题。那么问题真的就是JVM因为某种原因被阻塞了。
分析
问题比较棘手,我排除了CPU、内存不足引起的问题;排除了硬盘空间不足引起的问题;我甚至去观察了网络I/O、硬盘I/O情况,都非常正常。程序被阻塞一般来说一定是要等待某个资源,而现在的情况是所有资源都充足,所以我几乎想不到是什么问题引起的。我开始怀疑是KVM
Hypervisor虚拟化的问题(用的是虚拟机)我改变了策略在VMWare开了两台虚拟机上直接下载Tomcat启动。其中一台很快启动,另一台居然也被阻塞,问题被重现了。眼看要在美女面前丢脸,我光辉伟岸的形象要荡然无存。这种情况下我不能去“撸”代码吧?况且Tomcat那么多人用,真有这么明显的Bug早就炸开锅了。(Tomcat还是很靠谱的不像xxxxStack那么狗屎)仔细想想我需要找到Tomcat停止在了哪里?代码里发生了什么事情,但是我又不可能去撸代码。无可奈何的情况下我决定试一下
strace,这是一个跟踪系统调用(System Call)的工具,无论是Java还是Pyhton很多资源申请都会变成都会变成System Call。(比如打开文件、新建线程、读写数据、等待I/O)通过这个工具我至少可以知道Tomcat是停止在哪个System Call上的,这样可以方便我推断出问题的原因。
strace -f -o strace.out ./catalina.sh run
strace有很多参数,我用了二个参数
-f 跟踪fork的子进程,通俗的说会跟踪所有线程的系统调用
-o把内容输出到文件
其他参数请自行搜索下面分析strace.out文件,分析的方法是从下往上(被阻塞的地方肯定是在最后咯)。首先我们需要去掉Tomcat停止引起的System Call,它们不是我们需要的。从后往前搜索找到SIGINT
红色部分以上就是引起阻塞的系统调用了,上面有一大堆一大堆的futex
的调用,它是Linux中的一种轻量级的同步方法,所以我们可以判断出最上面肯定是有某个System Call就是阻塞的真正元凶。跳过所有的futex
:
这个read
就是引起后面一串futex
的真正原因,strace非常聪明它不仅仅给出了System Call还给出了传递的参数和返回值,read读取的是51号文件句柄,没有返回成功(unfinished)。顺着这条路,我们看一下51号文件句柄是什么
/dev/random是Linux下的随机函数生成器,读取它相当于生成随机数字。搜索它,第一个是wiki
至此似乎一切真相大白了,/dev/random会根据噪音产生随机数,如果噪音不够它就会阻塞。Linux是通过I/O,键盘终端、内存使用量、CPU利用率等方式来收集噪音的,如果噪音不够生成随机数的时候就会被阻塞。
深入分析
如果用Tomcat /dev/random作为关键字基本上就能够回答我们的疑惑了。Tocmat的Session
ID是通过SHA1算法计算得到的,计算Session ID的时候必须有一个密钥。为了提高安全性Tomcat在启动的时候回通过随机生成一个密钥。在
http://wiki.apache.org/tomcat/HowTo/FasterStartUp
(Entropy
Source部分)有一段解释。stackoverflow上面也有一大批这方面的说明,所以这里就不再多做介绍。明白了问题的原因解决起来就非常简单了——替换/dev/random为/dev/unrandom,用伪随机函数生成器(/dev/urandom)来替代随机函数生成器(/dev/random)。
通过修改Tomcat启动文件-Djava.security.egd=file:/dev/urandom
通过修改JRE中的java.security文件securerandom.source=file:/dev/urandom
当然JVM的开发者不是傻瓜,Tomcat的开发者也不是二百五。他们之所以没有选择/dev/urandom是为了提高系统的安全性,/dev/urandom并不是真正的随机行为。(其实一般情况下/dev/urandom也是足够安全的不太容易被“重复”)
彻底解决问题
上面介绍的两种方式都是用/dev/urandom替换/dev/random,其实还有第三种方式——增大/dev/random的熵池。问题的原因是由于熵池不够大,所以增大它是最彻底的方法。通过cat
/proc/sys/kernel/random/entropy_avail
我们可以查看现在的熵池大小;我们需要找到一种方式来提高这个值就行了。如果你的CPU带有DRNG特性,可以充分利用硬件来提高熵池产生的速度 。通过cat /proc/cpuinfo | grep rdrand
可以查看自己的CPU是否支持,一般来说Intel的Ivy_Bridge架构的CPU都支持(i3、i5需要注意是否采用该种架构,i7和xeon基本上都支持);AMD的CPU在2015年以后生成的都支持。(如果你是虚拟机需要开启额外的参数)。如果你的硬件不支持,也没有关系,我们可以让/dev/unrandom来做“熵源”。以Centos7为例,
yum install rngd-tools
或者yum install rng-tools
安装rngd服务(熵服务)
systemctl start rngd
启动服务
如果你的CPU不支持DRNG特性或者像我一样使用虚拟机,可以使用/dev/unrandom来模拟。
cp /usr/lib/systemd/system/rngd.service /etc/systemd/system
编辑/etc/systemd/system/rngd.service
service小结,ExecStart=/sbin/rngd -f -r /dev/urandom
systemctl daemon-reload
重新载入服务
systemctl restart rngd
重启服务
经过上面的修改,我们再观察/proc/sys/kernel/random/entropy_avail
基本上在3000左右。我们可以测试一下随机数的生成速度
watch -n 1 cat /proc/sys/kernel/random/entropy_avail
观察这个值
新打开一个shell,用dd命令测试随机数。dd if=/dev/random of=random.dat count=40960
[root@localhost bin]# dd if=/dev/random of=random.dat
count=40960记录了0+40960 的读入记录了6004+1 的写出3074362字节(3.1 MB)已复制,5.01017 秒,614
kB/秒
5秒产生了40960个随机数,/proc/sys/kernel/random/entropy_avail会有剧烈的变化,所有随机数产生之后它又会保持在3000左右。
选择哪种解决方法
个人建议选择第三种方式,熵池不仅仅Tomcat用,Linux下的所有应用程序产生随机数都会用到这个,所以不仅仅是Tomcat可能被阻塞。如果你搜索会发现Apache、Nginx、OpenSSL都被这个问题坑过。如果我们通过修改Java的配置来解决这个问题其实只是解决Java应用程序的问题,只能是治标不治本。根治的方法应该是通过rngd
提高随机数生成的速度。
总结
经验不是经历。用别人的经验解决一个问题不难,难的是自己从头走一遍这条路,更加难的是推翻前人的经验对一个问题能够有自己的看法和领悟。这个案例加深了我对strace
的理解,对于空中加油
这种类型的系统调试有了自己的经验;通过对原因的深入分析我找到了更好的办法。这就是康德精神——思考、批判、理性。
如何重现故障
可以很容易的重现文章中描述的故障
systemctl stop rngd
停止rngd服务(如果你有启动rngd)
查看当前熵池的大小cat /proc/sys/kernel/random/entropy_avail
head -c1024 /dev/random
,强制消费1024个随机数,系统会长时间没有反应。直接ctrl+c
再次查看熵池的大小cat /proc/sys/kernel/random/entropy_avail
,保证它的大小在尽可能的小
启动tomcat,会发现长时间很长时间的等待
- 作者:把爱放下会走更远
链接:http://www.jianshu.com/p/576d356dc163
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
云服务器启动tomcat巨慢,很慢的更多相关文章
- 阿里云服务器 配置 tomcat 发布spring boot项目 的具体操作 【使用公网ip】
1.前言 spring boot 转成war包 后用tomcat发布的具体操作在我另一篇随笔有详细记载,不论是window系统还是Linux系统,tomcat的发布配置都是一样的,所以这里不具体讲这个 ...
- 阿里云Linux启动tomcat并能外网访问
问题描述: 先描述一下我的心路历程吧,新买了阿里云服务器,由于需求不是很大,只是为了备案,所以买了个最低配的,而且是Windows server2012的.那现在需要做的是在这个乞丐版的server上 ...
- Linux云服务器下Tomcat部署超详细
基于阿里云Centos 7服务器的Tomcat 项目部署 工具:一台安装jdk1.8的Centos 6/7.X 云服务器(64位) Putty ssh远程连接云服务器的软件 FileZillaCli ...
- Linux云服务器下Tomcat部署
基于阿里云Centos 7服务器的Tomcat 项目部署 工具:一台安装jdk1.8的Centos 6/7.X 云服务器(64位) Putty ssh远程连接云服务器的软件 FileZillaCli ...
- 华为云服务器为Tomcat配置SSL
近期由于开发小程序需要在云服务器上配置https访问协议,也遇到了一点小问题,把配置过程记录一下:SSL 证书申请下来之后会有 .jks .crt .pfx .pem为后缀的文件(如何申请SSL证书这 ...
- 阿里云服务器对外开放tomcat端口访问
今天第一次在阿里云服务器ecs上安装完成tomcat,然后启动tomcat之后.在本地输入ip:端口,发现不能访问. 出现这个的原因可能是你购买的服务器是 专有网络 类型的 如果是专有网络类型的服务器 ...
- 关于云服务器中tomcat配置出现的部分问题以及解决方法
问题描述:(一)tomcat的8080端口修改为80端口之后不能使用域名直接访问: (二)添加的项目不能通过域名直接访问(服务器端还待解决) 大致配置流程: 1.需要先购买合适的服务器,进行域名备案, ...
- 阿里云服务器ecs + tomcat + 域名解析 部署web页面
1.购买ecs:https://www.aliyun.com/product/ecs?spm=5176.12825654.eofdhaal5.2.3bf92c4aYOB7gL&aly_as=A ...
- 阿里云ECS云服务器Linux Tomcat启动慢 访问网页转圈
状况: 今天购买了一台阿里云云服务器,按照正常的方式安装JDK,mysql,以及Tomcat 这里的版本信息有 系统 :Centos 7 tomcat: apache-tomcat-8.5.45.ta ...
随机推荐
- MySQL 示例数据库 employees 详解
[引子] IT这一行在我看来是比较要求动手能力的,但是人非生而知之:人们身上的技能除了一些本能之外,大多都是通过学习而得到的. 前一段时间一直在整理素材,写一个关于explain 的系列文章:在一开始 ...
- 关于NOIP的运行环境
目前(2019年2月22日)仍然是 G++ , 终端运行,命令行: g++ test.cpp -o test ,而g++ 4.8.4默认标准是: -std=gnu++ . g++到了gcc6才把默认标 ...
- centos 7安装cppman
cppman是一个在命令行查询c和c++语法及标准库函数的工具,非常好用,python3编写,记录一下安装过程: yum update yum install python34 yum install ...
- Windows 以管理员运行而不提示
组策略中设置一下:“计算机配置”-“Windows 配置”-“安全设置”-“本地策略”-“安全选项”下:修改“用户帐户控制: 在管理审批模式下管理员的提升提示行为”选项为“提示凭据”就会再弹出提示框了 ...
- CSS中字体响应式的设置
在进行页面响应式设计中,往往需要根据屏幕分辨率来显示不同大小的字体.通常的做法是通过media queries给不同的分辨率指定不同的字体样式,例如: body { font-size: 22px; ...
- [Windows Azure] Managing SQL Database using SQL Server Management Studio
Managing Windows Azure SQL Database using SQL Server Management Studio You can use Windows Azure SQL ...
- [Windows Azure] Building worker role A (email scheduler) for the Windows Azure Email Service application - 4 of 5.
Building worker role A (email scheduler) for the Windows Azure Email Service application - 4 of 5. T ...
- 【FastDFS】FastDFS在CentOS的搭建
准备安装软件 [root@blog third_package]# cp fastdfs-nginx-module_v1.16.tar.gz FastDFS_v5.08.tar.gz libfastc ...
- 【电子基础】IIC总线工作原理
IIC总线工作原理 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化. 起始和终止信号 :SCL线为 ...
- Asp.Net正则获取链接地址
string html = “html代码”; Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?< ...