先日、SQL Server 2025 CU5 がリリースされました。
この中に次の対応が含まれていしたので、情報をまとめておきたいと思います。
SQL Server 2025 CU5 では、Server configuration: max lock manager cache memory (%) という設定が追加されました。
これは、「ロックマネージャーキャッシュメモリ」という、ロックに関連するメモリについての制御を可能としたものとなります。
SQL Server 2025 CU5 より前は、このキャッシュ領域は「SQL Server にコミット済みメモリの 60%」までキャッシュするような気候となっていました。
SQL Server では 1 ロック当たり 96 バイトのメモリ を使用します。
各ロックはそれぞれ 96 バイトのメモリを消費するため、この値を大きくした場合、状況によってはサーバー専用のメモリも増やす必要があります。
SQL Server では、動的なロック粒度の調整 / ロックエスカレーションの機構があるため、通常はロックのメモリが大量に消費されるということはありませんが、ワークロードによっては
- ロックエスカレーションを明示的に抑制している
- 他のセッションのロックにより、ロックエスカレーションが成功しない
というような状態が発生することがあります。
このような状態で、大量のロックが取得されるような処理が行われた場合、ロックで使用されるメモリが次のような状態となります。
次の画像は、SQL Server で46 GBのメモリを確保しており、その中の 27 GB (約 60%) がロックで使用されているという状態となります。(画像の Resource Quick Panel は、先日公開した SSMS 拡張機能 を使用したものとなります)
SQL Server 2025 CU5 で新たに追加された 「max lock manager cache memory (%)」の設定は、この 60% の閾値を変えるものではありません。
「ロックとして取得可能なメモリはコミット済みメモリの 60%」というのは、CU5 以降も変わらないようです。
CU5 で変わるのは、「このロック用のメモリをキャッシュしておく際の最大サイズ」となるとのことでした。
ロックのメモリは瞬間的に 60% まで確保することができます。
実際に 60% まで取得された以降のワークロードでも大量にロックが取得される可能性を考慮し、SQL Server はロック用のメモリ確保のオーバーヘッドを抑えるため、一度取得したロック用のメモリをキャッシュした状態とし、新たにロック取得の要求が発生した場合は、新規にメモリを確保するのではなく、キャッシュされたメモリから割り当てるという動作が行われるということでした。
この際、一度確保したロック用のメモリをどの程度までキャッシュしておくかを考慮する必要があるのですが、これが変更できるようになったのが SQL Server 2025 CU5 で追加されたオプションとなります。
- SQL Server 2025 CU5 より前
- 瞬間的には SQL Server にコミットされているメモリの最大 60% までロックで使用可能
- ロックメモリ確保後、SQL Server にコミットされているメモリの最大 60% までロックキャッシュとして保持
- SQL Server 2025 CU5 以降
- 瞬間的には SQL Server にコミットされているメモリの最大 60% までロックで使用可能
- ロックメモリ確保後、SQL Server にコミットされているメモリの最大 20% までロックキャッシュとして保持
- SQL Server 2025 CU5 では、max lock manager cache memory (%) の初期値は 20
- 20~60 までで設定変更が可能
大量のロックを取得するワークロードでは、ロックキャッシュのメモリがデータキャッシュを圧迫し、パフォーマンスに影響を与えるケースがありますが、これを抑制するために SQL Server 2025 CU5 からロックメモリでキャッシュしておくサイズを調整できるようになり、初期値が 60 -> 20 に変更されたようです。
私が確認した範囲では、DMV / パフォーマンスモニターから取得できるのは「ロックキャッシュのメモリサイズ」となり、キャッシュ内でどの程度使用しているのかを単純に把握することは難しそうでした。
sys.dm_tran_locks の COUNT を定期的に取得して代替ということはできるかもしれませんが、大量にロックが取得されている環境では、件数の取得も厳しそうです。