En las plataformas Linux, la JVM utiliza /dev/random para la generación de números aleatorios. Este servicio del sistema operativo necesita de cierta cantidad de "ruido" (entrada por teclado, movimiento de mouse, transferencia de red, etc) antes de retornar un resultado. Y mientras espera este "ruido aleatorio"... se bloquea. Esto puede ocasionar bloqueos en procesos que requieren de números aleatorios, como WebLogic o Apache Tomcat. Por suerte, hay una solución simple.

Aunque /dev/random es más seguro, es recomendable utilizar /dev/urandom (que no es bloqueante) como configuración predeterminada para el inicio de WebLogic, Apache Tomcat o cualquier aplicación que requiera de un número aleatorio en su inicio. Para determinar si nuestro sistema operativo tiene este comportamiento de "bloquearse", basta ejecutar el siguiente comando un par de veces para obtener números aleatorio: head -n 1 /dev/random

Si el comando retorna inmediatamente, podemos utilizar /dev/random como generador de números para la JVM. Pero si no retorna inmediatamente, podemos seguir los siguientes pasos para decirle a la JVM que utilice /dev/urandom.

Configurar /dev/urandom de manera global

  1. Abrir el archivo $JAVA_HOME/jre/lib/security/java.security en un editor de texto.
  2. Cambiar la línea securerandom.source=file:/dev/random para que sea:
    securerandom.source=file:/dev/./urandom
  3. Grabar los cambios.

Configurar /dev/urandom como parámetro para la JVM

De manera alternativa, podemos utilizar la propiedad java.security.egd en el inicio de la JVM para pisar este valor: -Djava.security.egd=file:/dev/./urandom

Basado en Avoiding JVM delays caused by random number generation.

Mandanos tus sugerencias

Ayudanos con ideas para los artículos de este blog a contacto@somospnt.com