修改 linux系统中 /usr/local/jdk1.8.0_11/jre/lib/security/java.security

借力

好文章。
我们新的Linux系统,部署了多个 Tomca,同时重启后t, 每次都阻塞差不多260秒左右。
修改之后总的启动时间下降到6-8秒左右。
另外,不确定为什么,
修改 java.security 文件中的 securerandom.source=file:/dev/urandom 不生效。
修改启动脚本中的 -Djava.security.egd=file:/dev/./urandom 就生效了。

原因:

JVM上的随机数与熵池策略

7条回复

在apache-tomcat官方文档:如何让tomcat启动更快 里面提到了一些启动时的优化项,其中一项是关于随机数生成时,采用的“熵源”(entropy source)的策略。

他提到tomcat7的session id的生成主要通过java.security.SecureRandom生成随机数来实现,随机数算法使用的是”SHA1PRNG”

private String secureRandomAlgorithm = "SHA1PRNG";

在sun/oracle的jdk里,这个算法的提供者在底层依赖到操作系统提供的随机数据,在linux上,与之相关的是/dev/random/dev/urandom,对于这两个设备块的描述以前也见过讨论随机数的文章,wiki中有比较详细的描述,摘抄过来,先看/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

这个系统属性egd表示熵收集守护进程(entropy gathering daemon),但这里值为何要在devrandom之间加一个点呢?是因为一个jdk的bug,在这个bug的连接里有人反馈及时对 securerandom.source 设置为 /dev/urandom 它也仍然使用的 /dev/random,有人提供了变通的解决方法,其中一个变通的做法是对securerandom.source设置为 /dev/./urandom 才行。也有人评论说这个不是bug,是有意为之。

我看了一下我当前所用的jdk7的java.security文件里,配置里仍使用的是/dev/urandom

#
# Select the source of seed data for SecureRandom. By default an
# attempt is made to use the entropy gathering device specified by
# the securerandom.source property. If an exception occurs when
# accessing the URL then the traditional system/thread activity
# algorithm is used.
#
# On Solaris and Linux systems, if file:/dev/urandom is specified and it
# exists, a special SecureRandom implementation is activated by default.
# This "NativePRNG" reads random bytes directly from /dev/urandom.
#
# On Windows systems, the URLs file:/dev/random and file:/dev/urandom
# enables use of the Microsoft CryptoAPI seed functionality.
#
securerandom.source=file:/dev/urandom

我不确定jdk7里,这个 /dev/urandom 也同那个bug报告里所说的等同于 /dev/random;要使用非阻塞的熵池,这里还是要修改为/dev/./urandom 呢,还是jdk7已经修复了这个问题,就是同注释里的意思,只好验证一下。

使用bug报告里给出的代码:

import java.security.SecureRandom;
class JRand {public static void main(String args[]) throws Exception {System.out.println("Ok: " +SecureRandom.getInstance("SHA1PRNG").nextLong());}
}

然后设置不同的系统属性来验证,先是在我的mac上:

% time java -Djava.security.egd=file:/dev/urandom  JRand
Ok: 8609191756834777000
java -Djava.security.egd=file:/dev/urandom JRand
0.11s user 0.03s system 115% cpu 0.117 total% time java -Djava.security.egd=file:/dev/./urandom  JRand
Ok: -3573266464480299009
java -Djava.security.egd=file:/dev/./urandom JRand
0.11s user 0.03s system 116% cpu 0.116 total

可以看到/dev/urandom和 /dev/./urandom 的执行时间差不多,有点纳闷,再仔细看一下wiki里说的:

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

尽管在我的mac上/dev/urandom并不是/dev/random的链接,但mac与bsd内核应该是相近的,/dev/random也是非阻塞的,/dev/urandom是用来兼容linux系统的,这两个随机数生成器的行为是一致的。参考这里。

然后再到一台ubuntu系统上测试:

% time java -Djava.security.egd=file:/dev/urandom  JRand
Ok: 6677107889555365492
java -Djava.security.egd=file:/dev/urandom JRand
0.14s user 0.02s system 9% cpu 1.661 total% time java -Djava.security.egd=file:/dev/./urandom  JRand
Ok: 5008413661952823775
java -Djava.security.egd=file:/dev/./urandom JRand
0.12s user 0.02s system 99% cpu 0.145 total

这回差异就完全体现出来了,阻塞模式的熵池耗时用了1.6秒,而非阻塞模式则只用了0.14秒,差了一个数量级,当然代价是转换为对cpu的开销了。

// 补充,连续在ubuntu上测试几次/dev/random方式之后,导致熵池被用空,被阻塞了60秒左右。应用服务器端要避免这种方式。

转载于:https://www.cnblogs.com/mike-mei/p/8329938.html

