はじめに
Oracle Databaseを運用していると、システムメモリの不足によりスワップ(swap)領域が頻繁に使われる状況に遭遇することがあります。
これは、データベースのパフォーマンス低下やレスポンスタイム悪化の直接的な原因になります。
本記事では、Linux上で稼働するOracle Databaseにおいて、swapの発生を軽減または回避するための方法を解説します。
なお、直近でDBサーバのスワップの障害が発生したため、調査した結果を纏めております。
1.なぜswapが問題なのか?
swap発生の主な影響:
・Oracle SGAの一部がディスクへ退避 → ディスクI/Oの増加
・OSのコンテキストスイッチが増加 → CPU負荷の上昇
・PGA処理の遅延 → ユーザ処理時間の悪化
2. swapが発生する主な原因
・SGAサイズやPGAサイズが物理メモリに対して大きすぎる
・Oracleインスタンスが複数起動している
・HugePagesが未設定(SGAが通常の4KBページで動作)
・メモリ割り当てに対するカーネルチューニング不足
・OS上で他のプロセス(監視、ジョブ、バックアップなど)がメモリを大量使用している
3. swap軽減のための対策方法
以下の施策を実施することで、swapの発生を軽減することができます。
3-1. HugePagesの利用
1) Oracleメモリ構成の変更(AMM → ASMM)
AMM(SGA_TARGET+MEMORY_TARGET)を使用している場合は、AMMとHugePagesは併用不可のため、ASMMに切り替えが必要です。
※AMM:Automatic Memory Management(自動メモリ管理)
OracleがSGA(System Global Area)とPGA(Program Global Area)の両方を1つのパラメータ(MEMORY_TARGET)で自動調整する仕組み。
使用される共有メモリ領域は/dev/shm
で、HugePagesと併用不可。
※ASMM:Automatic Shared Memory Management(自動共有メモリ管理)
OracleがSGAのみを自動管理し、PGAは別のパラメータ(PGA_AGGREGATE_TARGET)で個別に設定。
SGA_TARGET
や SGA_MAX_SIZE
を使用。HugePagesと併用可能。
-- 設定例
ALTER SYSTEM SET MEMORY_TARGET=0 SCOPE=SPFILE;
ALTER SYSTEM SET SGA_TARGET=8G SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=4G SCOPE=SPFILE;
2) Transparent HugePages(THP)の無効化
Transparent HugePagesを使用すると、実行中にメモリ割当ての遅延が生じるため、Transparent HugePagesはOracle Databaseサーバで無効にすることが推奨されています。
・ /etc/grub.conf
に transparent_hugepage=never
を設定追加
・ grub2–mkconfig
コマンドを実行して grub.cfg
ファイルを再生成
・ OS再起動後、cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
で never
になっていることを確認
3) HugePagesを有効化する
SGAが8GB(昔は4GBぐらい)を超える場合はHugePagesを利用することが推奨されています。HugePagesでは、OSがSGA領域をswap対象外とします。
・ Oracle提供スクリプト(Doc ID 401749.1)で必要ページ数を見積
・ /etc/sysctl.conf
に vm.nr_hugepages
を設定
・ limits.conf
に oracleユーザの memlock 制限を設定
・ OS再起動後、/proc/meminfo
でHugePagesの使用を確認
3-2. OSのカーネルパラメータ設定
1) vm.swappinessの設定
/etc/sysctl.conf に以下を設定して、スワップの使用を抑制する。
swappiness は0~100の値(低いほどswapを回避)
vm.swappiness = 1
以下のコマンドにて設定を反映する。
sysctl -p
2) vm.min_free_kbytesの設定
vm.min_free_kbytes
パラメータは、Linuxが確保しておくべき最小限の「空きメモリ」量(KB単位)を指定します。つまり、システムはこの量を下回らないように積極的にメモリを解放します。
この値が小さいと、カーネルはよりギリギリまでメモリを使用し、突然のメモリ要求に対応できずスワップを発生させることがあります。
この値をある程度大きくすると、予防的にメモリの余裕を確保し、スワップが発生しにくくなるという効果があります。
/etc/sysctl.conf に以下を設定して、空きメモリ量を指定する(設定例:128MB → 131072KB)。
vm.min_free_kbytes = 131072
以下のコマンドにて設定を反映する。
sysctl -p
4. まとめ
Oracle Databaseのスワップ発生はパフォーマンスに直結する重要な要素です。適切なメモリチューニング、HugePagesの活用、THPの無効化など、OSとDB両面からの対策が必要です。これらを実施することで、より安定したDB運用が可能になります。