Mac.getInstance() для HmacSHA1, для выполнения которого требуется много времени

Недавно я столкнулся с проблемой развертывания с вызовом Mac.getInstance("HmacSHA1").
Выполнение одного вызова на этом конкретном сервере может занять до 10 минут, в то время как на других компьютерах его выполнение происходит мгновенно.

Использование ЦП также резко возрастает во время вызова.

Немного подробностей о сервере:

  • ОС: CentOS 5.6 Final (ядро 2.6.35.8-16, i686);
  • JVM: Sun JDK 1.6.0_25 (32-разрядная версия);
  • ЦП: ЦП Intel Core2 Duo (E8400, 3,00 ГГц);
  • Память: 2 ГБ ОЗУ;
  • Выделенный физический сервер.

Любые подсказки о том, что может быть проблемой здесь?


person biasedbit    schedule 26.05.2011    source источник


Ответы (1)


Я подозреваю, что у вас мало системной энтропии для безопасных случайных чисел. См. эту страницу, чтобы проверить: Проверить доступную энтропию в Linux. И на этот вопрос есть ответы для рассмотрения: Как решить проблему с производительностью с помощью Java SecureRandom ? В частности, эта опция Java должна помочь вам:

-Djava.security.egd=file:/dev/./urandom

Это намного быстрее, но немного менее безопасно.

person WhiteFang34    schedule 26.05.2011
comment
Кажется, это не связано с энтропией. Я установил rng-utils и запустил rngd, доступная энтропия подскочила со 150 до 1500-2000. Вчера я решил проблему, переключившись на OpenJDK... Есть идеи? Спасибо! - person biasedbit; 28.05.2011
comment
Хм, я вижу, вы сказали, что загрузка процессора резко возрастает. Вы пробовали профилировать его на этом сервере? Один из простых способов проверить это — просто просмотреть jstack и посмотреть, какие потоки часто находятся в состоянии RUNNABLE. См. этот ответ для команды, которую я обычно использую, просто замените BLOCKED на RUNNABLE, так как вы видите всплески ЦП вместо проблем с блокировкой: stackoverflow.com/questions/5390317/ - person WhiteFang34; 28.05.2011
comment
jstack зависает до тех пор, пока выполняется вызов Mac.getInstance(). Я попытался вызвать его с помощью jstack -F <pid> и вот несколько результатов, которые я получил: d.pr/UVV6 и d.pr/o0dK. Мне придется немного подождать, прежде чем продолжить расследование, так как после нескольких запусков он перестает зависать и работает нормально - похоже, имеет некоторый эффект кэширования. - person biasedbit; 30.05.2011
comment
JVM Sun (Oracle) ведет себя очень странно; кроме того, что этот вызов getInstance() занимает целую вечность, процесс случайным образом умирает, и я даже не могу найти журналы сбоев. Я пока придерживаюсь OpenJDK; спасибо за подсказки! - person biasedbit; 31.05.2011