Медлительность сервера ColdFusion 11 в Linux из-за заблокированного потока SeedGenerator

Я установил ColdFusion 11 на сервер Redhat Linux. Время от времени я вижу некоторую степень медлительности. Когда он медленный, я вижу, что всегда есть ожидающий заблокированный поток SeedGenerator. Было бы очень признательно, если бы кто-то мог дать подсказки о том, как решить проблему. Вот некоторые связанные данные:

  • Сервер: Linux 2.6.32-504.1.3.el6.x86_64 #1 SMP Пт, 31 октября, 11:37:10 по восточному поясному времени 2014 x86_64 x86_64 x86_64 GNU/Linux
  • Физическая память: 6 ГБ
  • Процессор: Intel(R) Xeon(R) CPU X5560 @ 2,80 ГГц
  • Java: встроенный модуль coldfusion 1.7.0_55-b13
  • jvm: -Xms256m -Xmx2048m -XX:MaxPermSize=192m -Dcoldfusion.jsafe.defaultalgo=FIPS186Random

Я также включил JMXremote. И JConsole указывает, что пиковое использование памяти кучи составляет 700 МБ, а пиковое значение permgen — 120 МБ. Команда top в Linux указывает на высокую загрузку ЦП, а Jconsole показывает, что поток SeedGenerator время от времени использует 99% ЦП.

Я проверил пул случайных чисел ОС, и в /proc/sys/kernel/random/entropy_avail всегда было не менее 120 (в большинстве случаев это число находится в диапазоне от 120 до 190). Я даже использую rngd для увеличения доступных случайных битов, но это не помогает. Я также удалил /dev/random и связал с ним /dev/urandom без каких-либо улучшений.

Трассировка стека для потока SeedGenerator:

java.lang.Object.wait(Native Method)  
java.lang.Object.wait(Object.java:503)  
sun.security.provider.SeedGenerator$ThreadedSeedGenerator.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

person sunrise    schedule 19.03.2015    source источник
comment
Когда мы сталкиваемся с медлительностью, это почти всегда связано с неэффективным выполнением кода. Проверьте свои журналы http, чтобы увидеть, что было запущено в то время.   -  person Dan Bracuk    schedule 20.03.2015
comment
Приложение было развернуто на CF9 (с jrun) без каких-либо проблем с производительностью. Это же приложение теперь без проблем развернуто в Windows8 (CF11 с tomcat) с помощью JRE в комплекте с теми же аргументами jvm, что и в Linux. Наблюдаемая медлительность всегда возникает, когда поток SeedGenerator заблокирован. Я не уверен, сколько случайных битов требует FIPS186Random. Возможно, 120 случайных битов в /dev/random недостаточно.   -  person sunrise    schedule 20.03.2015


Ответы (1)


Пробыв целый день, я в конце концов придумал временное решение, которое значительно улучшило производительность. Добавление «-Djava.security.egd=file:/dev/./urandom» к jvm заставит Tomcat использовать /dev/urandom вместо стандартного /dev/random. Обратите внимание, что неблокирующий /dev/urandom менее безопасен, чем /dev/random. Если вам действительно нужна высокая безопасность для SSL/SSH или что-то в этом роде, вам нужно усилить систему с помощью некоторого оборудования для генерации случайных чисел.

Дополнительные примечания по устранению неполадок см. в здесь.

person sunrise    schedule 20.03.2015