⏱️
Logstashのオプションによる起動時間の変動有無の確認
はじめに
- ログをElasticsearch(Elastic社)に取り込む際、データ加工に同社製のLogstashをよく使う
- Logstashは起動に数〜数十秒を要する
- PCスペック他、加工に用いるプラグインの読み込み数依存
- そのため素で開発すると 実装 > 確認 > 修正 のサイクルが長い
- 次の方法で起動時間を試す
- 方法1:短縮のJVMオプションが過去(2018年)提案されたが、現在(2025年)も有効か確認する
- 方法2:自動リロードを使用した場合に、リロード開始からデータ取得再開までの時間を確認する
結果
- 方法ごと
- 方法1:28%短縮した(平均8.6秒->6.2秒)
- 方法2:自動リロード後の読み込み再開まで1秒前後
- 結論
- プラグインが自動リロードに対応していればJVMオプションによる高速化でなく自動リロードが効果的
- 設定更新検知のインターバル(デフォルト3秒)はスペックが許すなら短くすれば良い
- リロード非対応プラグインの場合、JVMオプションの利用を検討
- https://www.elastic.co/guide/en/logstash/8.17/reloading-config.html#plugins-block-reload
- またはinput, outputが非対応であればfilter開発、テスト時は差し替えなど
- プラグインが自動リロードに対応していればJVMオプションによる高速化でなく自動リロードが効果的
実行環境
- Ubuntu 22.04.5 LTS, メモリ32GB
- Docker 28.0.4
- Logstash 8.17.4
前提条件
- パイプラインで使用するプラグインの量は本番想定ではなく動作確認の簡素なもの
- 方法1と方法2で使用するプラグインは厳密に揃えない
- 方法2の途中でリロード不可のプラグインに気づいて面倒だった
- inputをstdinからfileへ変更
main.conf
input {
# 方法1
stdin {}
# 方法2
file {
path => "/tmp/log.txt"
}
}
filter {
}
output {
stdout {}
}
試行内容
方法1 (JVMオプション指定)
概要
- 以下4オプションの有無で起動から停止までの時間を10回ずつ測定し比較
-Djruby.compile.invokedynamic=false
-Djruby.compile.mode=OFF
-XX:+TieredCompilation
-XX:TieredStopAtLevel=1
- https://github.com/elastic/logstash/issues/5507#issuecomment-437426736
結果
設定 | 最小時間 (秒) | 最大時間 (秒) | 平均時間 (秒) | 標準偏差 (秒) |
---|---|---|---|---|
オプションなし | 8.005 | 8.928 | 8.586 | 0.275 |
オプションあり | 5.947 | 6.369 | 6.171 | 0.143 |
試行結果詳細
--------------------------------------------------
測定中: 1. オプションなし
Dockerイメージ: docker.elastic.co/logstash/logstash:8.17.4
JVM オプション: なし
--------------------------------------------------
実行 1/10... 完了 (8.005 秒)
実行 2/10... 完了 (8.407 秒)
実行 3/10... 完了 (8.421 秒)
実行 4/10... 完了 (8.500 秒)
実行 5/10... 完了 (8.877 秒)
実行 6/10... 完了 (8.583 秒)
実行 7/10... 完了 (8.818 秒)
実行 8/10... 完了 (8.928 秒)
実行 9/10... 完了 (8.599 秒)
実行 10/10... 完了 (8.726 秒)
--- 結果 ---
試行回数: 10
最小時間: 8.005 秒
最大時間: 8.928 秒
平均時間: 8.586 秒
標準偏差: 0.275
--------------------------------------------------
--------------------------------------------------
測定中: 2. オプションあり
Dockerイメージ: docker.elastic.co/logstash/logstash:8.17.4
JVM オプション: -Djruby.compile.invokedynamic=false -Djruby.compile.mode=OFF -XX:+TieredCompilation -XX:TieredStopAtLevel=1
--------------------------------------------------
実行 1/10... 完了 (6.284 秒)
実行 2/10... 完了 (6.011 秒)
実行 3/10... 完了 (6.369 秒)
実行 4/10... 完了 (6.199 秒)
実行 5/10... 完了 (6.009 秒)
実行 6/10... 完了 (6.326 秒)
実行 7/10... 完了 (6.212 秒)
実行 8/10... 完了 (6.227 秒)
実行 9/10... 完了 (6.127 秒)
実行 10/10... 完了 (5.947 秒)
--- 結果 ---
試行回数: 10
最小時間: 5.947 秒
最大時間: 6.369 秒
平均時間: 6.171 秒
標準偏差: 0.143
--------------------------------------------------
方法2 (自動リロード)
概要
- Logstash起動時のオプションに
--config.reload.automatic
を指定 - リロード開始のログ出力と(ほぼ)同時に取り込みデータ追加
- データ追加から処理までの時間を確認
※ 測定の自動化が手間だったので手動で3回確認
Logstash実行ログ
[2025-03-30T06:16:51,227][INFO ][logstash.pipelineaction.reload] Reloading pipeline {"pipeline.id"=>:main}
[2025-03-30T06:16:51,227][INFO ][filewatch.observingtail ] QUIT - closing all files and shutting down.
##########
### このあたりで/tmp/log.txtにデータ追加
##########
[2025-03-30T06:16:51,402][INFO ][logstash.javapipeline ][main] Pipeline terminated {"pipeline.id"=>"main"}
[2025-03-30T06:16:52,270][INFO ][logstash.javapipeline ] Pipeline `main` is configured with `pipeline.ecs_compatibility: v8` setting. All plugins in this pipeline will default to `ecs_compatibility => v8` unless explicitly configured otherwise.
[2025-03-30T06:16:52,276][INFO ][logstash.javapipeline ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>16, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>2000, "pipeline.sources"=>["/usr/share/logstash/pipeline/filter.conf", "/usr/share/logstash/pipeline/input.conf", "/usr/share/logstash/pipeline/output.conf"], :thread=>"#<Thread:0x3e72d208 /usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:138 run>"}
[2025-03-30T06:16:52,285][INFO ][logstash.javapipeline ][main] Pipeline Java execution initialization time {"seconds"=>0.01}
[2025-03-30T06:16:52,289][INFO ][logstash.inputs.file ][main] No sincedb_path set, generating one based on the "path" setting {:sincedb_path=>"/usr/share/logstash/data/plugins/inputs/file/.sincedb_626ad8c2999fb951c5cb28879eb0ea54", :path=>["/tmp/log.txt"]}
[2025-03-30T06:16:52,290][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
[2025-03-30T06:16:52,291][INFO ][filewatch.observingtail ][main][349f3e814e2fe4b93d583f918d6bcb6bf7908ef2859a1ba828eed83239b3d536] START, creating Discoverer, Watch with file and sincedb collections
[2025-03-30T06:16:52,297][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
"@timestamp" => 2025-03-30T06:16:52.299081408Z,
"message" => "hello",
"log" => {
"file" => {
"path" => "/tmp/log.txt"
}
},
"@version" => "1",
"event" => {
"original" => "hello"
},
"host" => {
"name" => "d0b9c30af87b"
}
}
結果
- 目視のため個別記載省略
資材
Discussion