はじめに
データベースのパフォーマンスを維持するうえで、メモリチューニングは非常に重要な要素です。
しかし実際には、ワークロードの変化に応じて
・設定を変更
・効果を確認
・再調整
といった作業を繰り返す必要があり、手間とスキルが求められます。
この課題を解決するのが、Db2のセルフチューニング・メモリー(STMM)です。
STMMを利用することで、Db2はメモリ使用状況を自動的に最適化し、運用負荷を大きく軽減できます。
本記事では、STMMの仕組み・設定・運用上のポイントを整理します。
Db2のメモリ構成の基本
STMMを理解するためには、まずDb2のメモリ構造を把握しておく必要があります。
Db2のメモリは大きく以下の3つに分かれます。
・データベース・マネージャー共用メモリ(インスタンス単位)
・データベース共用メモリ(DATABASE_MEMORY)
・アプリケーション・グローバル・メモリ(APPL_MEMORY)
特に重要なのがデータベース共用メモリであり、この中で以下の領域が使われます。
・バッファープール
・ソートヒープ
・ロックリスト
・パッケージキャッシュ
これらの領域にどれだけメモリを割り当てるかが、性能に大きく影響します。
STMMの仕組み(何が自動化されるのか)
STMMは、ワークロードに応じてメモリ配分を自動調整する機能です。
具体的には以下を対象にチューニングを行います。
・バッファープール
・ソートヒープ
・ロックリスト
・パッケージキャッシュ
動作のポイントは以下です。
・一定間隔(約30秒〜10分)で調整を実行
・不足している領域にメモリを割り当てる
・余っている領域からメモリを回収する
・必要に応じてOSからメモリを取得/返却する
つまり、**固定的な設定ではなく「動的に最適化され続ける」**のが特徴です。
STMMの設定方法
STMMは基本的にシンプルで、デフォルトで有効になっています。
有効化の基本パラメータ
SELF_TUNING_MEM = ON
これに加えて、各メモリ領域を自動化対象にする必要があります。
主な設定ポイント
・DATABASE_MEMORY = AUTOMATIC
・PCKCACHESZ = AUTOMATIC
・LOCKLIST / MAXLOCKS = AUTOMATIC
・SORTHEAP / SHEAPTHRES_SHR = AUTOMATIC
バッファープールは以下のように設定します。
CREATE BUFFERPOOL bp1 SIZE 1000 AUTOMATIC
また、STMMが有効に動作するためには
自動化対象のメモリ領域が2つ以上あることが条件です。
STMMの確認方法
STMMの動作状況は以下で確認できます。
構成確認
db2 get db cfg show detail
確認するポイントは以下です。
・SELF_TUNING_MEM が ON になっているか
・DATABASE_MEMORY が AUTOMATIC になっているか
・PCKCACHESZ / SORTHEAP / LOCKLIST などが AUTOMATIC になっているか
また、show detail を付けることで、AUTOMATIC設定の**現在の実効値(実際に使用されているメモリ量)**も確認できます。
バッファープール確認
SELECT * FROM SYSIBMADM.SNAPBP_PART
確認するポイントは以下です。
・BP_NAME(バッファープール名)
・CURRENT_SIZE(現在のサイズ)
・ページ数の変化
STMMが有効な場合、負荷に応じてCURRENT_SIZEが増減していることが確認できます。
ログ確認
・db2diag.log
・STMM専用ログ(stmmlog)
確認するポイントは以下です。
・メモリ調整が実行されたかどうか
・どのパラメータが変更されたか
・変更前後の値
特に db2diag.log には、
・バッファープールの拡張
・ソートヒープの調整
といったSTMMの具体的な動作履歴が出力されるため、実際にチューニングが行われているかの確認に有効です。
STMM運用時のポイント
STMMは便利な機能ですが、いくつか重要な注意点があります。
INSTANCE_MEMORYとの関係
INSTANCE_MEMORYは、インスタンス全体で使用できるメモリ上限を制御する重要なパラメータです。
・INSTANCE_MEMORY = AUTOMATIC の場合
OSの空きメモリを考慮して動的に調整されます。
このとき、使用可能なメモリ量はシステム全体のメモリ容量の約75%〜95%の範囲で決定されます。
・INSTANCE_MEMORY を固定値にした場合
その範囲内でのみSTMMが動作します。
そのため、AUTOMATIC設定にすることで、OSとのバランスを取りながら安全にメモリを活用できます。
※詳細は以下のIBMマニュアルを参照
https://www.ibm.com/docs/ja/db2/12.1.x?topic=parameters-instance-memory-instance-memory
DB_MEM_THRESの挙動
DB_MEM_THRESは、DATABASE_MEMORYとして確保したメモリのうち、未使用領域をどの程度保持するかを制御するパラメータです。
STMMはメモリを動的に増減させますが、その際に「使っていないメモリをすぐOSに返すのか、それとも保持しておくのか」をこのパラメータで決定します。
基本的な動作
例えば、DATABASE_MEMORY内で未使用メモリが増えた場合:
・DB_MEM_THRES を超える未使用メモリがある → メモリを解放(OSに返却)
・閾値以内 → メモリを保持
設定値ごとの意味
・0
未使用メモリは即時に解放される
→ OSのメモリを優先したい環境向け
・100
未使用メモリを常に保持する
→ 再利用を優先し、パフォーマンス重視
・中間値(例:10, 20など)
一定割合までは保持し、それ以上は解放
実務での重要ポイント
このパラメータは、以下のトレードオフに関係します。
・メモリの再利用性(パフォーマンス)
・OSとのメモリ競合(安定性)
例えば:
・DB_MEM_THRES が低い場合
メモリが頻繁に解放されるため、再確保のオーバーヘッドが発生しやすい
・DB_MEM_THRES が高い場合
Db2がメモリを保持し続けるため、他プロセスのメモリ不足を引き起こす可能性がある
バージョン差異の注意点
Db2 10.5以降では、デフォルト値は100です。
これは、近年のシステムでは「一度確保したメモリは再利用した方が効率的」という考え方が主流になっているためです。
運用上の考え方
基本的にはデフォルト(100)のままで問題ありません。
ただし、以下のような場合は調整を検討します。
・他アプリケーションとメモリを共有している
・OS側でメモリ不足が発生している
・スワップが頻発している
このような場合は、DB_MEM_THRESを下げることで、
Db2が占有するメモリ量を抑制できます。
STMMだけに任せてよいわけではない理由
STMMは汎用的なメモリの最適化を行う機能であり、「平均的なワークロード」に対して効果を発揮します。
しかし、以下のようなケースではパフォーマンスとしての最適化が不十分になる可能性があります。
・特定のSQLだけが極端に遅い
・バッチ処理などで瞬間的に負荷が集中する
・業務ごとに重要度が異なる(優先度制御が必要)
STMMは「どの処理が重要か」までは判断できないため、結果として重要な処理に十分なメモリが割り当てられない可能性があります。
手動調整が必要になる具体的な対応
以下のようなアプローチが有効です。
・特定のバッファープールを固定サイズで確保する
・問題となるSQLのアクセスプランを見直す
・RUNSTATSで統計情報を最新化する
・特定ワークロード用にリソースを分離する
つまり、
「全体最適はSTMM、個別最適は手動調整」
という役割分担が重要です。
他の運用との関係(なぜ重要か)
STMMはメモリの最適化機能ですが、実際の性能はメモリだけで決まるわけではありません。
Db2のパフォーマンスは、以下のような要素と密接に関係しています。
・バックアップ処理(I/O負荷の増加)
・ログ出力(ディスク使用量や書き込み性能)
・自動メンテナンス(RUNSTATS / REORGによる負荷)
例えば、バックアップやログ出力によってディスクI/Oが逼迫している場合、
STMMによってメモリを最適化しても、体感性能が改善しないケースがあります。
また、ログ肥大や履歴管理の問題があると、
メモリ以前に処理効率そのものが低下することもあります。
そのため、STMMは単体で評価するのではなく、
システム全体のリソースバランスの中で捉えることが重要です。
これらの詳細については、それぞれ以下の記事にまとめています。
Db2のバックアップとリカバリーとは?取得方式と運用設計の基本を解説
Db2のログと回復管理とは?トランザクションログの仕組みと実務運用を解説
Db2の自動メンテナンスとは?運用をどこまで自動化できるか解説
まとめ
STMMは、Db2のメモリチューニングを自動化する重要な機能です。
・メモリ配分を動的に最適化
・運用負荷を大幅に削減
・ワークロード変動にも対応
一方で、
・INSTANCE_MEMORYとの関係
・未使用メモリの扱い
・個別チューニングの必要性
を理解することで、より安定した運用が可能になります。
詳細仕様については、以下のIBM公式情報も参照してください。


コメント