测试驿栈-由浅入深学性能 Tomcat 启动加速与熵池优化

飞天小子的性能课堂 · 2021年12月08日 · 1613 次阅读

概述

遇到一个 tomcat 启动特别卡的问题,具体问题打印日志如下
2021-12-07 INFO [root@VM-4-15-ubuntu:] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [612,445] milliseconds.

日志的大概意思是 Tomcat 启动一共花去了 612 秒,接近 10 分钟。主要是通过 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 产生随机数作为会话 ID 耗时最多。

很多人不知道这个 SecureRandom 是干啥的。

这个 Random 随机数其实是 JVM 通过 java.security(jre/lib/security/java.security) 指定的"file:/dev/random"或 “file:/dev/urandom"来实现的。

/dev/random :阻塞型随机数,读取它就会产生随机数据,该数据取决于熵池噪声,当熵池空了,对/dev/random 的读操作将会阻塞
/dev/urandom: 非阻塞随机数,它会重复使用熵池中的数据以产生伪随机数据
那么熵池又是什么?

熵池

机器运行的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,点击鼠标的时间间隔等。因为这些数字完全无法预测,所以 Linux 内核利用系统中的这些随机噪声来产生高质量随机数序列,称之为熵池。JVM 在生成随机数的过程中会去评估熵池(entropy pool)中的噪声数。如果 entropy_avail 的值小于要产生的随机数,随机数产生器就会堵塞,tomcat 就会变得特别卡,直到熵池收集到足够的环境噪声数据。

熵池配置

cat /proc/sys/kernel/random/entropy_avail 查看熵池可用容量
/proc/sys/kernel/random/poolsize 查看熵池最大容量

熵池不足的解决方案

1 打开 $JAVA_PATH/jre/lib/security/java.security,将 file:/dev/random 替换成 file:/dev/./urandom,重复利用熵池数据

2 安装 rngd 服务
apt-get install rngd-tools
/etc/init.d/rng-tools start
cat /dev/random | rngtest -c 1000; 测试随机数产生效率。如果没有配置 rngd,这条命令可能会执行几分钟

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册