Agenda
はじめに
「メモリ」って何だろう?
SQL Server
で使うメモリ
メモリ関連の設定
メモリ周りのトラブル
モニタリング
はじめに
全体のテーマ
本セッションではSQL Serverのメモリを理解するための知識 とその挙動を説明しますゴール
メモリに関わる知識を整理し、わからない単語を無くす 自分の関わるシステムをメモリを切り口に振り返ってみる トラブルが起きたときに何が起きたのか想像できるように なる物理メモリと仮想メモリ
物理メモリと仮想メモリの違いは説明できますか? mallocやnewで確保できるメモリはどちらでしょうか?物理メモリについて
物理メモリはマザーボードに刺さっているあの「メモリ」 物理メモリの詳細については今回は触れない → 内部の動きはハードウェア屋さんへ「メモリ」って何だろう?
昔は仮想メモリなんて無かった
プログラムが使うメモリ=物理メモリ(少ない) マルチスレッドで動かすことは稀だった プログラムがOSを暴走させるなんて当たり前だったもう我慢の限界!!
もっとメモリが使いたい! プログラム間でメモリのやりくりなんてしたくない! ちょっとくらいマナーが悪いプログラムも許してくれ!そこで仮想メモリです
プログラムごとに独立した(比較的大きな)メモリ空間 独立しているからプログラム同士が干渉しあわない 物理メモリサイズ以上の大きさの空間を使える OSの動作は保護される 等々のメリットがある昨今の
OS
は全て仮想メモリが利用できます
「メモリ」って何だろう?
仮想メモリとは
プロセスごとに用意された仮想のメモリ空間 プロセスは仮想メモリに対して読み書きを行う OSは仮想メモリアドレスを物理メモリアドレスに変換するWindows
では
32ビットの場合、4Gが表現上の最大 OSとプロセスでそれぞれ2GBまで使えるAddress 仮想メモリ Page Director y Page Table 物理メモリ CR3 レジスタ
「メモリ」って何だろう?
用語 用語 用語 用語 説明説明説明説明 ワーキングセット プロセスが使っている仮想メモリの内、物理メモリに乗っているメ モリページ ページング ワーキングセットの内、あまり使われないメモリをページファイル に書き出す、またはページファイルから物理メモリに書き戻す動 作 TLB (Translation Look aside Buffer) 仮想アドレスと物理アドレスの変換テーブルをバッファリングする 領域。プロセッサ上に存在する ページファイル 物理メモリからページアウトされたデータを待避するファイル用語 用語 用語 用語 説明説明説明説明 ヒープ プロセスごとに存在するメモリの「山」。メモリ要求を出すと、適宜 切り出して使える。戻すと山に残っている隣り合ったメモリのかた まりとくっついて、次の要求に備える。Mallocやnewで取られる。 プール カーネルが持っているメモリの「池」。OSやカーネルが使うメモリ。 ページプールや非ページプールなどがある。ページング処理より 高いレベルで動作する場合は非ページプールを使う必要がある。 仮想メモリの状態 Committed/Reserved/Freeの3つがある。利用されている場合は Committed。後から使うので予約しておきたいときはReserved。 perfmon パフォーマンスカウンタ。Windows OSでは標準的にパフォーマ ンス取得に利用される。SQL Serverのカウンタも取得できる。内部 的にはレジストリアクセスし、定期的に計上される値を取得する。
SQL Server
が使うメモリ
Buffer Pool
8kbで管理され、メモリ空間の大半を占める
Data Page Cache Plan Cache Lock Sort
Mem To Leave
8kbで収まらないオブジェクトの管理や非定 型な利用が多い Call Stack CLR/Xp Buffer Pool Mem To Leave Data Page CachePlan Cache Lock
SQL Server
が使うメモリ
Buffer Pool
の管理方法
LRU-Kアルゴリズム よく使われるものはメモリ上に残る 8KBの単位で利用されるCache Hit
オブジェクトを要求したとき、そのオブジェクトがメモリ上に あった → Cache Hit!!SQL Server
が使うメモリ
バッファプールとディスク
I/O
LRU-Kアルゴリズムでデータはメモリから追い出される バッファのデータはデータファイルへ書き込まれる 書き込みはLazywriterが行うLazywriter
定期的にメモリをチェックし、不必要なデータをファイルに 書き出す メモリ不足(=メモリプレッシャー)になってくるとチェック間隔 が短くなるSQL Server
が使うメモリ
仮想メモリの上限
32ビットの場合、4Gが表現上の最大 2^32 = 4G 32ビットではOSとプロセスでそれぞれ2GBまで使える ユーザ空間を3GBにすること(4GT)が可能だが非推奨 http://support.microsoft.com/kb/171793/ja ページテーブル不足、プール不足を招く 64ビットは現時点では事実上の無制限メモリ関連の設定
最大サイズと最小サイズ
Max server memory
SQL Serverが使うメモリの最大値
Min server memory
メモリを縮小していくときの最小値
実は最もメモリが小さいのは起動直後
起動直後は
(memory size) < (min server memory) があり得る
Buffer
Pool Buffer Pool Buffer Pool 起動 直後 最大 拡張 縮小 Min server memory Max server memory
32bit で4GB以上のメモリを使う設定
/PAEオプションをつけたOS起動(bcdeditやboot.ini)
Lock Page in Memory 権限
SQL Serverの起動アカウントに権限を付与する
AWE領域を確保するAPI(AllocateUserPhysicalPage)の実行条件となる
AWE enabled
SQL ServerがAWE領域を使えるように設定
Max server memoryの指定
AWE領域は開放されないので領域確保には上限を設ける
メモリ関連の設定
AWE
って何?
AWEはAddress Windowing Extensionsの略で、OSに搭載 された機能の1つ 仮想メモリ空間に「Window」 を作り、物理メモリをマッピン グすることで4GB以上のメモリ を利用できる
SQL ServerはData Page Cache しかAWE領域を使えない Buffer Pool Data Page Cache Plan Cache Lock Sort AWE Area
個人的なお勧め
OSもSQL Serverも64bitを利用する
Lock Page in Memory権限を付与する
Max server memoryを指定し、OSに十分なメモリを残す
メモリ周りのトラブル
ワーキングセットのトリミング OSは物理メモリが極端に不足するとワーキングセット(=プロセスが 使っている物理メモリ)を強制的に取り上げる → ワーキングセットのトリミング Sqlservr.exeだけではなく、他のプロセスもワーキングセットが減少する 64bitOSでよく発生し、パフォーマンス劣化を起こしやすい 回避策Lock Page in Memory権限を起動アカウントに与える Max server memoryを設定する
処理量に対してメモリが不足している 大量のバッファが必要になると、SQL Serverはlazywriterがデータファ イルへバッファを書き出す その結果、バッファだけのデータ参照ができる確率が下がり、パ フォーマンスが劣化する 一見I/Oのネックに見えることもある 回避策 物理メモリを増やす 不必要なデータスキャンが起きていないか調べてみる システムテストでメモリ不足が起きないか事前にチェックする
モニタリング
モニタリングの意義 障害分析、警戒のため何らかのモニタリングが必要 パフォーマンス値は後からは取れない! モニタリング対象 物理メモリの空き容量 SQL Serverがどれくらい効率的にメモリを再利用しているか 過度なページングが発生していないか 等々。 他にも観点はたくさん http://msdn.microsoft.com/ja-jp/library/ms176018.aspx監視対象 監視対象 監視対象 監視対象 閾値閾値閾値閾値 説明説明説明説明 Memory: Available Bytes OS でFreeであると認識されている物理メ モリの容量 Process(SQL Server): Pages/sec Sqlservr.exe が秒当たりページングした回 数 Process(SQL Server):
Working set Sqlservr.exe
が使っている物理メモリの容
量 SQL Server:
Buffer Manager: Cache Hit Ratio
90%以上 Buffer poolでのキャッシュヒット率。高い ほどメモリが効率的に使われていること を示す
SQL Server:
Buffer Manager: Page Life Expectancy
300以上 Buffer pool上にページが乗っている時間 (=ページの寿命)。高い方がメモリが効 率的に使われていることを示す
モニタリング
パフォーマンス値解釈の注意点 閾値超過が起きても必ず問題となるわけではない アプリケーションが性能要件を満たしていれば何の問題もな い!!必要以上に閾値監視にこだわらない (一瞬の閾値超過でも影響が少なければ無視で良いはず) 注意すべき動作 SQL Serverはメモリの先読みをするので、メモリプレシャーになっ ていてもキャッシュヒット率が高い場合がある仮想メモリと物理メモリの違い
プロセスが使うのは仮想メモリ。OSが物理メモリに変換
SQL Serverのメモリコンポーネント
Buffer PoolとMem To Leave
メモリ制御のパラメータ
Max/min server memory, AWE, Lock Page in Memory
よくあるメモリトラブル
ページング、ワーキングセットのトリミング、メモリプレッシャー
モニタリングの方法