タイトルを読んでもまだ混乱していますか?まあ私もそうです。
新しい雇用主のためにDBAとして新しい仕事を始めたばかりで、SQL Serverをインストールするいくつかの独創的な方法に出会いました。 SQL Serverに関するこれまでの経験はすべて、仮想ハードウェアまたは物理ハードウェアのいずれかで実行されている単一のMSSQLSERVERインスタンスに基づいています。すべてを本当に分離してシンプルに保つためだけに、SQL Serverのマルチインスタンスインストールを回避していました。
ここで私の新しい雇用者は、SQL Server Standard Editionのかなりの数のインスタンスを1つの仮想ハードウェアにまとめました。彼らの(まあ、私は今、それを私たちと呼ぶべきだと思います...)
そのような構成の背後にある他の理由はまだ見つかりません。
進行中の可用性グループやトランザクションレプリケーションはまったくなく、トランザクションログ配布は実装されていません。
サーバーは、以下で説明するように、デフォルトのインスタンスと複数の追加インスタンスを持つように構成されています。
SQL Serverは、複数のインスタンスを含むように構成されています。
各SQL Serverは1〜nインスタンスを持つことができます
SQL_SERVER_01 (Standard Edition SQL Server)
\ MSSQLSERVER (default instance)
\ VARIOUS_INS (the 2nd instance)
\ SOMETHINGNW (the 3rd instance)
\ A_NAMEGIVEN (the 4th instance)
\ INSTANCENEW (the xth instance)
各インスタンスはIPアドレスに関連付けられており、各IPアドレスには個別のエイリアス(CNAME)があるため、SQL Serverは常にポート1433でリッスンできます。これにより、デフォルトのSQL Serverポートにルールを追加するだけでよいため、ファイアウォールの構成が簡単になります。うーん。
MSSQLSERVER | 10.0.0.22 | 1433 | SQL_SERVER_01_I00
VARIOUS_INS | 10.0.0.23 | 1433 | SQL_SERVER_01_I01
SOMETHINGNW | 10.0.0.24 | 1433 | SQL_SERVER_01_I02
A_NAMEGIVEN | 10.0.0.25 | 1433 | SQL_SERVER_01_I03
INSTANCENEW | 10.0.0.26 | 1433 | SQL_SERVER_01_I04
したがって、同じ仮想サーバーで実行されている各SQL Serverインスタンスについて、ネットワークチームは仮想NICのIPアドレスを提供し、インスタンスのIPアドレスのCNAME /エイリアスを作成する必要があります。各仮想NICは正しいIPアドレス用に構成する必要があり、SQL Server構成は各インスタンスのIPアドレス用に正しく構成する必要があります(このIPアドレスをリッスンし、このIPアドレスでアクティブです...)。 SQL Serverは一般的なSERVER\INSTANCE表記に応答しません。つまり、サーバーはエイリアス/ CNAMEを介してのみ到達可能です(例:SQL_SERVER_01_I00)。
忘れる前に、このような一連のSQL Serverインスタンス用に構成された一般的な仮想ハードウェアについて理解しておくとよいでしょう。
仮想ディスクはVMwareで事前構成され、SQL Serverに接続されています。バックグラウンドの一部のハードウェアベンダー。 IBMの場合もあれば、Hitachiの場合もあります... MDFファイル用のディスクとLDFファイル用のディスク。
はい、複数のプロセッサー。この例では、4つの論理プロセッサ@ 2.9 GHz
このサーバーでは、わずか32GB。各SQL Serverインスタンスは、1 GB〜4 GBのメモリを消費するように構成されています。このサーバーには、たとえば6つのインスタンスがあり、それぞれに数100 MBから数GBまでのサイズの1〜10個のデータベースが含まれています。大したことはない。
各SQL Serverインスタンスは次のように構成されます。
デフォルト(0)
最小メモリは256 MBに、最大メモリは1 GB〜4 GBに設定されます。
構成されていません。
デフォルト(5)
私の経験から、構成設定に関して、および問題を分析するときに、単一のインスタンスを持つことが最善であることがわかりました。しかし、これはここではオプションのようには見えません。したがって、その方向で議論を始める必要はありません。知っている。
7つのインスタンスすべてについて、4つの論理プロセッサとMAX_DOPを0に設定し、複数のデータベースをバックグラウンドで使用することは悪い考えだと思います。 1つのシステムが遅れると、すべてが深刻に遅れることになります。
私の環境を知っているように見えるので、誰かが同様の設定をしていて、すべてを分析するためのスクリプトを提供したり、推奨に向けて私を正しい方向に向けたりできると思います。
ここに行く:
私は急いでいないし、過ごす時間もある。誰かが私と同じ状況にあり、あなた/彼らがどのように状況に対処するようになったのか知りたいです。
御時間ありがとうございます。
1.現在、6つのインスタンスに対して4つの論理プロセッサしかなく、MAX_DOPが0に設定されている場合、インスタンスごとに少なくとも1つの論理プロセッサが必要ですか?
それは、各インスタンスが平均してどのくらいのCPU使用率を使用しているかに依存しますか? この情報を取得 は、実行中のデフォルトのヘルスセッション拡張イベントから実行できます(2008+を想定)。
このワークロードには4つの論理プロセッサで十分かもしれません-データが得られるまでわかりません。そうは言っても、SQL Serverの各インスタンスはそれ自体で動作し、インストールされている他のインスタンスを認識していないので、Windowsがスレッドの交換についてあまり満足していないと思います。
私は待機統計dmvを見て、シグナルの待機部分で待機時間の割合が高いかどうかを確認します。これは、スケジュールの問題とインスタンス間の競合の可能性を示します。さらに、CPUコンテキストスイッチを使用してこれを傾向付け、インスタンスの正常性の「悪い時間」と「良い時間」との間に弱い相関または直接的な相関があるかどうかを確認します。
けれども私の直感は、これらがひどく十分に活用されていないインスタンスでない限り、このサーバーが問題に直面していることを教えてくれます-それらが今起こっているのか、それから数ヶ月後に起こるのか。
2.インスタンスごとに1つの論理プロセッサがある場合、MAX_DOPを0のままにするか、各インスタンスをMAX_DOP = 1に制限する必要がありますか?
MAXDOPは、単一の並列クエリが実行中に使用できる論理プロセッサ(「スケジューラ」)の数を制限するだけです。 SQL Serverが複数の並列クエリを実行するのを妨げるものは何もありません。実際、私はこの問題を診断して修正しました。スケジューリングの問題があることさえ知らない場所で何度も何度も修正しました(「ブロッキング」の問題と見なされていました)。
MAXDOPを1に設定すると、基本的にすべてのユーザークエリがシングルスレッドになります。この場合も、SQL Serverがシリアル実行を強制するだけなので、一度に複数のタスクを実行できます。つまり、各インスタンスには4つの表示可能なオンラインスケジューラがあり、合計で4 * xインスタンスの数の可能な同時クエリが可能です。ここでMAXDOPを設定しても、仮想サーバーがハイパースレッド(有効な場合)コアで実行できるかどうかに関する実際の設定を考慮せず、論理的に過負荷になる問題は解決されません。うわぁ。
MAXDOPを1に強制することは良いことでも悪いことでもありません。したがって、設定の影響はわかりません。繰り返しますが、私は間違いなく4に設定していません!
3.標準版であるため、代替案としてMAX_DOPを4に制限する必要がありますか?
まあ、それは4を超えることはできないので、すでに制限されています。この質問は、上記の質問と密接に関連していると思います。うまくいけば、私はそれを十分な理解のレベルで説明しました。
(並列処理のしきい値が小さいため) 並列化されているクエリの数 のアイデアが必要な場合は、実行計画dmvを確認できます。これはかなり費用のかかる操作なので、すべてのインスタンス間で、時間外または時間をほとんど使わずに実行してください。サーバーの共有の性質上、1つのインスタンスに対して行うことは(大体)すべてに対して行われることに注意してください。