jBcrypt:BCrypt.checkpw突然需要约30倍的时间

jBcrypt:BCrypt.checkpw突然需要约30倍的时间,bcrypt,jbcrypt,Bcrypt,Jbcrypt,在我们的web应用程序中,我们使用哈希密码。在对密码进行哈希运算时,我们使用了13轮日志 通常,BCrypt.checkpw()大约需要1秒。但有时(几天后),它突然开始变慢,从那时起需要将近30秒,并且无法恢复到正常速度。重启Tomcat是唯一有帮助的事情 我不会怀疑这种情况是否经常发生,例如,是否有高CPU负载或GC正在运行。但事实并非如此,它只是突然开始变慢。只有登录过程受到影响,应用程序的其余部分仍然很快。 我们也没有任何可确定的内存泄漏或其他性能问题。只是BCrypt.checkpw(

在我们的web应用程序中,我们使用哈希密码。在对密码进行哈希运算时,我们使用了13轮日志

通常,BCrypt.checkpw()大约需要1秒。但有时(几天后),它突然开始变慢,从那时起需要将近30秒,并且无法恢复到正常速度。重启Tomcat是唯一有帮助的事情

我不会怀疑这种情况是否经常发生,例如,是否有高CPU负载或GC正在运行。但事实并非如此,它只是突然开始变慢。只有登录过程受到影响,应用程序的其余部分仍然很快。 我们也没有任何可确定的内存泄漏或其他性能问题。只是BCrypt.checkpw()太慢了。 线程转储表明,线程调用和后续方法调用(尤其是BCrypt.encipher)占用了时间:

我在这里只发现了一个类似的问题,但在我们的案例中,多个类加载器不是问题:


有人知道这里发生了什么吗?

事实证明,这似乎是一个垃圾收集器问题。尽管建议在生产环境中使用
-XX:+UseConMarkSweepGC
(我们使用的是Java 1.7),但这会导致长时间的停止世界暂停。在返回到
-XX:+UseParallelOldGC
后,问题消失了。您好,Matthias,我们面临同样的问题,我们也尝试更改GC,但没有解决此问题。您是否对您的项目或jvm进行了任何其他更改?在Magnolia CMS中也存在同样的问题。Tomcat运行了数周没有出现问题,突然间登录只需15秒。我已经在使用-Djava.security.egd=file:/dev//uradom
Thread 8597: (state = IN_JAVA)
 - org.mindrot.jbcrypt.BCrypt.encipher(int[], int) @bci=0, line=490 (Interpreted frame)
 - org.mindrot.jbcrypt.BCrypt.key(byte[]) @bci=122, line=562 (Interpreted frame)
 - org.mindrot.jbcrypt.BCrypt.crypt_raw(byte[], byte[], int) @bci=89, line=629 (Compiled frame)
 - org.mindrot.jbcrypt.BCrypt.hashpw(java.lang.String, java.lang.String) @bci=226, line=692 (Interpreted frame)
 - org.mindrot.jbcrypt.BCrypt.checkpw(java.lang.String, java.lang.String) @bci=3, line=763 (Interpreted frame)