欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CentOS随机数导致Tomcat阻塞启动严重卡顿问题

程序员文章站 2022-05-08 22:49:08
...

故障现象:
Tomcat启动严重卡顿,经过一系列排查,发现就是JVM因为某种原因被阻塞了。
排查工具:strace ,这是一个跟踪系统调用(System Call)的工具 ,无论是Java还是Pyhton很多资源申请都会变成都会变成System Call。(比如打开文件、新建线程、读写数据、等待I/O)通过这个工具我至少可以知道 Tomcat是停止在哪个System Call上的 ,这样可以方便我推断出问题的原因。
strace -f -o strace.out ./catalina.sh run
strace有很多参数,我用了二个参数
-f:跟踪fork的子进程,通俗的说会跟踪所有线程的系统调用
-o:把内容输出到文件

	传统解决方式:
		用/dev/urandom替换/dev/random

	终极解决方式:增大/dev/random的熵池。
		问题的原因是由于熵池不够大,所以增大它是最彻底的方法。 通过 cat /proc/sys/kernel/random/entropy_avail 我们可以查看现在的熵池大小;我们需要找到一种方式来提高这个值就行了。
		通过 cat /proc/cpuinfo | grep rdrand 可以查看自己的CPU是否支持,一般来说Intel的Ivy_Bridge架构的CPU都支持。
		 以Centos7为例:
	 yum install rng-tools   //安装rngd服务(熵服务)
	 systemctl start rngd 启动服务
	启动熵服务(rngd)后,可以实时查看随机数生成速度:
	watch -n 1 cat /proc/sys/kernel/random/entropy_avail 观察这个值
	我的机器之前是183左右,启动后为3000靠上。
	问题解决。
	ps:可以将rngd服务设成自动启动。

	故障重现:
	 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,会发现长时间很长时间的等待。