怎样使得Tomcat服务器启动更快 使用随机数与熵池策略

    随着微服务技术快速发展,SpringCloud与Docker新的技术也不断涌现出来,但是SpringCloud已SpringBoot为基础开发的默认内嵌Tomcat服务器,在SpringCloud与Docker整合的时候,使用docker DockerFile或者docker-compose启动镜像文件的时候,需要同时启动多个Tomcat,由于Tomcat 的sessionId在启动使用Java的SecureRandom类进行随机生成,所以启动较慢。可以通过使用cat /usr/jdk1.8.0_131/jre/lib/security/java.security | grep random 命令在jre中查看Java默认的随机数生成策略,


  可以看到随机数的生成是依靠linux系统random生成的,jdk8默认的随机算法是NativePRNG 由于Linux /dev/random是阻塞的算法生成器 所以在生成sessionId时阻塞的。

wiki是这样说的

  1.发生器有一个容纳噪声数据的熵池,在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止[3]。这样的设计使得/dev/random是真正的随机数发生器,提供了最大可能的随机数据熵,建议在需要生成高强度的密钥时使用。

  2./dev/random的一个副本是/dev/urandom(“unblocked”,非阻塞的随机数发生器[4]),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。/dev/random也允许写入,任何用户都可以向熵池中加入随机数据。即使写入非随机数据亦是无害的,因为只有管理员可以调用ioctl以增加熵池大小。Linux内核中当前熵的值和大小可以通过访问/proc/sys/kernel/random/文件夹中的文件得到。

  random可以生成高强度的秘银使用这也许就是为什么jdk默认是使用它吧

  对于JDK7与JDK8版本间也有很大的差异 github上用strace命令进行分析的 相比较来说jdk8更好一些地址https://gist.github.com/svrc/5a8accc57219b9548fe1

那么我们怎样在实际中使用命令的方式选择用那种方式进行算法生成

  使用java -Djava.security.egd=file:/dev/./urandom -jar test.jar 指定了以urandom的方式(中间的.好像是用于解决jdk7的一个bug 好像jdk8已经修复了)

  因此在使用java -Djava.security.egd=file:/dev/./urandom -jar test.jar 进行jar包启动时,可以提高Tomcat的启动速度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章