2006年11月20日

Linux の identd が遅い理由 〜 debian の pidentd はひと味違う?

はてなブックマークに登録


identd というのは,いわゆる ident プロトコル(RFC 1413)を実装したデーモンの総称です.最近は使われる場面も減ってきたかもしれませんが,DSAS では一部この identd の返答結果に基づいてアクセスの可否を決定しているサービスが存在します(※1).そのため,identd の返答速度は重要になります.

※1 ident プロトコルは,クライアントからサーバ側への TCP 接続に関して,サーバ側がクライアント側に,その TCP 接続を所有しているユーザは誰であるかを問い合わせるためのものです.問い合わせた結果を何に用いるかはサーバ次第ですが,その仕組み上,問い合わせるサーバ側は問い合わせ先となるクライアント側の identd が自分が期待した回答を返してくれるものと信頼していることが前提となります.つまり,インターネット上のクライアントの identd の返答に基づいて何かを判断することは避けるべきです.が, DC 内のネットワークのよう閉じた環境にあるクライアントの identd の返答は,それを信頼してもよいわけです.


大概の Linux 上で動作する identd の実装では,/proc/net/tcp のインタフェースを通じて,コネクションのオーナを決定しているようですが,これは見ての通り全コネクションがリストされていますので,特定のコネクションのオーナを決定する上では


  1. kernel がこれを作成する上で,全てのコネクションをリストして /proc/net/tcp を作成する

  2. identd がこの中から目的とするコネクションを探すのに,最悪全てのコネクションを探索する


という重そうな処理が発生してしまいます.


DSAS では identd の実装の一つの pidentd を用いているのですが,この identd の遅い理由を探っているときに,ふと debian の pidentd の実装がどうなっているのか見てみました.ご存知の通り,各ディストリビューションでは,オリジナルの実装に対して独自のパッチが当たっていることがよくあります.案の定,パッチが当たっていました.中身を見てみたところ,/proc/net/tcp を使わないようになっているようです.これはと喜び勇んでコンパイル(※2)して動かしてみたところ,identd に依存しているサービスの,1秒間当たりに処理できる接続数が,約20倍ほどになりました.

※2 2.6.14 以上のカーネルを使っている場合は,debian etch のパッチを使った方が良いかもしれません.


件のパッチの中身を見てみると,netlink(7) を使っているようです.NETLINK は socket(2)を用いてカーネル空間とユーザ空間の間でネットワーク周りの情報の取得や設定をするためのインタフェースですが,netlink(7) を見てみてもこのパッチが使っている機能である NETLINK_TCPDIAGNETLINK_INET_DIAG に関する詳しい記述は無いようです.


klab_gijutsu2 at 23:37│Comments(0)TrackBack(0)

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント