netsamlogon_cache.tdbについて
とあるシステムで以下のような認証必須WEBアプリを動かしています。
・ユーザ情報をDCサーバから取得する所謂、統合Windows認証またの名をNTLM認証
・WEBコンテンツ(Apache-Tomcat)へのアクセスはDCサーバのドメインに所属するユーザのみ許可(ユーザ/パスワード入力なしで)
Apache-TomcatコンテンツのためApacheの以下のモジュールによってNTLM認証を実現
・mod_auth_ntlm_winbind
こいつはsambaのntlm_authヘルプコマンドを裏で呼んでいます。
なのでsambaとwinbindも必要ですじゃ。
さてある日、上記のように構築したサーバの動作がと〜っても重くなりました。
syslogを見ると以下のようなメッセージが、、
winbindd/winbindd_dual.c:async_request_timeout_handler(186)
async_request_timeout_handler: child pid 6025 is not responding. Closing connection to it.
まぁ二個一でぴったり5分毎にうじゃうじゃ出てきます。
意味不。
するってぇと今度は以下のメッセージに変化すると来たもんだ。
これは5分毎ではなくさらに頻繁に。
winbindd/winbindd.c:process_loop(950)
winbindd: Exceeding 200 client connections, no idle connection found
二個目のメッセージはwinbindとDCサーバが200接続していてもう接続できなぁーい!ってこと。
このバージョンのsamba(RHEL5の3.3.8やら)はADサーバと200接続までしか出来ない。
最新だとwinbind max clientsというパラメータにより200以上も設定可能だよ。
てか200接続がリミットで十分なんだけどね、問題は200接続するようなふんづまってる原因がありんすってこと。
当該のサーバはwinbinddプロセス、TCPのESTABLISH接続ともに1000個くらい。そりゃ重めーわ。。
とりあえず考えてみたのだけど意味不なメッセージはぴったり5分後に出力されるため5分(300秒)という設定パラメータを探しました。それは、、DCサーバから取得したユーザ情報のキャッシュを使用する時間
winbind cache time(default:300sec)
であーる。
動作としてwinbind cache timeごとにwinbindはDCサーバにユーザ情報を取得しに行きますが、DCサーバのユーザ情報データベースのシーケンスを見てそのデータベースが更新されているかどうかチェックします。
その動作が失敗しちゃうんですなぁ。
そこでwinbindのキャッシュファイルを確認する。
ls -lat /var/lib/samba/
各ファイルのタイムスタンプを確認するとwinbindを起動した日時より古いファイルをハケーン。
netsamlogon_cache.tdb
まぁ簡単に申せばDCサーバ内のユーザ/グループ情報のキャッシュファイルっす。
それっておかしいよねってことで以下の手順でwinbindを再起動。
・/etc/init.d/winbind stop → 【OK】と出るが前述の1000個現象はそのまま
・pkill -9 winbindd → 1000個死亡
・/etc/init.d/winbind stop → 【失敗】(念のため)
・rm -f /var/lib/samba/netsamlogon_cache.tdb → 削除☆
・/etc/init.d/winbind start → 【OK】
≪ま・と・め≫
ADサーバのユーザ/グループ情報のキャッシュファイルnetsamlogon_cache.tdbの破損によって、DCサーバからユーザ情報データベースのシーケンス取得の際に失敗し、プロセス及び接続が滞留、サーバ負荷を引き起こした。
これでいい?
参考ページ
[Samba] "id" and "id username" don't match up when using Winbind groups