`

再谈随机数引起的阻塞问题

 
阅读更多
参考:http://www.68idc.cn/help/buildlang/java/20150116173482.html

http://ifeve.com/jvm-random-and-entropy-source/

tomcat启动时SessionIdGeneratorBase.createSecureRandom耗时5分钟的问题

通常情况下,tomcat启动只要2~3秒钟,突然有一天,tomcat启动非常慢,要花5~6分钟,查了很久,终于在这篇文章找到了解决方案,博主牛人啊。

原文参见:http://blog.csdn.net/chszs/article/details/49494701

Tomcat 8启动很慢,且日志上无任何错误,在日志中查看到如下信息:

Log4j:[2015-10-29 15:47:11]  INFO ReadProperty:172 - Loading properties file from class path resource [resources/jdbc.properties]
Log4j:[2015-10-29 15:47:11]  INFO ReadProperty:172 - Loading properties file from class path resource [resources/common.properties]
29-Oct-2015 15:52:53.587 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [342,445] milliseconds.

原因
Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom类产生安全随机类SecureRandom的实例作为会话ID,这里花去了342秒,也即接近6分钟。

SHA1PRNG算法是基于SHA-1算法实现且保密性较强的伪随机数生成器。

在SHA1PRNG中,有一个种子产生器,它根据配置执行各种操作。

1)如果Java.security.egd 属性或securerandom.source属性指定的是”file:/dev/random”或”file:/dev/urandom”,那么JVM 会使用本地种子产生器NativeSeedGenerator,它会调用super()方法,即调用 SeedGenerator.URLSeedGenerator(/dev/random)方法进行初始化。

2)如果java.security.egd属性或securerandom.source属性指定的是其它已存在的URL,那么会调用SeedGenerator.URLSeedGenerator(url)方法进行初始化。

这就是为什么我们设置值为”file:///dev/urandom”或者值为”file:/./dev/random”都会起作用的原因。

在这个实现中,产生器会评估熵池(entropy pool)中的噪声数量。随机数是从熵池中进行创建的。当读操作时,/dev/random设备会只返回熵池中噪声的随机字节。/dev/random非 常适合那些需要非常高质量随机性的场景,比如一次性的支付或生成密钥的场景。

当熵池为空时,来自/dev/random的读操作将被阻塞,直到熵池收集到足够的环境噪声数据。这么做的目的是成为一个密码安全的伪随机数发生器,熵池要有尽可能大的输出。对于生成高质量的加密密钥或者是需要长期保护的场景,一定要这么做。

那么什么是环境噪声?

随机数产生器会手机来自设备驱动器和其它源的环境噪声数据,并放入熵池中。产生器会评估熵池中的噪声数据的数量。当熵池为空时,这个噪声数据的收集是比较花时间的。这就意味着,Tomcat在生产环境中使用熵池时,会被阻塞较长的时间。

解决
有两种解决办法:

1)在Tomcat环境中解决

可以通过配置JRE使用非阻塞的Entropy Source。

在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。

加入后再启动Tomcat,整个启动耗时下降到Server startup in 2912 ms。

2)在JVM环境中解决

打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容:

securerandom.source=file:/dev/urandom
替换成

securerandom.source=file:/dev/./urandom

参考:http://www.cnblogs.com/lavezhang/p/5522112.html

secureRandom 实现 之 SHA1PRNG
http://blog.csdn.net/dac55300424/article/details/48260927
分享到:
评论

相关推荐

    随机数随机数随机数随机数

    随机数随机数随机数随机数随机数随机数随机数随机数

    js随机数js随机数js随机数js随机数js随机数

    js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数js随机数...

    Matlab随机数产生的问题

    在MATLAB中,生成随机数是一项常见的任务,尤其在数值模拟、统计分析和机器学习等领域。以下是一些关于MATLAB中生成随机数的详细知识: 1. **伪随机数生成**: - 计算机生成的随机数实际上称为伪随机数,因为它们...

    国密随机数检测工具,随机数检测

    国密随机数检测工具,随机数检测

    c语言随机数c语言随机数.doc

    c语言随机数c语言随机数

    浅谈java中的几种随机数

    在Java编程中,生成随机数是一项常见的任务,用于模拟、测试和各种算法中。本文将深入探讨Java中生成随机数的几种方法及其特点。 首先,最基本的随机数生成方法是使用`java.lang.Math.random()`。这个静态方法返回...

    随机数生成_随机数生成_随机数生成_

    在编程领域,随机数生成是一项基础且重要的任务,它被广泛应用在...从简单的Python `random`模块到高级的`numpy.random`,再到加密级别的随机数生成,理解和掌握这些工具将有助于我们在各种项目中灵活应对随机数需求。

    0-999随机数_quartus随机数_vhdl_随机数生成器_随机数电路_随机数_

    1. 设计并实现一个随机数生成电路,每2秒随机生成一个0~999之间的数字,并在数码管上显示生成的随机数。2. 为系统设置一个复位键,复位后数码管显示“000”,2秒后再开始每2秒生成并显示随机数,要求使用按键复位。

    MFC实现产生随机数

    总结起来,通过MFC在VC++中实现生成随机数的功能,你需要创建一个MFC对话框应用程序,添加一个按钮控件,处理按钮点击事件,然后在事件处理函数中使用C++的标准库生成随机数。这个过程涉及了MFC的消息映射、控件交互...

    verilog产生高斯随机数

    在数字电路设计中,有时我们需要模拟随机事件,这就需要用到随机数生成器。Verilog作为一种硬件描述语言,可以用来实现这样的功能。本篇文章将探讨如何在Verilog中生成高斯随机数,具体步骤包括利用移位寄存器产生...

    易语言猜随机数源码

    "易语言猜随机数源码"是一个教学示例,旨在帮助用户理解如何在易语言中生成随机数并实现一个简单的猜数字游戏。在这个游戏中,计算机将生成一个随机数,然后让用户尝试猜测这个数字,直到猜对为止。 首先,我们需要...

    易语言取不重复随机数

    在易语言中,生成不重复随机数是一项常见的需求,特别是在游戏开发、数据分析或者算法设计等场景。本文将深入探讨如何在易语言中实现取不重复随机数的功能。 首先,我们需要了解易语言中的随机数生成函数。在易语言...

    C++随机数生成(无关联随机数)

    在C++编程中,生成随机数是一项常见的任务,特别是在模拟、游戏开发、数据分析等领域。无关联随机数,或称为伪随机数,是指通过特定算法生成的一系列看似随机但实际上可预测的数字序列。这些序列在数学上是确定性的...

    随机数自检-扑克检测

    在IT行业中,随机数生成是许多算法和应用的基础,如模拟、加密、游戏开发等。在C#编程语言中,生成随机数的过程涉及到System.Random类的使用。本项目"随机数自检-扑克检测"旨在通过一个实际的扑克牌检测案例来验证...

    易语言取指定位数的随机数

    在编程领域,生成随机数是一项常见的任务,尤其在游戏开发、加密算法、模拟实验和测试用例中。易语言作为一款中国本土开发的、面向普通用户的编程语言,它提供了丰富的函数和模块来帮助用户实现各种功能,其中包括...

    五种随机数发生器-C++与MATLAB代码_matlab_tonek9z_随机数_随机数生成办法_

    在编程领域,随机数生成是不可或缺的一部分,尤其在科学计算、模拟仿真、游戏开发等领域有着广泛应用。本资源“五种随机数发生器-C++与MATLAB代码”详细介绍了使用MATLAB进行随机数生成的五种方法,对于理解和实践...

    生成随机数小程序

    在IT领域,生成随机数是一项基础且重要的任务,广泛应用于各种场景,如模拟实验、密码学、游戏开发、数据分析等。本项目名为“生成随机数小程序”,它提供了一个便捷的工具,能够根据用户需求生成指定数量的随机数,...

    随机数生成器源码

    随机数生成器是计算机科学中的一个重要工具,广泛应用于各种领域,如模拟仿真、加密算法、游戏开发、统计分析等。本资源提供了一个随机数生成器的源码以及打包好的软件,用户可以根据自己的需求生成指定区间内的任意...

    MFC实例随机数控制

    这个“MFC实例随机数控制”主题主要关注如何在MFC应用中生成、控制和显示随机数,这在游戏开发、模拟、数据分析等多个场景中都非常常见。下面我们将深入探讨这一主题。 首先,生成随机数是编程中的一项基本任务,...

    VB随机数小程序

    在VB(Visual Basic)编程语言中,生成随机数是一项基础且重要的技能,尤其对于初学者而言,理解并能熟练运用随机数生成函数是提升编程能力的关键步骤。"VB随机数小程序"这个项目正好为我们提供了一个学习和实践的...

Global site tag (gtag.js) - Google Analytics