Более быстрый случайный генератор в Tomcat 7
У меня проблема с тем, что Tomcat 7 ужасно медленный при запуске. Я нашел это в файле журнала:
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [12,367] milliseconds.
Безопасность важна, конечно, но не на моей машине разработки. Я мог отлично жить со стандартным быстрым генератором случайных чисел. Поэтому мне не нужна эта смехотворная медленная реализация SecureRandom.
Вопрос: как его отключить? Выполняется поиск решения, но найдена только некорректная информация об атрибуте randomClass
, который может быть установлен на java.util.Random
. Я также узнал, что этот атрибут теперь называется secureRandomClass
теперь в Tomcat 7. Я попытался установить его на java.util.Random
, но это не удается, потому что Tomcat 7 бросает объект в java.util.SecureRandom(И он также задокументировал, что указанный класс должен расширять java.util.SecureRandom, поэтому больше не возможно использовать java.util.Random.)
Итак, как я могу избавиться от этого чересчур медленного запуска генератора случайных чисел, так что мой tomcat запускается как можно быстрее?
Ответы
Ответ 1
Вероятно, вам нужно исправить Tomcat.
Хотя в качестве взлома вы всегда можете попробовать расширить java.util.SecureRandom с чем-то, что обертывает стандартный java.util.Random экземпляр....... это, по крайней мере, пройдет мимо проблемы с литой.
Еще одна мысль... может ли замедление быть из-за истощенного пула энтропии? Возможно, вам захочется попытаться получить больше энтропии в пул, это может привести к очень быстрому ходу.
Ответ 2
В соответствии с TomCat Wiki вы можете использовать источник неблокирующей энтропии:
"Существует возможность настроить JRE на использование неблокирующего источника энтропии, установив следующее системное свойство: -Djava.security.egd=file:/dev/./urandom
"
Ответ 3
Вам может потребоваться установить на ваш сервер.
Tomcat использует SecureRandom для создания безопасного id при запуске, а SecureRandom использует /dev/random или /dev/urandom для генерации случайное число.
В некоторой безлимитной среде linux пулы энтропий /dev/random могут создавать низкое качество случайности и очень медленно реагировать на генерирование случайного числа.
Есть хорошая статья об объяснении того, как Хеджировать может решить эту проблему.
how-to-setup-additional-entropy-for-cloud-servers-using-haveged
Ответ 4
просто найдите securerandom.source=...
из $JAVA_PATH/jre/lib/security/java.security
файла и измените его как securerandom.source=file:/dev/./urandom
fooobar.com/questions/7080/...
Ответ 5
Если ваше устройство поддерживает его, попробуйте использовать утилиту Java RdRand, доступную по адресу:
http://code.google.com/p/lizalab-rdrand-util/
Он основан на инструкции Intel RDRAND и примерно в 10 раз быстрее SecureRandom и не имеет проблем с пропускной способностью для реализации большого объема.
Полное раскрытие, я автор утилиты.
Ответ 6
Старая проблема, но все же вокруг... В моем случае со встроенным Tomcat.
Решение -Djava.security.egd=file:/dev/./urandom
не работает для меня. Таким образом, я googled до понимание проблемы, но после нескольких тестов с lsof
было очевидно, что обходной путь больше не работает. Быстрый посмотреть код подтвердил, что текущая реализация игнорирует это системное свойство.
Проблема заключается в блокировании Tomcat на /dev/random
, поэтому я искал способы добавления энтропии в систему и нашел этот ответ, который работал отлично! В Debian как root:
apt-get install rng-tools
rngd -r /dev/urandom # Run once during system start up
Это может быть не супер-пупер-безопасный, но, на мой взгляд, этого достаточно для генерации идентификатора сеанса.
Кстати, я закончил работу с Jetty. Гораздо быстрее, если вам не нужны все функции Tomcat.