龙空技术网

并发不高的程序长时间未使用后登录为什么会变得很慢

喝着茶聊咖啡 161

前言:

如今小伙伴们对“sha1prng算法c”大约比较关怀,姐妹们都需要剖析一些“sha1prng算法c”的相关文章。那么小编同时在网摘上收集了一些有关“sha1prng算法c””的相关内容,希望看官们能喜欢,各位老铁们一起来了解一下吧!

现象

一些内部管理系统,Java的程序部署到服务器之后,由于并发不高,晚上没人使用,第2天或者周一早上开始使用的人会登录特别缓慢。

分析

反复检查程序都没有发现问题,主要一开始怀疑IO的问题,因为内存中的一般不会出现超时的。但是没发现IO问题,却在无意间在上看到了一下提示。

2020-07-25 11:08:50 - [WARN ] [http-nio-8092-exec-10] o.a.c.util.SessionIdGeneratorBase    : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [28,190] milliseconds.2020-07-25 11:08:50 - [WARN ] [http-nio-8092-exec-6] o.a.c.util.SessionIdGeneratorBase    : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [65,102] milliseconds.2020-07-25 11:08:50 - [WARN ] [http-nio-8092-exec-2] o.a.c.util.SessionIdGeneratorBase    : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [166,254] milliseconds.

从日志可以看出,SessionIdGeneratorBase这个类要创建一个SecureRandom用于生成sessionID,居然用了几十秒到一百多秒不等的时间。

原因

原因是Tomcat在产生session ID时的SHA1PRANG算法使用了jre的SecureRandom。SHA1PRNG 算法是基于 SHA-1 算法实现且保密性较强的伪随机数生成器。而SHA1PRNG的种子产生器,是通过读取$JAVA_HOME/jre/lib/security/java.security 这个文件获取的,配置项为securerandom.source。

以下是java.security的配置片段:

# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding# mechanism for SHA1PRNG.## By default, an attempt is made to use the entropy gathering device# specified by the "securerandom.source" Security property.  If an# exception occurs while accessing the specified URL:##     SHA1PRNG:#         the traditional system/thread activity algorithm will be used.##     NativePRNG:#         a default value of /dev/random will be used.  If neither#         are available, the implementation will be disabled.#         "file" is the only currently supported protocol type.## The entropy gathering device can also be specified with the System# property "java.security.egd". For example:##   % java -Djava.security.egd=file:/dev/random MainClass## Specifying this System property will override the# "securerandom.source" Security property.## In addition, if "file:/dev/random" or "file:/dev/urandom" is# specified, the "NativePRNG" implementation will be more preferred than# SHA1PRNG in the Sun provider.#securerandom.source=file:/dev/random

这个/dev/random被称为收集环境噪音的熵收集装置(也叫熵池The entropy gathering device),系统将当前运行的随机状态写入其中,作为伪随机数的种子。/dev/random非常适合那些需要非常高质量随机性的场景,比如一次性的支付或生成密钥的场景。但random有个特点就是阻塞式的,直到熵池收集到足够的环境噪声数据。由于长时间无人使用系统,就会导致熵池变空,从而无法产生随机数。我们看到这个配置的注释里也提到了另外一个文件,那就是/dev/urandom。它和/dev/random的区别就是,urandom是ublock的。

因此,由于无法产生随机数,jvm就阻塞住了,直至有足够的环境噪音,这样子随机数的随机性当然是高了很多,但也给系统带来了问题。可以将

securerandom.source=file:/dev/random

改为

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

为什么会多了个./呢,据说这是jvm的一个bug,有人反馈即使对 securerandom.source 设置为 /dev/urandom 它也仍然使用的 /dev/random。所以使用/dev/./urandom 这样的变通方法。也有人评论说这个不是 bug,是有意为之。

标签: #sha1prng算法c