为什么logstash启动/加载需要这么长时间?

时间:2012-11-07 12:40:45

标签: java jar jruby logstash

修改:我更改了标题,因为问题不是我最初的想法。事实上,logstash启动超过一分钟,这可能被误解为“沉默”......


我正在尝试运行logstash,所以我按照官方网站上的说明进行独立安装:http://logstash.net/docs/1.1.4/tutorials/getting-started-simple

基本上,我得到了logstash-1.1.4-monolithic.jar文件,然后构建了一个非常简单的配置文件:(example.conf

input {
  stdin { type => "stdin-type"  }
}
output {
  stdout { debug_format => "json" }
}

但是当我运行logstash时,什么都没有出来(我在STDIN中输入随机文本,但没有得到回复):

# java -jar logstash-1.1.4-monolithic.jar agent -f example.conf
Test
toto
hey ??? Wakeup !!!
^C

(有关信息:Java版本是正确的)

# 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)

拜托,有人能告诉我我错过了什么吗?

4 个答案:

答案 0 :(得分:6)

好的,我自己找到了。

一切都很好。这只是logstash很长时间才能推出。在我(简陋的)服务器上超过60秒!! 再加上那个巨大的开始时间,发布时没有任何东西打印......

答案 1 :(得分:0)

一周前我开始使用logstash。被@jordansissel仇恨驱动的发展会谈真的引诱了。花了很长时间在#logstash irc和ppl讨论包括你提到的问题在内的问题。

在我的ubuntu 12.04上启动logstash-web(一个稀疏的sinatra Web服务器)需要29(!)秒。

我相信logstash必须放弃使用java。 Logstash肯定可以作为ruby应用程序像sensu一样运行,并以较少(或没有)的痛苦提供相同的值。

使用控制台上的java(jruby)puts "bla"需要7秒。

简短的回答是:java在杯子里很好,而不是在电脑里。如果你看到“先决条件:Java”之类的东西 - 为浪费做准备。

答案 2 :(得分:0)

我认为你会得出结论,只需激活--debug日志并查看最新情况+您甚至可以使用您的工具包对其进行分析并查看具体内容。

答案 3 :(得分:0)

因为这个问题仍然存在,所以我想指出,如果你在Java< 8上运行,那么你可能在Linux(也可能是Solaris)上启动时间非常慢的一个原因是:因为这些平台上的Oracle JVM在获取随机数方面存在错误。

即使被告知从/ dev / urandom获取随机数,它也不会(至少,不完全?)。如果你从/dev/./urandom读取它,它是相同的,但不匹配内部破坏的逻辑,那么你可能会发现Java启动得更快(特别是在J2EE中间件环境中)。 / p>

http://bugs.java.com/view_bug.do?bug_id=6521844

也就是说,即使使用Java 8,logstash --configtest的发布速度仍然非常慢;这可能是因为服务器模式下的64位JVM在启动时会做很多优化工作(即便如此,我怀疑JRuby正在做很多与Ruby有关的事情)。

JRuby wiki有一个关于其他启动性能改进的文档(https://github.com/jruby/jruby/wiki/Improving-startup-time),但不太适用于更快地获取logstash。我可以获得#st; logstash --configtest'用这个来减少到大约8秒:

[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

执行它将执行的命令,删除所有java选项,并替换为--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秒仍然很好,但它比14左右更好。 7秒就是喝一口咖啡的最佳位置,所以在你的啜饮完成之前,避免你的测试结束的尴尬。乙^)

一个简单的别名可能是一个有用的快速胜利:

alias logstash-configtest="/opt/logstash/vendor/jruby/bin/jruby --dev /opt/logstash/lib/bootstrap/environment.rb logstash/runner.rb agent --configtest"

我相信您也可以使用USE_RUBY = 1标志运行logstash以使用' ruby​​'而不是出售的jruby - 你不会正常运行logstash,但如果你想经常使用它,它可能对--configtest很有用。 - 你确实需要确保你拥有所有各种Ruby模块,然后你的本机ruby和销售的jruby之间存在版本偏差......但也许Ruby buff可以采用这个想法并运行它

相关问题