jBcrypt: BCrypt.checkpw внезапно занимает ~30 раз больше времени
В нашем веб-приложении мы используем jBcrypt для хеширования паролей. Мы используем 13 log_rounds при хешировании пароля.
Обычно BCrypt.checkpw() занимает около 1 секунды. Но время от времени (через несколько дней) он внезапно начинает замедляться и с этого момента уходит почти 30 секунд, и он не восстанавливается до нормальной скорости. Перезапуск Tomcat - единственное, что здесь помогает.
Я не удивлюсь, если бы это происходило время от времени, например, при высокой загрузке процессора или при работе 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, но в нашем случае не может быть проблем с несколькими загрузчиками классов: переменная и снижающая производительность при использовании jbcrypt
У кого-нибудь есть идея, что здесь происходит?