Переменная и ухудшающая производительность при использовании jbcrypt
Я использую 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 и т. Д. Нет назначения объектов, использования внешних ресурсов, генерации случайных чисел и т. Д.
Производительность не падает для других функций в том же процессе. Распределение памяти стабильное и низкое. Полный GC не задействован.
Кто-нибудь видел это раньше или какой-либо ключ к пониманию того, почему это происходит? Я мог понять переменную производительность, которая в некоторой степени зависела от других обстоятельств, но это очень внезапное и стабильное падение примерно с 500 мс. примерно до 15000 мс
2 ответа
Оказалось, что это как-то связано с загрузкой классов. Библиотека была загружена во множество разных загрузчиков классов. Проблема исчезла, когда мы загрузили библиотеку в системный загрузчик классов.
Вполне возможно, что SecureRandom заканчивается энтропия и вызывает эту проблему.
Смотрите Как решить проблему с производительностью Java SecureRandom?