geek.conf.2

あるエンジニアの備忘録

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

[Samba] winbind or netsamlogon_cache.tdb issue