tomcat启动后 项目运行缓慢,要几十到几百秒不等 怎么样./startup.sh 运行加快相关推荐

  1. window tomcat 启动后 点击cmd窗口 快速编辑模式导致项目宕机问题

    window tomcat cmd启动后 快速编辑模式导致项目宕机问题 新版本的window 操作系统,cmd默认是开启快速编辑模式 tomcat启动后,如果鼠标无意点击到tomcat cmd窗口 c ...

  2. IDEA整合Tomcat启动javaweb项目

    1.前言 突然兴起想要写这么一篇博客,不是因为别的,纯属是因为小编还是一个小白的时候,听某马和某硅谷的javaweb网课时,遇到这个章节一直启动不起来,虽然小编依旧是个菜鸡,但是今时不同往日了,小编已 ...

  3. Tomcat启动后闪退或一会儿后退出

    1.Tomcat启动后有小黑框一闪而过 原因:没有配置好java或Tomcat的环境变量 2.Tomcat启动后过了一会儿再退出 原因:有可能是端口被占用,多半是因为没有打开Tomcat就运行了ide ...

  4. java linux 起多个进程_linux下tomcat启动后出现多个java进程

    偶尔发现linux下tomcat启动后出现多个java进程,如下: 000 S     0  4789     1  0  85   0    - 75083 schedu pts/1    00:0 ...

  5. Tomcat启动时项目重复加载,导致资源初始化两次的问题

    最近在项目开发测试的时候,发现Tomcat启动时项目重复加载,导致资源初始化两次的问题 导致该问题的原因: 如下图:在Eclipse中将Server Locations设置为"Use Tom ...

  6. Tomcat启动Maven项目异常:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext

    Tomcat启动Maven项目异常:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext 参考文 ...

  7. tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案

    tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案 参考文章: (1)tomcat启动后,页面浏览时报错 Unable to compile ...

  8. linux下tomcat启动后出现多个java进程

    偶尔发现linux下tomcat启动后出现多个java进程,如下: 000 S     0  4789     1  0  85   0    - 75083 schedu pts/1    00:0 ...

  9. tomcat启动后无法访问到8080页面的原因

    tomcat启动后无法访问到8080页面的原因 原因一:tomcat服务关闭 注意启动 Tomcat 服务器的窗口不要关闭,否则就是意味着关闭了tomcat服务,自然也就看不到页面 原因二:环境变量配 ...

最新文章

  1. EditText和TextView出现中文、英文等string串的排版问题
  2. Spring 实现数据库读写分离(转)
  3. C# 调用C++写的dll的实现方法
  4. 我在阿里招前端,我该怎么帮你?
  5. 【数据结构与算法】之深入解析“寻找旋转排序数组中的最小值II”的求解思路与算法示例
  6. 基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则
  7. 关联查询数据重复怎么办_在设计数据表的时候,是一个宽表好,还是多个维度表好?...
  8. 指定一个actor对pawn不可见
  9. plc采用计算机结构如何理解,PLC的基本结构
  10. c语言输入1显示good,求助 无论输入什么输出的结果是个0
  11. location 获取参数和锚_window.location获取url各项参数详解
  12. 三维扫描+逆向建模+3D打印复刻工艺品
  13. 【Rust日报】 2019-05-02
  14. matlab newton插值,(最新整理)Newton插值法
  15. 【Java获取国家法定节假日三种工具类其一】
  16. dwc3_gadget_init分析
  17. vim加载systemverilog语法高亮
  18. i春秋_我很简单_解题记录
  19. [实践篇]13.8 如何解析gcore?
  20. 矛盾集合体——static的相关用法介绍

热门文章

  1. 用Windows Media Player截图的方法
  2. lisp坐标一键生成_联排建筑一键生成?你的SU有外挂吧!
  3. windows无法配置此无线连接_Kubernetes 1.18功能详解:OIDC发现、Windows节点支持,还有哪些新特性值得期待?...
  4. mysql 数字区间_币投君0904丨数字货币暴跌原因何在
  5. 前端服务器共享的文件产品内容,Skype for Business Server 2015-04-前端服务器-2-创建一个文件共享...
  6. mysql 排序取前4_MySQL时间段分组排序后取前10的问题?
  7. 【camera-lidar-radar】基于卡尔曼滤波和扩展卡尔曼滤波的相机、激光雷达、毫米波雷达多传感器后融合
  8. Makefile中的几个调试方法
  9. ubuntu系统怎么安装ssh服务器配置,如何在Ubuntu 20.04 LTS上安装SSH服务器
  10. 中国传媒大学计算机系湖北分数线,中国传媒大学录取分数线2019(在各省市录取数据)...