Я тут такую штуку раскопал! Сейчас расскажу, проблема уже понятна, но решение пока нет. Может что мне подскажите.
Повторю в чем был трабл - Тимсити, первоклассный промышленный билд сервер от блестящих Джет Брейнов - тормозил на 1 (ПЕРВОЙ) строчке серверного лога, вот просто тупо на 3, на 5, на 15 минут, иногда навсегда зависал и фсе, никакой существенной активности ЦПУ, никакого перегруза памяти, никакой существенной сетевой или дисковой активности (cудя по iotop). Но иногда проскакивал эту строчку быстро, и печатал в лог нормальные сообщения, так что общее время старта было около 1 минуты. Но такие счастливые случаи были редки.
Я обратился в Джет Брейнз и они мне посоветовали посмотреть где зависает коммандой jstack. Я им выслал результат, и они сказали, что зависает, скорее всего, потому, что в какой-то момент времени, стандартный Томкат код пытается получить случайное число из /dev/random или /dev/urandom, в зависимости от настроек, но не может его получить, и в результате блокирует все нафиг.
Если кому интересно, то вот то место где происходит этот Адский Фриз
"localhost-startStop-1" daemon prio=10 tid=0x57008c00 nid=0x4cc runnable [0x52ead000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:272)
at sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:551)
at sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:139)
at sun.security.provider.SecureRandom$SeederHolder.(SecureRandom.java:197)
Я решил проверить, что это так (что это причина). Я написал на Петоне скрип, который периодически, раз 1 секунду, запускает jstack и ищет эту строку "getSeedBytes".
Потом я запустил в двух консолях, параллельно, две комманды
1. tail -f teamcity-server.log
2. мой чекер
И ТОЧНО! АДСКИЙ ТРЕШ! Когда происходит завис, "getSeedBytes" присутствует в аутпуте jstack. Как только он пропадает там, сразу серверный лог живенько начинает получать нормальные сообщения.
Я даже сделал видеоклип, где показана эта хрень. Разблокировка происходит в районе 3:00
Действительно, Томкат не может получить нормальное случайное семя, и блокирует все нафиг!
Проблема детально описана тут http://stackoverflow.com/questions/26227344/oracle-java-8-x64-for-linux-and-randomsource
Теперь вопрос в том, как лечить. В СтекОверфлоу приведено решение - поменять настройки Явы, чтобы вместо блокирующего /dev/random использовать неблокирующий /dev/urandom
Моя проблема - у меня УЖЕ стоит /dev/urandom в настройках
$JAVA_HOME$/lib/security/java.security, параметр "securerandom.source"
То есть рецепт из СО не поможет.
Временное решение такое:
# cat /dev/urandom | head -c 10000000 > /opt/stored.random
а потом установить в файле $JAVA_HOME$/lib/security/java.security
securerandom.source = /opt/stored.random
попробовал. Работает! Сервер запускается с полпинка, ни малейшей задержки на том месте.
Но ведь это криво как-то? Я типа сам сломал секьюрити на своей системе, случайные числа больше не случайные.
Можно конечно перед каждым запуском сервера скриптом писать свеженькие случайные числа в файл. Но это как-то неужклюже.
Как умнее сделать?
ПС. Джет Брейны мне написали, что типа раз это Томкат, то это не их проблема, и порекомендовали обратиться к хостеру (digitalocean).
Повторю в чем был трабл - Тимсити, первоклассный промышленный билд сервер от блестящих Джет Брейнов - тормозил на 1 (ПЕРВОЙ) строчке серверного лога, вот просто тупо на 3, на 5, на 15 минут, иногда навсегда зависал и фсе, никакой существенной активности ЦПУ, никакого перегруза памяти, никакой существенной сетевой или дисковой активности (cудя по iotop). Но иногда проскакивал эту строчку быстро, и печатал в лог нормальные сообщения, так что общее время старта было около 1 минуты. Но такие счастливые случаи были редки.
Я обратился в Джет Брейнз и они мне посоветовали посмотреть где зависает коммандой jstack. Я им выслал результат, и они сказали, что зависает, скорее всего, потому, что в какой-то момент времени, стандартный Томкат код пытается получить случайное число из /dev/random или /dev/urandom, в зависимости от настроек, но не может его получить, и в результате блокирует все нафиг.
Если кому интересно, то вот то место где происходит этот Адский Фриз
"localhost-startStop-1" daemon prio=10 tid=0x57008c00 nid=0x4cc runnable [0x52ead000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:272)
at sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:551)
at sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:139)
at sun.security.provider.SecureRandom$SeederHolder.
Я решил проверить, что это так (что это причина). Я написал на Петоне скрип, который периодически, раз 1 секунду, запускает jstack и ищет эту строку "getSeedBytes".
Потом я запустил в двух консолях, параллельно, две комманды
1. tail -f teamcity-server.log
2. мой чекер
И ТОЧНО! АДСКИЙ ТРЕШ! Когда происходит завис, "getSeedBytes" присутствует в аутпуте jstack. Как только он пропадает там, сразу серверный лог живенько начинает получать нормальные сообщения.
Я даже сделал видеоклип, где показана эта хрень. Разблокировка происходит в районе 3:00
teamcity.freeze from orleans on Vimeo.
Действительно, Томкат не может получить нормальное случайное семя, и блокирует все нафиг!
Проблема детально описана тут http://stackoverflow.com/questions/26227344/oracle-java-8-x64-for-linux-and-randomsource
Теперь вопрос в том, как лечить. В СтекОверфлоу приведено решение - поменять настройки Явы, чтобы вместо блокирующего /dev/random использовать неблокирующий /dev/urandom
Моя проблема - у меня УЖЕ стоит /dev/urandom в настройках
$JAVA_HOME$/lib/security/java.security, параметр "securerandom.source"
То есть рецепт из СО не поможет.
Временное решение такое:
# cat /dev/urandom | head -c 10000000 > /opt/stored.random
а потом установить в файле $JAVA_HOME$/lib/security/java.security
securerandom.source = /opt/stored.random
попробовал. Работает! Сервер запускается с полпинка, ни малейшей задержки на том месте.
Но ведь это криво как-то? Я типа сам сломал секьюрити на своей системе, случайные числа больше не случайные.
Можно конечно перед каждым запуском сервера скриптом писать свеженькие случайные числа в файл. Но это как-то неужклюже.
Как умнее сделать?
ПС. Джет Брейны мне написали, что типа раз это Томкат, то это не их проблема, и порекомендовали обратиться к хостеру (digitalocean).