SMO、SSMSは、ローカルホストに接続するときにDockerでのSQL Serverの管理に時間がかかる


9

TL; DR: IPv6ループバック(::1)に解決される名前でSQL Server Dockerコンテナーに接続すると、SMO呼び出しが非常に遅くなります。を使用すると127.0.0.1、高速になります。


Dockerイメージmicrosoft / mssql-server-windows-developerの使用方法を学習しようとしています。Microsoftのドキュメントによると、このコンテナはポート1433 TCPのみを公開しています。

docker run -d -p 1433:1433 -e sa_password=Passw0rd! -e ACCEPT_EULA=Y -v C:\dockerdb:C:\dockerdb microsoft/mssql-server-windows-developer

私はWindows 10でコンテナーを実行していますが、コンテナーの起動、SQL Server認証による認証、WindowsホストでのsqlcmdおよびSSMS 17.4を使用したインスタンスに対するクエリの実行(localhostまたは「。」に接続)、およびSQL操作に成功しています。 IPで接続する隣のMacのスタジオ。この方法でクエリを実行しても、目立ったパフォーマンスの問題はありません。

SSMSでは、オブジェクトエクスプローラーを参照することもできますが、インスタンスエクスプローラーウィンドウを開いたり、データベースを接続したりするなど、オブジェクトエクスプローラーのオブジェクトで右クリックメニューから何かを行おうとすると、SSMSは約5秒間応答を表示しません-10分。この時点で、要求したウィンドウが表示されるか、次のエラーメッセージが表示されます。

SSMSエラーメッセージ

また、SMO Scripterオブジェクトを使用して、このインスタンスに対してPowerShellスクリプトを実行して、同じような動作を確認しようとしています。PSスクリプトは、データベース内のオブジェクトをループしてスクリプトでファイルに保存し、オブジェクトのリストを比較的迅速に収集するように機能しますが、個々のオブジェクトのスクリプト作成には5〜10分かかり、使用するには遅すぎます。

公開された単一のポートでは不十分であり、SMOとSSMSが同様の方法で接続を試みて速度が低下しているのではないかと思います。また、localhostに接続するときに、これらのツールは、通常はファイアウォールで保護されない他の通信チャネルが存在すると想定しているのでしょうか。使用できる追加の接続パラメーターはありますか?SSMSがSMOなどを使用してSQL Serverと通信しているという私の仮定を誰かが検証できますか?


更新:まだ調査中ですが、これはリソースの制約に関するDockerの問題であると考えられます。ほとんどのドキュメントでは、Windowsコンテナにデフォルトのリソース制約がないことを示しているようです(そして、これらはDocker for Windows GUIでは設定できません。Linuxコンテナの場合のみです)が、実際にはWindows Windows 10で実行されているコンテナーは、1 GBのデフォルトのRAM割り当てを取得します。実行中のコンテナーを検査してそのRAMとCPUの割り当てを確認する方法をまだ考えていますが、次にdocker runパラメーターを使用して、デフォルトの値からそれらを増やしてみます。


更なる更新:Dockerから、コンテナに設定されているCPUとメモリの制限を教えてくれる信頼できるメトリックを取得できませんでした。さまざまな調査により、Dockerコンテナーにはデフォルトでメモリ制限がないか、1 GBであることが示されていますが、現時点で確認できるのdocker statsは、SQLコンテナーが750〜850 MBのメモリしか使用していないということです。使用可能なメモリを4 GBに設定する実行パラメータを追加しようとすると、エラーになります。だから私はその問い合わせのスレッドに従うのをやめ、別の腸のチェックに行きました:実行中のコンテナーでインタラクティブなPowerShellセッションを入力してから、コンテナーから上記のリンクされた私のPowerShellスクリプトを呼び出します。

コンテナー内で実行しても問題はありませんでした。ほんの数分で2780個のオブジェクトを突破しました。これは問題がコンテナー/ホスト境界にあることを確認していると思います。そのため、そのUDPポートを開くことができるかどうかを確認します。更新: UDPポート1434を開いても解決しませんでした。


その他のアップデート—回避策は達成されましたが、リソース制約の問題ではありません。Windowsコンテナに大きなメモリ割り当てを設定することに関連する問題があるようです— 3gと2gでも同様のエラーが発生しましたが、最終的に1.5gでコンテナを起動できました。docker statsコンテナーのの違いを確認しましたが、コンテナーがデフォルトの割り当てである1GBで実行されていることを確認しました(そう思います)。デフォルトの設定では、PRIV WORKING SET stat(ドキュメントを見つけることはできませんが、私の推測ではRAMです)は700MiBから850MiBの間です。とdocker run —memory="1.5g"セット、それは約1.0GiBです。したがって、拡張はされましたが、以前よりも多くの割り当てを解放しているようです。私はこれを(おそらく間違って)解釈します。これは、このサーバー(まったく負荷がなく、ユーザーデータベースがない)がメモリの負荷を受けていないことを意味します。max server memory設定をチェックして、デフォルトの最大値である2PiBに設定されていることを確認しました。

その後、物事は奇妙になりました。私はまださまざまな場所から私のpowershellスクリプトを実行して物事をテストしています。コンテナ内は高速、ホストは低速。次に、ネットワーク上の別のWindowsマシンにRDPを実行し、そのマシンからスクリプトを実行して、IPでWindows 10ホストに接続しました。そしてそれは速い!これは、localhostであるはずの何かに接続するときに、SMOがポート1433 TCP以外のものを使用してSQL Serverに接続しようとし、TCP接続にフォールバックする前に非常に長いタイムアウトを待つという理論をサポートしているようです。

私はこの理論を検証するために、localhost以外の名前でlocalhostを参照するhostsファイルエントリを入力してみることにしました。

        127.0.0.1       dockersucks

