質問者
SMB 同時実行コマンド数と、有効な同時実行コマンド数を確認する方法を探しています。

質問
-
お世話になります。
質問:
SMB 同時実行コマンド数と、有効な同時実行コマンド数を確認する方法を探しています。
理由:
IIS, ASP.NET のコンテンツを ファイルサーバーに配置しています。
このとき、下記のエラーが Web サーバー上のイベントログに発生する場合があります。
エラー:
構成ファイルの読み込み中にエラーが発生しました。:
ネットワーク BIOS コマンドの制限に達したため、'**略**' への変更の監視を開始できませんでした。
このエラーに関する詳細情報は、Microsoft サポート技術記事 810886 を参照してください。
UNC 共有でホストすること Windows XP プラットフォームではサポートしていません。 ('**略**')
原因は、IIS, ASP.NET により、ファイルサーバーとの間で多数の SMB 同時実行コマンドが
発行されるためと考えられます。
マイクロソフトは、対策として、IIS, ASP.NET のキャッシュアルゴリズムの変更、
SMB 最大同時実行コマンド数の変更を紹介しています。
実際に試したところ、エラーを解消できているように思われます。
ただし、今後 Web サイトの負荷があがっていくことが予想され、また設定変更によるネットワーク負荷の
増大、ファイルサーバーの負荷の増大も懸念されます。
また、セキュリティ対策ソフトや、今後のアプリケーションの実装によっても影響があると考えます。
このため、特定の時点での SMB 同時実行コマンド数を確認する方法が最低限必要と考えます。
次に、現在の有効な最大同時実行コマンド数が、Web サーバー設定とファイルサーバーの設定による
調整のあと、実際にどうなっているかを確認する方法が必要と考えています。
環境:
Web サーバーOS: Windows Server 2008 Std x64.
IIS: 7.0
ASP.NET: 3.5
ファイルサーバー: NetApp
関連情報:
http://support.microsoft.com/kb/911272/en-us
補足:
レジストリ MaxCmds は、Windows Server 2008 では無視されているという情報を見かけました。
レジストリ FCNMode について、Windows Server 2008, IIS 7.0 用の公式情報がないと思われます。
同時実行コマンド数の見積もり方法の資料はありますが、計測方法がないため、確認できません。
よろしくお願いいたします。
MVP for SQL Server / PASSJ board / COZAX Co, Ltd.2009年10月20日 3:10
すべての返信
-
こんにちは。
過去の経験と推測で書きますので、間違いがあるかもしれませんが、ご容赦ください。
まず、SMB1.0ではSMBコマンドの同時実行数は、サーバとクライアント間でネゴシエートして決まります。
クライアント側とサーバ側の同時実行数のうち、小さい方が使われます。このあたりの挙動はサーバとクライアント
が両方Windowsの場合は、http://support.microsoft.com/kb/810886/ja に書いてあるとおりです。
サーバがNetAppの場合は、おそらくoptions cifs.max_mpxがWindowsのMaxMpxCtに相当するはずです。いつ同時に実行するかですが、、実際のところWindowsクライアントのリダイレクタはほどんど同時実行しません。
普通のファイル操作では、クライアントのリダイレクタは一つのSMBリクエストに対してレスポンスが帰ってきてから、
次にSMB要求を送ります。よって、同時実行数はほとんどの場合1です。たとえクライアントPC上のアプリケーション
が同時に複数のファイルにアクセスしても、SMBレベルでは要求はシリアライズされて、同時実行数は1のままのようです。
ただし、FindFirstChangeNotification や ReadDirectoryChangesW で変更通知を要求したときは、複数コマンドを
同時実行します。
理由ですが、これらのAPIは変更を検出するまでずっと待機する動作をします。ネットワークドライブにこの変更通知を
要求すると、ファイルサーバはSMBの変更通知要求パケットを受け取った後、実際に変更を検出が発生するまで
クライアントにレスポンスを返しません。(変更を検出するまでは、レスポンスパケットの送信をいつまでも保留し続ける)
よって、その仕組み上、どうしても同時実行数の枠を一つ消費します。で、IISはキャッシュしているUNC接続先のコンテンツファイルの変更を検出しようとして、この変更監視の要求を
共有フォルダ上のディレクトリに対して行っているはずです。
IISの動作はわかりませんが、デフォルトでは、一つのディレクトリに対して一つの変更監視のSMBコマンドを実行して
いるのではないでしょうか。デフォルトでは同時実行数は50までなのでIISのコンテンツが格納されたディレクトリの
数が50を越えたあたりでエラーが発生し始めると推測します。実際の同時実行数の監視方法ですが、クライアントのパフォーマンスモニタでredirectorのCurrent Commandsで
確認できるはずです。(実は私は使ったことは無いのですが・・)
ちなみに、パフォーマンスカウンタの説明を表示すると、同時実行数のことは思えないような説明文が表示されますが
これは説明が間違っています。以下の文書に正しい説明が書いてあります。The Explanation About the Current Commands Performance Counter Contains Incorrect Information
http://support.microsoft.com/kb/827482/en上記文書内の"pending commands" というのが、サーバーにリクエストを出してレスポンス待機中のコマンド数
ということで、同時実行数と同じ意味のはずです。注意が必要なのは、複数のサーバに接続しているとき、
各サーバの同時実行数の和が表示されていることです。問題の回避方法ですが、ある程度は同時実行数の拡大でも回避できると思いますが、サーバの規模が拡大する
とおっしゃるようにいずれは上限に当たる可能性があると思いますし、NetAppの同時実行数の上限数も不安が
あります。根本解決ですが、
http://support.microsoft.com/kb/911272/en-us
に書いてある、FCNMode = 2 は根本解決できそうに見えます。(実際の動作を見たこと無いので推測ですけども)
最初に書いた変更監視のAPIには、bWatchSubtreeという引数があります。これは指定したフォルダに加えて、
そのサブフォルダも全部まとめて監視しろという指定です。
SMBコマンドも対応する機能があります。SMB NT TRANSACT NOTIFY CHANGEのWatchTreeフラグです。
以下の資料のP106に書いてあります。
http://www.snia.org/tech_activities/CIFS/CIFS-TR-1p00_FINAL.pdfFCNMode=2はおそらくこのbWatchSubtreeを利用して、共有フォルダのルートに一つだけ変更監視を設定し、
サブフォルダ全体(=ドライブ全体)を監視しているのだと推測します。これだと同時実行数を1つしか消費せずに
ドライブ全体を監視できます。
可能でしたら、ネットワークモニタ等でSMB NT TRANSACT NOTIFY CHANGEのリクエストパケットを見て、
WatchTreeフラグの値を見てみると良いと思います。FCNMode=2のレジストリが実際に効果あるのかどうか
の判断もできると思います。
ただし、FCNMode=2を使うためには、NetApp がSMB NT TRANSACT NOTIFY CHANGE のWatchTreeフラグ
に対応していることを確認する必要があります。もしNetAppのCIFSの実装がsambaだとWatchTreeに対応して
いない可能性があります。
以上です。2009年10月30日 16:55 -
河端です。
yamasaki さん、回答ありがとうございます。
いただきました情報をもとに、検証を進めさせていただきます。
現時点:
1.カウンタ Redirector - Current Command は、値が出ません。
FCNMode = 1, 2 の状態でカウンタを計測した結果は、常に 0 でした。
2.NetApp が NT TRANSACT NOTIFY CHANGE のWatchTree 対応状況は未確認。
メーカーに確認します。
なお、できれば WatchTree に対応しているかどうかを、クライアント側で評価するツールの作成を
検討してみたいと思います。
以上です
MVP for SQL Server / PASSJ board / COZAX Co, Ltd.2009年11月4日 7:38 -
本書き込み参考にさせていただきました。
ほぼ同じ環境で事象が発生しており、
最終的にはNetApp側のcifs.max_mpxの値を1124に変更することで、
解決しております。
NetApp側では当初”Max Multiplex”の値を見るようにサポートから
依頼されていたのですが、値は50以下でした。
そこでいろいろ調査をしたところ、
”CIFS ChangeNotifies”の実測値を考慮が必要だと判明しました。MaxMpxCt(=cifs.max_mpx)
NAS側の最大同時処理数の設定値
デフォルト:50
変更後 :1124
※設定可能値は 50、126、253、11242011年1月13日 5:24