sql >> データベース >  >> RDS >> Database

ラッチの概要

    パフォーマンスの調整に関するこれまでの記事のいくつかでは、複数の待機タイプと、それらがさまざまなリソースのボトルネックをどのように示しているかについて説明しました。ラッチと呼ばれる同期メカニズムがパフォーマンスのボトルネックであり、特に非ページラッチであるシナリオで、新しいシリーズを開始しています。この最初の投稿では、ラッチが必要な理由、実際のラッチ、およびラッチがボトルネックになる可能性について説明します。

    ラッチが必要な理由

    マルチスレッドシステムにデータ構造が存在する場合は常に、データ構造を何らかの方法で保護する必要があるというのがコンピュータサイエンスの基本的な信条です。この保護により、次の条件が与えられます。

    1. (保証)別のスレッドがデータを読み取っている間は、スレッドがデータ構造を変更することはできません。
    2. (保証)別のスレッドがデータ構造を変更している間は、そのスレッドがデータ構造を読み取ることはできません。
    3. (保証)2つ以上のスレッドで同時にデータ構造を変更することはできません
    4. (オプション)2つ以上のスレッドが同時にデータ構造を読み取ることを許可します
    5. (オプション)データ構造にアクセスするために、スレッドが順序付けられた方法でキューに入れられるようにします

    これは、次のようないくつかの方法で実行できます。

    • 一度に1つのスレッドのみがデータ構造にアクセスできるようにするメカニズム。 SQL Serverはこのメカニズムを実装し、それをスピンロックと呼びます。これにより、上記の#1、#2、および#3が可能になります。
    • 複数のスレッドが同時にデータ構造を読み取ることを可能にし(つまり、共有アクセスを持つ)、単一のスレッドがデータ構造への排他的アクセスを取得できるようにし(他のすべてのスレッドを除外して)、実装するメカニズムアクセスのためのキューイングの公正な方法。 SQL Serverはこのメカニズムを実装し、それをラッチと呼びます。これにより、上記の5つの条件すべてが可能になります。

    では、なぜSQLServerはスピンロックとラッチの両方を使用するのでしょうか。一部のデータ構造は頻繁にアクセスされるため、ラッチが高すぎるため、代わりに非常に軽量のスピンロックが使用されます。このようなデータ構造の2つの例は、バッファープール内の空きバッファーのリストと、ロックマネージャー内のロックのリストです。

    ラッチとは何ですか?

    ラッチは、単一のデータ構造を保護する同期メカニズムであり、SQLServerには大きく分けて3つのタイプのラッチがあります。

    1. ディスクから読み取られている間、データファイルページを保護するラッチ。これらはPAGEIOLATCH_XXが待機しているときに表示され、この投稿で説明しました。
    2. すでにメモリ内にあるデータファイルページへのアクセスを保護するラッチ(バッファプール内の8KBページは実際には単なるデータ構造です)。これらはPAGELATCH_XXが待機しているときに表示され、この投稿で説明しました。
    3. 非ページデータ構造を保護するラッチ。これらは、LATCH_SHおよびLATCH_EXが待機しているときに表示されます。

    このシリーズでは、第3の種類のラッチに焦点を当てます。

    ラッチはそれ自体が小さなデータ構造であり、次の3つのコンポーネントがあると考えることができます。

    • (保護対象の)リソースの説明
    • 現在ラッチが保持されているモード、そのモードでラッチを保持しているスレッドの数、待機中のスレッドがあるかどうか(およびその他の関係事項)を示すステータスフィールド
    • >
    • データ構造へのアクセスを待機しているスレッドの先入れ先出しキュー、およびそれらが待機しているアクセスモード(待機キューと呼ばれる)

    非ページラッチの場合、データ構造を読み取るためのアクセスモードSH(共有)とデータ構造を変更するためのEX(排他的)のみを考慮することに限定します。他にもエキゾチックなモードがありますが、それらはめったに使用されず、競合ポイントとして表示されないため、このディスカッションの残りの部分では存在しないふりをします。

    スケーラビリティのためにスーパーラッチ/サブラッチとラッチパーティショニングの周りにもさらに複雑な問題があることをご存知の方もいらっしゃるかもしれませんが、このシリーズの目的のためにその深さまで進む必要はありません。

    ラッチの取得

    スレッドがラッチを取得する場合、スレッドはラッチのステータスを確認します。

    スレッドがEXモードでラッチを取得する場合、どのモードでもラッチを保持しているスレッドがない場合にのみ取得できます。その場合、スレッドはEXモードでラッチを取得し、それを示すステータスを設定します。すでにラッチを保持しているスレッドが1つ以上ある場合、スレッドはステータスを設定して待機中のスレッドがあることを示し、待機中のキューの一番下に入ると、一時停止されます(待機中のスケジューラの待機リストに表示されます)。 )LATCH_EXを待っています。

    スレッドがSHモードでラッチを取得したい場合は、ラッチを保持しているスレッドがないか、ラッチを保持しているスレッドのみがSHモードであり、ラッチの取得を待機しているスレッドがない場合にのみ取得できます。その場合、スレッドはSHモードでラッチを取得し、それを示すステータスを設定し、ラッチを保持しているスレッドの数を増やします。ラッチがEXモードで保持されているか、待機中のスレッドが1つ以上ある場合、スレッドはステータスを設定して待機中のスレッドがあることを示し、待機中のキューの一番下に入り、LATCH_SHの待機を一時停止します。

    待機中のスレッドのチェックは、EXモードでラッチを待機しているスレッドの公平性を確保するために行われます。ラッチを取得したSHモードでラッチを保持しているスレッドを待機するだけで、待機を開始できます。このチェックを行わないと、SHモードでラッチを取得するスレッドの一定のストリームによって、EXモードのスレッドがラッチを取得できなくなる場合に、「スターベーション」と呼ばれるコンピュータサイエンス用語が発生する可能性があります。

    ラッチの解放

    スレッドがラッチをEXモードで保持している場合、ラッチがEXモードで保持されていることを示すステータスの設定を解除してから、待機中のスレッドがあるかどうかを確認します。

    スレッドがSHモードでラッチを保持している場合、SHモードスレッドの数が減少します。カウントがゼロ以外の場合、解放スレッドはラッチで実行されます。カウントがゼロになった場合は、ラッチがSHモードで保持されていることを示すステータスの設定を解除してから、待機中のスレッドがあるかどうかを確認します。

    待機中のスレッドがない場合、スレッドの解放はラッチを使用して行われます。

    待機キューの先頭がEXモードを待機している場合、解放スレッドは次のことを行います。

    • ラッチがEXモードで保持されていることを示すステータスを設定します
    • キューの先頭から待機中のスレッドを削除し、ラッチの所有者として設定します
    • 待機中のスレッドに、それが所有者であり、現在実行可能であることを通知します(概念的には、待機中のスレッドをスケジューラーの待機リストからスケジューラーの実行可能キューに移動します)
    • そしてそれはラッチで行われます

    待機キューの先頭がSHモードで待機している場合(これは、解放スレッドがEXモードの場合にのみ発生する可能性があります)、解放スレッドは次のことを行います。

    • ラッチがSHモードで保持されていることを示すステータスを設定します
    • SHモードを待機している待機キュー内のすべてのスレッド
      • キューの先頭から待機中のスレッドを削除します
      • ラッチを保持しているスレッドの数を増やします
      • 待機中のスレッドが所有者であり、実行可能になったことを通知します
    • そしてそれはラッチで行われます

    ラッチはどのようにして競合ポイントになることができますか?

    ロックとは異なり、ラッチは通常、読み取りまたは変更操作の間のみ保持されるため、かなり軽量ですが、SHとEXの非互換性のため、ロックと同じくらい大きな競合ポイントになる可能性があります。これは、多くのスレッドがすべてEXモードでラッチを取得しようとしている場合(一度に1つのみ)、または多くのスレッドがSHモードでラッチを取得しようとしていて、別のスレッドがEXモードでラッチを保持している場合に発生する可能性があります。

    >

    概要

    「ホット」ラッチをめぐって競合するシステム内のスレッドが多いほど、競合が大きくなり、ワークロードスループットへの悪影響が大きくなります。 tempdb割り当てビットマップなど、よく知られているラッチの競合の問題について聞いたことがあると思いますが、ページ以外のラッチでも競合が発生する可能性があります。

    これで、ラッチとその機能を理解するのに十分な背景がわかりました。次のいくつかの記事では、実際の非ページラッチの競合の問題を調べ、それらを防止または回避する方法を説明します。


    1. max_allowed_pa​​cketmysql変数を確認および設定する方法

    2. トラブルシューティング:MySQL / MariaDBエラー#1044および#1045ユーザーのアクセスが拒否されました

    3. Oracleの関数とプロシージャ

    4. ログバッファフラッシュについて