SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

いちからはじめる Memory Optimized Table その 5

leave a comment

Memory Optimized Table のメモリ上ですが通常のデータベースページとは異なる領域として取得がされるようです。

以下は 900MB 程度のデータを Memory Optimized Table に格納した際のメモリの利用状態を SQL Server:Memory Manager から取得したものになります。
image

このカウンターでは Database Cache Memory ではなく Stolen Server Memory としてカウントされているようです。
Total Server Memory にはカウントされているようですね。

メモリに関しては動的管理ビューから取得をする必要があるようですね。
sys.dm_db_xtp_table_memory_stats
sys.dm_db_xtp_memory_consumers
sys.dm_xtp_system_memory_consumers

900 バイト程度のレコードを 1,000,000 件 (900MB 程度) 格納した状態の sys.dm_db_xtp_table_memory_stats の情報が以下になります。
# データ格納後に一度サービスを再起動して memory_allocated_for_table_kb をクリーンにしています。

image

この状態でデータを半分の 500,000 件にしてみます。
削除直後はメモリの割り当て状況は変わっていません。
image

メモリに関しては GC が動作したタイミングで回収されるようです。
以下は削除後に操作をしていてメモリの状態を確認したものになります。
# CHECKPOINT の実行や新たなデータの INSERT / 削除を行っていました。
image

memory_used_by_table_kb が半分になっていることが確認できます。
どのタイミングで GC が動作するのかがつかめていないのですが Memory Optimized Table によって割り当てられたメモリも不要になった部分は解放されるようになっています。
# memory_allocated_for_table_kb も回収されることがありますので、確保している部分も起動中に解放されるタイミングがあるようです。

GC に関してはいくつかの DMV が用意されています。
sys.dm_db_xtp_gc_cycle_stats
sys.dm_xtp_gc_queue_stats
sys.dm_xtp_gc_stats

sys.dm_db_xtp_gc_cycle_stats では、GC のサイクルの情報を確認することができ、最大 1,023 件の情報が取得できるようです。
image

sys.dm_xtp_gc_queue_stats ではキューの状態を確認することができます。
image

sys.dm_xtp_gc_stats では GC で回収されたページの情報等を確認することができます。
image

xperf で動作を確認していたところ、GC に関しては hkengine.dll で実行されているようでした。
CTP1 のシンボルファイルがロードできなくて、細かなスタックトレースまでは確認できていませんが。
# Memory Optimized Table については hkcompile.dll / hkengine.dll / hkruntime.dll が使われていそうですね。

 

Memory Optimized Table のテーブルですが、サービスの再起動には以下のようにロードがされます。

サービスの再起動が行われた際にはチェックポイントファイル (データファイル / 差分ファイル) を Memory Optimized Table としてロードします。
差分ファイルに関しては削除された行の情報が格納されており、それを差分マップとしてロードし、データファイルはそこをフィルタとして通すことでデータがロードされることになります。

90MB のデータが格納された状態のメモリの使用状況が以下になります。
image

DELETE を実行してデータの件数を半分にした直後が以下になります。
GC が動作するまではメモリが回収されませんので、memory_used_by_table_kb は変わっていません。
image

それではこの状態で SQL Server のサービスを再起動してみます。
再起動をすることで、Memory Optimized Table のデータの再ロードが行われますが、この際には削除されているデータを格納している差分ファイルをフィルタとして通しますので、再ロード後のデータは削除が反映されているものになります。
# このあたりの動作はチェックポイントファイルのマージ状態にも依存しそうで、マージが行われていない状態だと、メモリの割り当ては削除前と同じということもありそうでした。。
image

メモリ解放のタイミングなどはきちんと把握しておきたいですね。


いちからはじめる Memory Optimized Table その 1
いちからはじめる Memory Optimized Table その 2
いちからはじめる Memory Optimized Table その 3
いちからはじめる Memory Optimized Table その 4
いちからはじめる Memory Optimized Table その 5 ←今回の投稿

Written by masayuki.ozawa

7月 11th, 2013 at 11:52 pm

Posted in SQL Server

Tagged with ,

Leave a Reply

*