【问题标题】:Faster random generator in Tomcat 7Tomcat 7 中更快的随机生成器
【发布时间】:2011-11-25 04:07:26
【问题描述】:

我的问题是 Tomcat 7 在启动时非常慢。我在日志文件中找到了这个:

INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [12,367] milliseconds.

当然,安全性很重要,但在我的开发机器上并不重要。我完全可以使用标准的快速随机数生成器。所以我不需要这种慢得离谱的 SecureRandom 实现。

问题是:如何禁用它?正在搜索解决方案,但只找到了一些关于 randomClass 属性的弃用信息,该属性可以设置为 java.util.Random。我还发现这个属性现在在 Tomcat 7 中似乎被命名为 secureRandomClass。我试图将它设置为 java.util.Random 但这失败了,因为 Tomcat 7 将对象转换为 java.util.SecureRandom (并且还记录了指定的类必须扩展 java.util.SecureRandom,因此不能再使用 java.util.Random。)

那么我怎样才能摆脱这个非常缓慢的随机数生成器启动,以便我的开发 tomcat 尽快启动/重新启动?

【问题讨论】:

  • @SeanOwen 不是真的,因为那个问题是关于 SecureRandom 本身,而不是如何配置 Tomcat 以使用不同的。不过This one 可能是。
  • @Dave Newton:不幸的是,这个解决方案对我不起作用。我使用的是 Linux,securerandom.source 已经指向 /dev/urandom(默认设置),我不使用 APR,所以这不是 openssl 问题。
  • 12 秒真的“非常慢”吗? 12 秒这样的问题,你能负担得起花这么多时间来调查它吗?
  • @EJP 严重的是 12 秒是很长的时间,而 40 秒是荒谬的,会让我发疯。你有没有重启过你的应用程序?我使用 JRebel,我的安全随机只需要 4 秒,但如果我不得不等待 40 秒,因为每次代码更改的安全随机都会惹恼我。如果重启时间不是那么关键,那么像 JRebel 这样的公司为什么要赚钱?

标签: java tomcat


【解决方案1】:

根据TomCat Wiki可以使用非阻塞熵源:

“有一种方法可以通过设置以下系统属性来配置 JRE 以使用非阻塞熵源:-Djava.security.egd=file:/dev/./urandom

【讨论】:

  • 这对我不起作用:它仍然试图从 /dev/random 获取熵,因为 kayahr 将 /dev/urandom 链接到 /dev/random 的技巧确实加快了启动速度。
【解决方案2】:

您可能需要在您的服务器上安装 Haveged

Tomcat 在启动时使用 SecureRandom 生成安全 id,SecureRandom 使用 /dev/random/dev/urandom 生成随机数。

在某些无头 linux 环境中,/dev/random 熵池可能会产生低质量的随机性,并且在生成随机数时响应非常缓慢。

有一篇很好的文章解释了Haveged如何解决这个问题。

how-to-setup-additional-entropy-for-cloud-servers-using-haveged

【讨论】:

    【解决方案3】:

    您可能需要修补 Tomcat。

    虽然作为一个 hack,你总是可以尝试使用包装标准 java.util.Random 实例的东西来扩展 java.util.SecureRandom ......这至少可以解决强制转换问题。

    另一个想法....减速可能是由于熵池耗尽?您可能想尝试将更多熵放入池中,这可能会使其运行得非常快。

    【讨论】:

    • 我希望有一个解决方案告诉我“将其放入配置中,它就会摇摆不定”。但是,是的,如果不会出现类似的情况,我必须尝试编写自己的 SecureRandom 实现。熵池:嗯,真的不知道这是什么。如何添加“更多熵”?它有助于打开窗户并让新鲜空气进来吗?说真的,我安装了一个名为“frandom”的内核模块,它生成随机数的速度快了 50 倍(根据文档)并将securerandom.source 指向这个设备文件。没用……
    • 你可以从同一个 frandom 包中尝试 /dev/erandom,它显然根本不使用熵。熵基本上是衡量系统积累了多少“纯随机性”的量度 - /dev/random 如果没有足够的会阻塞......所以你要么需要使用不消耗熵的 RNG 要么创造更多的熵。不过,这可能是也可能不是您的特殊问题。
    • 我也试过随机数。没有帮助。我有一种奇怪的感觉,它忽略了这个随机源设置,总是使用阻塞/dev/random。当我暂时将 /dev/random 链接到 /dev/urandom 时,它的速度非常快。但这不是永久的解决方案。
    • 有趣...至少你已经证明这是一个熵问题!一个可能的解决方案是大量添加“假”熵。我认为有一个 ioctl 可以做到这一点,但不记得细节....
    • 我发现了两个有用的守护进程:randomsound 和 haveged。第一个添加通过声音设备收集的熵,第二个维护一个预先填充的随机数据池以提高 /dev/random 的速度(当我正确理解这一点时)。我都安装了,/dev/random 现在速度很快,Tomcat 的延迟也消失了。感谢您为我指明正确的方向!但奇怪的是我以前从未遇到过这个问题,而且我的同事也没有遇到同样的问题。
    【解决方案4】:

    只需从$JAVA_PATH/jre/lib/security/java.security 文件中找到securerandom.source=... 并将其更改为securerandom.source=file:/dev/./urandom

    https://stackoverflow.com/a/26432537/450586

    【讨论】:

    【解决方案5】:

    老问题,但仍然存在......在我的情况下,使用嵌入式 Tomcat。

    -Djava.security.egd=file:/dev/./urandom 解决方案对我不起作用。所以我搜索到understanding the issue,但在对lsof 进行了几次测试后,很明显该解决方法不再有效。一个快速的look at the code 确认当前实现忽略了这个系统属性。

    问题是 Tomcat 在 /dev/random 上阻塞,所以我寻找向系统添加熵的方法,发现 this answer 效果很好! 在 Debian 中以 root 身份:

    apt-get install rng-tools
    rngd -r /dev/urandom     # Run once during system start up
    

    它可能不是超级安全,但在我看来,对于会话 ID 生成来说已经足够了。

    顺便说一句,我最终使用了 Jetty。如果您不需要 Tomcat 的所有功能,速度会更快。

    【讨论】:

      【解决方案6】:

      如果您的硬件支持,请尝试使用 Java RdRand 实用程序,网址为: http://code.google.com/p/lizalab-rdrand-util/

      它基于 Intel 的 RDRAND 指令,比 SecureRandom 快约 10 倍,并且对于大容量实施没有带宽问题。

      完全公开,我是该实用程序的作者。

      【讨论】:

        猜你喜欢
        • 2017-02-27
        • 2023-03-22
        • 2015-05-25
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 2021-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多