Open thinkuncle opened 7 years ago
最近部署生产环境启动tomcat时发现tomcat启动太慢,启动监控catalina.log卡在一个地方6-7分钟,
org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [365,879] milliseconds.
发现是JVM上的随机数与熵池策略导致的 linux系统JVM默认使用 /dev/random, /dev/random 在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止 /dev/urandom 则是一个非阻塞的发生器: dev/random的一个副本是/dev/urandom (”unlocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。 另外wiki里也提到了为什么linux内核里的随机数生成器采用SHA1散列算法而非加密算法,是为了避开法律风险(密码出口限制)。
回到tomcat文档里的建议,采用非阻塞的熵源(entropy source),通过java系统属性来设置:
-Djava.security.egd=file:/dev/./urandom
sed -n '/2017-09-04 10:00:00/,/2017-09-04 10:05:55/p' catalina.out > 0914.log
linux平台tomcat启动太慢
最近部署生产环境启动tomcat时发现tomcat启动太慢,启动监控catalina.log卡在一个地方6-7分钟,
问题
org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [365,879] milliseconds.
核查原因
发现是JVM上的随机数与熵池策略导致的 linux系统JVM默认使用 /dev/random, /dev/random 在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止 /dev/urandom 则是一个非阻塞的发生器: dev/random的一个副本是/dev/urandom (”unlocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。 另外wiki里也提到了为什么linux内核里的随机数生成器采用SHA1散列算法而非加密算法,是为了避开法律风险(密码出口限制)。
回到tomcat文档里的建议,采用非阻塞的熵源(entropy source),通过java系统属性来设置:
解决方式