因为这个问题仍然相关,所以我想指出,如果您在 Java <8 上运行,那么您在 Linux(也许还有 Solaris)上的启动时间可能会很慢的一个原因是因为 Oracle JVM 在那些平台在获取随机数方面存在错误。
即使被告知从 /dev/urandom 获取其随机数,它也不会(至少,不完全是?)。如果您从 /dev/./urandom 读取它,它是相同的,但与内部损坏的逻辑不匹配,那么您很可能会发现 Java 启动得更快(尤其是在 J2EE 中间件环境中)。
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。我可以将“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 爱好者可以接受这个想法并使用它。