java - tutorial - logstash example
¿Por qué logstash toma tanto tiempo para iniciar/cargar? (4)
Empecé a usar Logstash hace una semana. Fue realmente seducido por @jordansissel conversaciones de desarrollo impulsadas por el odio. Pasé los últimos días en el #logstash irc hablando con personas sobre problemas, incluido el que usted ha mencionado.
Iniciar logstash-web (un servidor web sinatra disperso) lleva 29 (!) Segundos en mi ubuntu 12.04.
Creo que Logstash debe alejarse del uso de Java. Logstash seguramente se puede ejecutar como una aplicación ruby como sensu y ofrecer el mismo valor con menos (o sin) dolor.
Con java (jruby) puts "bla"
en la consola lleva 7 segundos.
La respuesta corta es: java es bueno en la taza, no en la computadora. Si ve algo así como "Requisito previo: Java", prepárese para el desperdicio.
Editar: Cambié el título porque el problema no era lo que inicialmente pensé. El hecho es que logstash lleva más de un minuto en comenzar, lo que puede malinterpretarse como "silencio" ...
Estoy tratando de hacer que logstash se ejecute, así que he seguido las instrucciones en el sitio oficial para una instalación independiente: http://logstash.net/docs/1.1.4/tutorials/getting-started-simple
Básicamente, obtuve el logstash-1.1.4-monolithic.jar
, luego construí un archivo de configuración muy simple: ( example.conf
)
input {
stdin { type => "stdin-type" }
}
output {
stdout { debug_format => "json" }
}
Pero cuando ejecuto logstash, no sale nada (estoy escribiendo texto aleatorio en STDIN, pero no recibo respuesta):
# java -jar logstash-1.1.4-monolithic.jar agent -f example.conf
Test
toto
hey ??? Wakeup !!!
^C
(Para información: la versión de Java es correcta)
# java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)
Por favor, ¿alguien me puede decir lo que me estoy perdiendo?
Ok, he encontrado por mi cuenta.
Todo estaba funcionando bien. Es solo que el logstash es tan largo para iniciarse. ¡¡Más de 60 segundos en mi (humilde) servidor !! Agregue a ese gran tiempo de inicio el hecho de que nada se imprime cuando se lanza ...
Creo que sacas conclusiones, simplemente activa --debug logs y ve qué está pasando e incluso puedes usar tu kit para perfilarlo y ver exactamente qué es lo que hace falta.
Debido a que esta pregunta aún es relevante, me gustaría señalar que si está ejecutando Java <8, entonces una de las razones por las que puede obtener tiempos de inicio muy lentos en Linux (y tal vez Solaris también) es porque Oracle JVM en esos plataformas tiene un error con respecto a dónde está obteniendo sus números aleatorios.
Incluso si le piden que obtenga sus números aleatorios de / dev / urandom, no lo hará (al menos, ¿no del todo?). Si obtienes la lectura de /dev/./urandom, que es la misma, pero no coincide con la lógica interna rota, entonces puedes encontrar que Java arranca mucho más rápido (particularmente en entornos de middleware J2EE).
http://bugs.java.com/view_bug.do?bug_id=6521844
Dicho esto, incluso con Java 8, logstash --configtest es aún muy lento de lanzar; esto probablemente se debe al hecho de que una JVM de 64 bits en modo servidor hará mucho trabajo en la optimización al inicio (incluso entonces, sospecho que JRuby está haciendo muchas cosas relacionadas con Ruby).
La wiki de JRuby tiene un documento sobre otras mejoras en el rendimiento de inicio ( https://github.com/jruby/jruby/wiki/Improving-startup-time ), pero no es muy aplicable para obtener logstash mucho más rápido. Podría obtener un tiempo de inicio para ''logstash --configtest'' de alrededor de 8 segundos con esto:
[root@node-2 ~]# DEBUG=1 /opt/logstash/bin/logstash help
DEBUG: exec /opt/logstash/vendor/jruby/bin/jruby --1.9 -J-XX:+UseParNewGC -J-XX:+UseConcMarkSweepGC -J-Djava.awt.headless=true -J-XX:CMSInitiatingOccupancyFraction=75 -J-XX:+UseCMSInitiatingOccupancyOnly -J-XX:+HeapDumpOnOutOfMemoryError -J-Xmx1g -J-XX:HeapDumpPath=/opt/logstash/heapdump.hprof /opt/logstash/lib/bootstrap/environment.rb logstash/runner.rb help
Tome el comando que ejecutará, elimine todas las opciones de Java y reemplace con --dev
[root@node-2 ~]# time /opt/logstash/vendor/jruby/bin/jruby /opt/logstash/lib/bootstrap/environment.rb logstash/runner.rb agent --configtest --config /etc/logstash/logstash-submission.conf
Configuration OK
real 0m13.367s
user 0m12.966s
sys 0m0.321s
[root@node-2 ~]# time /opt/logstash/vendor/jruby/bin/jruby --dev /opt/logstash/lib/bootstrap/environment.rb logstash/runner.rb agent --configtest --config /etc/logstash/logstash-submission.conf
Configuration OK
real 0m6.954s
user 0m6.629s
sys 0m0.286s
7 segundos aún no es genial, pero es mejor que 14 o así. 7 segundos se encuentra alrededor del punto óptimo para tomar un sorbo de café, por lo que se evita el medio incómodo de terminar la prueba antes de que se complete el sorbo. B ^)
Un alias simple puede ser una ganancia rápida útil:
alias logstash-configtest="/opt/logstash/vendor/jruby/bin/jruby --dev /opt/logstash/lib/bootstrap/environment.rb logstash/runner.rb agent --configtest"
Creo que también puede ejecutar logstash con el indicador USE_RUBY = 1 para usar el ''ruby'' en lugar del jruby enviado - no haría esto para ejecutar logstash normalmente, pero podría ser útil para --configtest si desea Úselo con frecuencia. - necesitas asegurarte de que tienes todos los varios módulos de Ruby, y luego tendrías una versión sesgada entre tu rubí nativo y el jruby vendido ... Pero quizás un fanático de Ruby podría tomar esta idea y correr con ella.