Linux の identd が遅い理由 〜 debian の pidentd はひと味違う?
identd というのは,いわゆる ident プロトコル(RFC 1413)を実装したデーモンの総称です.最近は使われる場面も減ってきたかもしれませんが,DSAS では一部この identd の返答結果に基づいてアクセスの可否を決定しているサービスが存在します(※1).そのため,identd の返答速度は重要になります.
大概の Linux 上で動作する identd の実装では,/proc/net/tcp のインタフェースを通じて,コネクションのオーナを決定しているようですが,これは見ての通り全コネクションがリストされていますので,特定のコネクションのオーナを決定する上では
- kernel がこれを作成する上で,全てのコネクションをリストして
/proc/net/tcp
を作成する - identd がこの中から目的とするコネクションを探すのに,最悪全てのコネクションを探索する
という重そうな処理が発生してしまいます.
DSAS では identd の実装の一つの pidentd を用いているのですが,この identd の遅い理由を探っているときに,ふと debian の pidentd の実装がどうなっているのか見てみました.ご存知の通り,各ディストリビューションでは,オリジナルの実装に対して独自のパッチが当たっていることがよくあります.案の定,パッチが当たっていました.中身を見てみたところ,/proc/net/tcp
を使わないようになっているようです.これはと喜び勇んでコンパイル(※2)して動かしてみたところ,identd に依存しているサービスの,1秒間当たりに処理できる接続数が,約20倍ほどになりました.
件のパッチの中身を見てみると,netlink(7) を使っているようです.NETLINK は socket(2)を用いてカーネル空間とユーザ空間の間でネットワーク周りの情報の取得や設定をするためのインタフェースですが,netlink(7) を見てみてもこのパッチが使っている機能である NETLINK_TCPDIAG
や NETLINK_INET_DIAG
に関する詳しい記述は無いようです.