7

在我们的 Web 应用程序中,我们使用jBcrypt对密码进行哈希处理。我们在对密码进行哈希处理时使用 13 个log_rounds

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

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

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)

我在 SO 上只发现了一个类似的问题,但在我们的案例中,多个 Classloaders 不会成为问题: Variable and degrading performance when using jbcrypt

有谁知道这里发生了什么?

4

0 回答 0