読者です 読者をやめる 読者になる 読者になる

たごもりすメモ

コードとかその他の話とか。

fluent-plugin-secure-forward v0.1系のお話

前に作ってえいやでリリースしてから「メンテナ募集!」で放置されていた fluent-plugin-secure-forward ですが。

#fluentd Casual Talks #2 やってきた&fluent-plugin-secure-forwardの話 - tagomorisのメモ置き場

手元で用途無いからもうこれ以上やらないよ宣言してたんだけど、その後放置の数ヶ月を経てうっかり用途のほうが出てきてしまった。なんということだ。

v0.1.3 リリース内容

ということであれこれ直して手元で本番環境に投入したので、個人的なポリシーに従って v0.1.0 としてリリースした。その後バグが見付かったりで直してたのでもう既に v0.1.3 だけど。

fluent-plugin-secure-forward | RubyGems.org | your community gem host
tagomoris/fluent-plugin-secure-forward · GitHub

  • やったこと
    • out_secure_forward で複数サーバを指定できるように (単純なラウンドロビン)
      • およびその中で standby なサーバを指定できるように (non-standbyなサーバが全部死んでたら使われる)
    • 永続的に接続を維持していた sslsession keepalive のexpireを秒単位で指定できるように
      • 指定秒で再接続する (SSL共有鍵をリフレッシュする)
    • resove-hostname を使って名前解決をキャッシュするように
    • /dev/random 使っててエントロピー足りなくてブロックするので /dev/urandomに
    • TCPレベルでのacceptとSSLセッションの確立を分離して別スレッドに *1
    • そのほか、コネクション切断やシグナル到着時の例外処理などのバグ修正を多数
  • やってないこと
    • 使用する暗号強度を指定可能にする
    • SSL接続のkeepalive不許可オプションの追加
    • メッセージ送信に対するACKの返信機能や順序保証
    • テストコードの追加

テストはまだありません……。正確には rake test するといちおう全ファイルのrequireだけはしてみるようになってます。syntax error はこれでわかる!!!!!!!!

性能

手元でサーバ間通信の環境を作って簡単に計ったところ、以下のような感じでした。

  • 1セッションで転送メッセージ数を上げていった場合
    • 10,000 msg/sec くらいが限界 (in_secure_forward側でCPUが1コアを使いきった)
  • 複数セッションを張るよう試した場合
    • 20セッション合計で 8,000 msg/sec 弱が限界 (同じくin_secure_forward側でCPUが1コアを使いきった)

SSLのセッション数と合計メッセージ数がCPU負荷に与える細かい影響をちゃんと調べてませんが、まあ手元用途がそんなに大規模なものでもないんでこれでいいかなーと。 in_forward での転送のだいたい 1/2 〜 1/3 くらいだと思っておけばいいかもね。
あと受信側ではSSL処理以外に何かやろうと思わないほうがいいかも。自分は即座に out_forward で別ポートの fluentd インスタンスに転送するようにしてる。

まとめ

誰か他にも、使ってメンテとか開発とかやってくれる人を引き続き募集しております。

*1:tcp connectだけ試しに来る死活監視ツールとかを相手にすると死んでたので