Oracle Java 8 x64 для Linux и RandomSource
Я действительно думал, что после примерно 200 или более установок Tomcat на разных платформах я готов к любым вызовам, но это сложно.
Я создал ванильный образ Ubunutu 14_04 и установил Java 8 TGZ из Oracle на этой системе. Кроме того, я добавил кота 8 в игру. Затем я начал установку сервера vanilla.
Вскоре после зависания при развертывании приложений по умолчанию, поставляемых с tomcat, я подумал, что там происходит, и сделал несколько потоковых дампов. Этот был паршивым потоком, который препятствовал запуску tomcat:
"localhost-startStop-1" #15 daemon prio=5 os_prio=0 tid=0x00007f37c8004800 nid=0x4d6 runnable [0x00007f37b38b3000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:246)
at sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:539)
at sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:144)
at sun.security.provider.SecureRandom$SeederHolder.<clinit>(SecureRandom.java:192)
at sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:210)
- locked <0x00000000f06e6ce8> (a sun.security.provider.SecureRandom)
at java.security.SecureRandom.nextBytes(SecureRandom.java:457)
- locked <0x00000000f06e71c0> (a java.security.SecureRandom)
at java.security.SecureRandom.next(SecureRandom.java:480)
at java.util.Random.nextInt(Random.java:329)
at org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom(SessionIdGeneratorBase.java:234)
После нескольких Google и друзей я обнаружил, чтоSeedGenerator
Поставленный с JDK источник моей проблемы. Интересно, что иногда SeedGenerator возвращался через несколько минут, а иногда просто зависал (кончалась энтропия? ... проверено с помощьюcat /proc/sys/kernel/random/entropy_avail
) После дополнительных исследований я обнаружил, что переменная конфигурации в$JAVA_HOME$/lib/security/java.security
называетсяsecurerandom.source
определяет, что является источником для Random. В моем случае или лучше в oracle JDK 8 установить для linux, это было/dev/random
, Я не эксперт по Linux (я Java-разработчик), но я понял, что/dev/random
может закончиться энтропия (что бы это ни значило), но, возможно, это означает, что в какой-то момент не может генерировать больше случайных чисел). Я перешел на/dev/urandom
и все было хорошо с моим котом.
Затем я проверил, как выглядят другие установки JDK на моем другом сервере, представляющем собой дикую смесь OpenJDK и более старых установок Oracle JDK. По крайней мере, OpenJDK всегда используется/dev/urandom
какой может быть ответ, почему у меня никогда не было проблемы раньше.
Теперь на мой вопрос: Стоит ли полагаться на Oracle/dev/random
когда могут быть угловые случаи, когда ОС не может произвести больше чисел? Я имею в виду такие серверы, как Tomcat и многие другиеSeedGenerator
от JDK и отладки такого рода ошибки действительно продвинулись. Мне потребовалось 2 часа, чтобы добраться до того места, где я сейчас нахожусь.