SSMSでlocalhostまたは "。"の代わりにdockersucksに接続しましたが、すぐに高速になりました。オブジェクトエクスプローラーのナビゲートは通常どおりであり、データベースやサーバーのプロパティのアタッチなどのパネルを開くのは、通常と同じくらい迅速に行われました。また、このエイリアスをサーバー名として使用してWindows 10ホストからpowershellスクリプトを実行したところ、高速でした。

なぜこの問題が発生しているのか、その名前で「localhost」への接続を修正する方法があるかどうかの説明をまだ探しているので、回答の代わりにこの更新を質問に追加しました。


たぶんあなたのドッカーインスタンスは電力が不足していますか?それがポートの問題だったとしたら、それがまったく機能しないと思うので、その間はあまり時間をかけません。
LowlyDBA 2018

ええ、私はそれについて考えていましたが、クエリのパフォーマンスは問題ないようで、特定のタイプのアクションのみに制限されているようです。また、コンテナの内側からSMOの実行をテストし、問題がそこにないことを確認する必要があります。
NReilingh 2018

1
その部分を見逃さなかった。SQL Serverは接続プールを使用します。これは苛立たしいことだと思いますが、コンテナー(またはこの場合は「奇妙なHyper-V lite VM」)に十分なRAMがあることを確認してください。あなたのPSスクリプトは、「すぐに」走ったが、〜3000個のオブジェクトを介して実行する分です遅く、十分なRAM(すなわち2 GB以上)を持つマシンインチ
Randolph West、

1
完全に正直に言うと、マシン上でUbuntu Hyper-V VMを起動し、その上にLinux用のSQL Serverをインストールする方がよいでしょう。
Randolph West

1
@bazzilic私は私の答えで理由を説明します。説明が必要な場合は、そこにコメントしてください。
NReilingh

回答:


3

これは、おそらくRAM不足の問題です。

確認すること:

  • コンテナーには4 GBのRAMが割り当てられていますか?この回答を確認してください。
  • コンテナー内のSQL Serverの最大サーバーメモリ設定を構成しましたか?SQL Serverがコンテナで認識できるRAMの量に応じて、これは1 GBから3.25 GBのいずれかに設定される場合があります。
  • ホストのRAMが使い果たされていますか?Dockerがディスクにページングしている可能性はありますか?無関係なアプリケーションをすべて閉じます(WebブラウザーはRAMを大量に消費します)。SSMSを使用するには、約1 GBの作業用RAMが必要です。
  • 再起動後の方が速いですか?

私がこれを自分で行っていた場合は、Docker Storeから Windows用のDocker Community Editionをインストールし、SQL Server Dockerイメージをその方法でインストールします

インターネット接続の速度が十分であれば、5分未満で稼働し、はるかに簡単な方法でリソースを割り当てることができます。

編集:ああ、ネットワーキング。


これを誤解しているかどうかはわかりませんが、私はコンテナ内で SSMS 実行していません。Windowsコンテナーは現在RDP接続またはGUIをサポートしていないため、これは不可能です。SQL Serverが遅いわけではないことは既に知っていますが、このDockerコンテナーでリソースが不足しているかどうかを把握する必要があります。コンテナーとSSMSを実行しているWindows 10ホストには10​​ GBのRAMと2つのコアがありますが、コンテナーにどれだけの量が割り当てられるのかわかりません。
NReilingh 2018

私の答えは書き直されました
ランドルフウェスト

追加情報については、Q更新を参照してください。これはマイクロソフト独自のコンテナーイメージビルドであるため、コンテナー内の設定が問題にならないことを前提として、かなり安全だと思います。
NReilingh 2018

2
その仮定をしないでください!
Randolph West、

@NReilingh -mオプションを調査するために、回答にURLを追加しました。
Randolph West、

3

ここでの主な違いは、SSMS / SMOがIPv4またはIPv6のどちらで接続しようとしているのかです。ping localhostコマンドプロンプトでa を実行すると::1、それがに解決されることがわかります127.0.0.1。これは、と同等のIPv6です。への接続.も同じことを行います。

あなたのdocker runコマンドは上のポート1433を公開します127.0.0.1。これを実行netstat -aして、使用可能なポートを確認できます。

作成したホストファイルエイリアスはに直接解決され127.0.0.1ますが127.0.0.1、SSMSで直接接続して問題を解決できるため、必要ありません。ホストシステムでIPv6を完全にオフにすることもおそらく機能しますが、これがWindows 10でどれほど賢明かはわかりません。

IPv6が原因でこれが機能しなくなった理由を誰かが教えてくれた場合は、別の回答を受け入れることを検討します。


tcp:localhostに接続してみましたか?名前がlocalhostまたは(ローカル)または "。"の場合、SSMS / SMOが共有メモリまたは名前付きパイプ接続を試みている可能性があります。および:: 1。SSMS 17.4が確実にオブジェクトエクスプローラーでSMOを使用するかどうかはわかりませんが、可能だと思います。
Mister Magoo、2018

@MisterMagoo tcp:localhostサーバー名フィールドに入力してもまったく機能しないようですが、改善せずに接続プロパティでTCP / IPを明示的に指定しようとしました。問題は127.0.0.1::1失敗したときのlocalhost への遅いフォールバックであるとまだ思います。クエリウィンドウは接続を維持していたため機能していたと思いますが、SMOを使用したスクリプトは(おそらく)何度も新しい接続を作成していました。
NReilingh 2018

1
@NReilingh同じ問題が発生しています。トラブルシューティングと説明は非常に役に立ちました。私のSQLサーバーコンテナーをホスト環境から127.0.0.1localhostではなく)としてアドレス指定することが、ホストからコンテナーへの接続を正常に機能させる唯一の方法でした。
rogersillito
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.