エンジニアリング

Logstash 2.2へのアップグレードガイド

Logstashユーザーのみなさま、こんにちは!ここでは Logstash 2.2.0へのアップグレード時の考慮事項について説明させていただきます。具体的には、新しい挙動(そして、間もなく修正される予定のElasticsearch outputプラグインによる、ちょっとした誤動作)によって、必要以上の数のファイルハンドルが使用されるという問題を回避する方法を説明します。また、2.2.0をチューニングする際の新しい考慮事項についても取り上げます。2.2.0にアップグレードするユーザーのために、新しいドキュメントのセクションも追加しました。ここをご覧ください。

Logstash 2.2では大幅なパフォーマンス向上が実現されています。ただし、Logstashのデフォルト設定に対して行われた変更によって、一部の構成で問題が起こる可能性があります。たとえば、Logstashで以前よりも多くのファイルハンドルが消費されるという報告が上がってきています。

この問題についてもう少し詳しくご説明させていただきます。

ワーカーユニット

Logstash 2.2には、Pipelineワーカー(これまでのFilterワーカー)とOutputワーカーという2種類のワーカーがあります。以前のバージョンのLogstashでは、FilterとOutputはそれぞれのスレッドで実行されていました。2.2では、スレッドモデルが統合され、FilterワーカーとOutputワーカーのスレッドが1つの「Pipeline」ワーカースレッドタイプにまとめられています。これにより、パフォーマンスが大幅に向上しました。Outputワーカーのコンセプトはそのままですが、スレッドに直接マッピングするのではなく、利用可能なOutputオブジェクトのプールに対してマッピングされます。実行中にPipelineワーカーに取得され、処理が完了すると戻されるという仕組みになっています。

ここで注意が必要なのは -wを以前より大きい値に設定する必要があることです。実際、Logstashに必要なスレッド総数は以前より多くなっています。ただし、これは仕様によるものです。スレッドの数は増えても作業負荷は小さくなっています。確かに IO 待ちの状態ではかなりのスレッドがアイドル状態になりますが、スレッドの作業効率は以前よりはるかに高く、コンテキストスイッチングの回数も減少しています。 -w 設定を調整するには、スループットが下がるまで、値を増やしていきます。場合によっては、システムのコア数の倍数まで増やします(先ほど説明したように、かなりのスレッドがアイドル状態になります)。デフォルトでは、 -w は、システムのコアと同じ数に設定されます。

バッチサイズ設定

もう1つ、新しいバッチサイズ設定の -b が追加されました。こちらも同じ方法で調整できます。このオプションについての詳細は、以前の記事をご覧ください。このバッチサイズは、Elasticsearch出力のデフォルトのフラッシュサイズでもあります。flush_size オプションで変更できるのは最大フラッシュサイズのみとなり、これまでのように最小フラッシュサイズは設定できなくなりました。

新しいPipelineとOutput

Outputワーカーの数を増やしてPipelineワーカーと揃えると、パフォーマンスが大幅に向上することがテストで判明しています。ただし、Elasticsearchの出力に今まで隠れていた望ましくない挙動が発見されています。複数のElasticsearch Outputワーカーを使用した場合、ワーカーは同じバックエンド接続プールを使用しないのです。つまり、5つのバックエンドESインスタンスと5つのワーカーがあった場合、最大5x5=25の接続が作られてしまいます。ESノードが40あったら、大変なことになります。

このような問題が残っているのは良くないことは認識しておりますが、解決策はLogstashのコア挙動を変更することではなく、新しいPipelineモデルでのElasticsearch Outputのハンドル接続を修正することです。この問題は、2.2シリーズの新しいリリースで解決したいと考えています。現時点では、この問題に対応するパッチ を準備しているところです。このパッチは、プラグインをアップグレードするだけで適用できます。ただし、このパッチが用意できるまでは、ES Outputワーカーの数は低めに設定していただく必要があります。2.2での当面の解決策は、 worker 数を明示的に少なく設定することです。ワーカー数は1か2程度に設定してください。

フィードバック

新しいPipelineアーキテクチャと2.2へのアップグレードについてご理解いただけたと思います。何かご意見がございましたらぜひお知らせください。Twitter(@elastic)、Elasticsearchのフォーラムに投稿いただくか、問題についてはGitHub問題ページでご報告ください。