阿里云tomcat7/8启动巨慢熵池被用空造成jvm阻塞问题

tomcat catalina.log日志特征

INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Sep 24, 2016 10:03:01 AM org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [965,010] milliseconds.
log4j:WARN No such property [maxBackupIndex] in org.apache.log4j.DailyRollingFileAppender.
log4j:WARN No such property [maxFileSize] in org.apache.log4j.DailyRollingFileAppender.
Sep 24, 2016 10:03:05 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deployment of web application archive /var/lib/tomcat7/webapps/tnu.war has finished in 973,344 ms
Sep 24, 2016 10:03:05 AM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /var/lib/tomcat7/webapps/ROOT
Sep 24, 2016 10:03:05 AM org.apache.catalina.core.StandardContext setPath
Sep 24, 2016 10:03:06 AM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /var/lib/tomcat7/webapps/ROOT has finished in 331 ms
Sep 24, 2016 10:03:06 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Sep 24, 2016 10:03:06 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 973768 ms
//关键一句  足足16分钟
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [965,010] milliseconds.
此过程需要大量服务器时间。创建SecureRandom本身需要16.0835分钟。

Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom类产生安全随机类SecureRandom的实例作为会话ID

Tomcat 7+严重依赖SecureRandom类为其会话ID和其他位置提供随机值。如果用于初始化SecureRandom的熵源缺少熵,则取决于JRE,这可能会导致启动过程中的延迟。发生这种情况时,您会在日志中看到警告,例如:

<DATE> org.apache.catalina.util.SessionIdGenerator createSecureRandom

INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [5172] milliseconds.

有两种解决办法

1)配置tomcat参数
可以通过配置JRE使用非阻塞的Entropy Source。在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。 加入后再启动Tomcat
2)配置JVM
打开$JAVA_PATH/jre/lib/security/java.security这个文件,
找到下面的内容: securerandom.source=file:/dev/urandom大概在70行 ,
替换成 securerandom.source=file:/dev/./urandom

低版本tomcat默认配置为 file:/dev/random
$JAVA_HOME/jre/lib/security/java.security配置中的securerandom.source属性
securerandom.source=file:/dev/random

注意: /dev/random 是一个真随机数生成器,它会在缺乏熵的时候停止。

深入理解

Linux上有两种常规的随机设备:/dev/random和/dev/urandom。最好的随机性来自/dev/random,因为它是一个阻塞设备,它将等待直到有足够的熵来继续提供输出。假设您的熵足够了,您应该从/dev/urandom中看到相同的随机性。但是,由于它是一种非阻塞设备,即使熵池用完了,它也将继续产生“随机”数据。这可能会导致质量较低的随机数据,因为更可能重复以前的数据。当生产服务器上的可用熵不足时,尤其是当该服务器执行加密功能时,可能会发生很多坏事。

Linux已经从不同的硬件来源获得了质量很好的随机数据,但是由于无头机器通常没有键盘或鼠标,因此产生的熵要少得多。磁盘和网络I / O代表了这些机器的大多数熵生成源,并且它们产生的熵非常稀疏。由于极少数无头机器(例如服务器或云服务器/虚拟机)具有任何可用的专用硬件RNG解决方案,因此存在一些用户域解决方案,可使用比硬盘(例如视频卡)“更嘈杂”的设备的硬件中断来产生额外的熵,声卡等。不幸的是,这再次成为服务器的问题,因为它们通常不包含任何一个

在sun/oracle的jdk里,这个算法的提供者在底层依赖到操作系统提供的随机数据,在linux上,与之相关的是/dev/random和/dev/urandom。当熵池为空时,来自/dev/random的读操作将被阻塞,直到熵池收集到足够的环境噪声数据。这么做的目的是成为一个密码安全的伪随机数发生器,熵池要有尽可能大的输出。对于生成高质量的加密密钥或者是需要长期保护的场景,一定要这么做。

大多数情况下,如果我们正在处理实际的事情,并且它不包含你的核心信息,那么 /dev/urandom 是正确的选择。否则,如果就使用 /dev/random,那么当系统的熵耗尽时,你的程序就会变得有趣。无论它直接失败,或只是挂起——直到它获得足够的熵,这取决于你编写的程序。

/dev/random 和 /dev/urandom的区别

/dev/urandom 是一个伪随机数生成器,缺乏熵它也不会停止。
/dev/random 是一个真随机数生成器,它会在缺乏熵的时候停止。

/dev/urandom和 /dev/./urandom的区别

FreeBSD操作系统实现了256位的Yarrow算法变体,以提供伪随机数流。与Linux的/dev/random不同,FreeBSD的/dev/random不会产生阻塞,与Linux的/dev/urandom相似,提供了密码学安全的伪随机数发生器,而不是基于熵池。而FreeBSD的/dev/urandom则只是简单的链接到了/dev/random。

熵和随机数的联系

要想随机数不可预测,那么系统里面的必须要有足够的熵。

查看系统的熵
[root@root]$ cat /proc/sys/kernel/random/poolsize
4096
[root@root]$ cat /proc/sys/kernel/random/entropy_avail
92

如何影响系统的熵

使用Haveged.  Haveged 是一个守护进程,它使用处理器的“抖动”将熵添加到系统熵池中

##centos7 使用 
yum install -y haveged
systemctl enable haveged
systemctl start haveged

[root@root]$ cat /proc/sys/kernel/random/poolsize
4096
[root@root]$ cat /proc/sys/kernel/random/entropy_avail
2488
返回笔记列表
入门小站