使用 jbcrypt 时性能不稳定且性能下降

问题描述 投票:0回答:3

我正在使用 jbcrypt 对项目中的密码进行哈希处理。在我使用的硬件上验证密码时,性能约为 500 毫秒(log_rounds 设置为 12)。 然而,正常使用一段时间后,性能时间突然下降到惊人的 15 秒。下降非常突然,没有累积,并且保持恒定,直到过程重新启动。

分析显示额外的时间用在了 key(..) 方法中。

来源:http://jbcrypt.googlecode.com/svn/tags/jbcrypt-0.3m/src/main/java/org/mindrot/jbcrypt/BCrypt.java

此方法仅使用 xor、and、shift 等基本函数计算哈希。没有对象分配、外部资源的使用、随机数生成等。

同一进程中的其他功能的性能不会下降。内存分配稳定且低。不涉及 Full GC。

有人以前见过这个或者有任何线索知道为什么会发生这种情况吗?我可以理解在某种程度上取决于其他情况的可变性能,但这是从大约 500 毫秒开始非常突然且稳定的下降。大约 15000 毫秒。

java performance security bcrypt jbcrypt
3个回答
4
投票

可能是SecureRandom耗尽了熵并导致了此问题。

参见 如何使用 Java SecureRandom 解决性能问题?


3
投票

原来这和类加载有关系。该库被加载到许多不同的类加载器中。当我们在系统类加载器中加载库时,问题就消失了。


0
投票

问题确实与 @sstendal 提到的类加载有关,但只是间接的。

我也遇到了同样的问题,就我而言,真正的罪魁祸首是 JIT 编译器。

BCrypt.encipher() 如果不编译的话会非常慢。当我使用 -XX:+PrintCompilation 打开 JIT 编译日志记录后,发现代码缓存太小了。当我使用 -XX:ReservedCodeCacheSize 增加其大小后,问题就消失了。

© www.soinside.com 2019 - 2024. All rights reserved.