Oracle DatabaseのZoneへのインストール
Solaris 11.4内のNative Zone(通常のSolaris11のZoneや、Branded ZoneのSolaris10を含む)を利用し、この中にOracle Databaseをインストールすることが多々あります。
この場合、IPC(Inter Process Communication:プロセス間通信)などの設定をする必要があります。
下記は、利便性の為に記載されたものです。実際はマニュアルなどを読み、設定してください。
- Oracle Solaris コンテナで Oracle Databaseを実行するためのベストプラクティス
- Best Practices for Running Oracle Databases in Oracle Solaris Containers
Global Zoneの準備
Swapの増加
たとえば256GBに増加したい場合は、Global ZoneのSwapを増やします。
zfs set volsize=256g rpool/swap
確認は下記の様に行います。
swap -l
増加時に再起動は要りませんが、設定した瞬間に多少、もたつく時間がかかり、swapコマンドでみると、複数のSwapエリアがあるように見えます。しかし、reboot後は、エントリが一つにまとめられます。
Solarisにおいて、Zoneは複数作られる可能性が高いので、Global Zoneは大きめに設定しておく方が良いでしょう。
また、Solarisのメモリマネージャの構造から、搭載してるメモリと同程度〜2倍ぐらいが目安と言われています。
non Global Zone準備
non Global Zoneの作成
Oracle Database を動かす non-global zone を作成します。
sudo zonecfg -z oracle-zone01 create -b set brand=solaris set zonepath=/dpool1/zones/oracle-zone01 set autoboot=true set ip-type=exclusive ---- NICやディスクなどの設定は割愛 ----
Oracle DBは、CPUがコアライセンスになることが多いため、必要に応じてコアを定義します。下記は、8コア目から12コア目の4コアをアサインしています。Zoneのdedicated-cpuは、Oracle Databaseでいう「Hard Partitioning」に相当します。※詳しくはOracle Databaseのライセンスを調べて下さい。
add dedicated-cpu set ncpus=8-11 end
Swapメモリの制限値を指定したい場合は、下記の様に設定します。
capped-memoryにはphysical(物理メモリの設定)がありますが、この値を設定することは推奨しておりません。このメカニズムは物理的にメモリを制限するアプローチではありません。rcapdというdaemonに対し、1秒間に数回ポーリングしてzone内のプロセスが専有するメモリページのサイズを調べ、必要とあれば仮想メモリマネージャがpage outするよう促す仕組みです。
この機能が働くときは、仮想メモリマネージャーがページアウトが始まるため、ZoneだけでなくGlobal Zoneを含めた全体に負荷がかかります。
一方、swapは実際のswapメモリの事実上のハードリミットとして動作し、zone内のプロセスがmalloc時にメモリの確保が「できないように」します。
add capped-memory set swap=32G end
Oracle Databaseは、IPC(Inter Process Communication:プロセス間通信)パラメーターの共有メモリ(SHM)の設定を増やす必要があります。これらのSHM-MEMORY、SHM-IDS、SEM-IDSは、環境が「ちょうど良い」値を指定してください。IPCを含むこれらの値は、zoneが利用するswap値とは別の領域です。
set max-shm-memory=32G set max-shm-ids=1024 set max-sem-ids=1024
上記の設定をすると、実際には下記の様に登録されています(zonecfg exportで確認)。
add rctl set name=zone.max-swap add value (priv=privileged,limit=34359738368,action=deny) end add rctl set name=zone.max-shm-memory add value (priv=privileged,limit=34359738368,action=deny) end add rctl set name=zone.max-sem-ids add value (priv=privileged,limit=1024,action=deny) end add rctl set name=zone.max-shm-ids add value (priv=privileged,limit=1024,action=deny) end
non Global Zone内の設定
パッケージのインストール
Zoneが起動したら、下記のパッケージをインストールします。non-global zones は、Group Package である group/system/solaris-small-server がベースとなっているため、最小のソフトウェアセットしかインストールされていないためです。
pkg install -v xauth make motif libxp libxtst xterm libxi developer/assembler
ユーザの作成
group、userの順で作成します。
sudo groupadd -g 200 oinstall sudo useradd -u 201 -g oinstall -G dba,asmdba,oper -d /export/home/oracle -m oracle sudo passwd oracle
id コマンドでoracle ユーザの情報を確認しておきます。
id -a oracle uid=201(oracle) gid=200(oinstall)
プロジェクトの作成とリソースのアサイン
リソースマネージャーのためにプロジェクトを作成し、ユーザに割り充てます。
sudo projadd group.dba sudo projmod -s -K "project.max-shm-memory=(priv,32gb,deny)" group.dba sudo projmod -s -K "project.max-max-sem-ids=(priv,512,deny)" group.dba sudo projmod -s -K "process.max-file-descriptor=(priv,65536,deny)" group.dba
user_attrを編集します。
vi /etc/user_attr oracle::::project=group.dba
以降は、oracleユーザでloginを行い、インストールなどを行います。かならずログインしなおしてください。
これで、Oracle Databaseのインストールが可能です。
ZFS パフォーマンス最適化設定
Oracle Databaseを利用するzfsのデータセットは、logbiasの値をthroughputにすることを推奨しています。ここではこのエントリの設定方法と、その理由を説明しています。
ZFSは、「データセットごと」に同期書き込み(sync write)モードを制御できるプロパティlogbiasがあります。
この設定は、本来、応答速度(レイテンシ)を重視するか、データ転送量(スループット)を重視するかを選択するものです。Oracle Databaseなどの連続書き込み量が多い業務アプリケーションの場合、において、ZFSプロパティであるlogbiasの設定を変更することで、システム全体のI/O効率が向上することがあります。
logbias の設定値と動作
設定値 | 概要 |
---|---|
latency | (デフォルト)低レイテンシ応答を重視。ZFSの独自のsync構造を利用し、Writeを高速化します。 |
throughput | 全体のスループットを重視。ZFSはプール全体のI/O効率を最大化する方針で書き込みします。 |
参考≫ 仮想マシン(LDOM)内におけるlogbiasの働きについて
Oracle Database での利用
Oracle Databaseでは以下のようなワークロードにlogbias=throughputに設定すると、速度が向上することがあります。
- REDOログの書き込み
- バルクロードやデータウェアハウス系処理
- 大量の連続書き込みが発生するワークロード
この設定により、ZFSのsync writeスキームが、データを直接プールに書き込むことを優先することになります。
Oracle Database 以外での応用
SSPCでは、Enterprise Storageを用いた3 Tier型でミラー化されたトポロジーが採用されることが大半です。この場合、仮想マシンからみたとき、1つ1つのWriteレイテンシは長くなりがちですが、Enterprise Storage自体は非常に高速なNVMeのSSDで構築されていることから、IOが使い尽くされることはほぼないかわりに、そのスループットをなかなか使い切ることができません。
そこで、複数の書き込みが同時に発生するアプリケーションを利用する場合、デフォルトのlatencyのままだと、IOレイテンシが目立つことがあります。そこで、logbiasをthroughputにすることにより、結果として平均的なレイテンシが改善することがあります。
設定手順
zfs set logbias=throughput poolname/dataset
仮想マシン(LDOM)内におけるlogbiasの働きについて
SSPCでは、仮想マシン(LDOM)内で使われるため、SLOG(ZILの外部の永続化ストレージ)が仮想OS内で使われることはありません。しかし、Oracleのマニュアルのlogbiasの説明では、SLOG(Separate ZFS Intent Log device)との関係に終始されているため、仮想環境内においてこのパラメタがどのような動きをするのか、正確に理解できないシステム管理者は多いでしょう。
ZFSの書き込み構造
ZIL(ZFS Intent LOG) の基本的な構造
ZIL(ZFS Intent Log)は、アプリケーションからの書き込みを記録するためのログバッファのメモリ(itx=intent log transaction)と、ZILブロックというストレージの中で最も速い領域の2つがあります。
ZILブロックは次の2つのどちらかかとなっています。
- 実体のプールでは各top-level vdev上の予約ログ領域(ハードディスクとしては最も速い場所)
- slog(Separate log)といって別の高速デバイス(NVMeSSDなど)
しかし仮想マシン内では、slogは存在しないケースが普通のため、1のtop-level vdev上の予約ログ領域と認識しておくのが良いでしょう。ただし、ハードディスクでは「プール上の最も速い領域」となりますが、Enterprise SSDを用いる場合、基本的にどの領域も速度は変わりません。
ZFSに対してディスク書き込みをするとき、次のようなフェーズを取ります。
- 書き込み要求
- 各writeに対して即座にデータプールへ書き込むのではなく、まずZILのitx(intent transaction)がスレッドローカルリングに入り、zil_itx_assign()にてZILオブジェクトキューに積まれます。
- トレイン化
- 基本的に、ZILはRAM上に構築されます(≒In-core ZIL)。zil_commit()やzil_sync()が発効されるか、タイマ(5秒など)が切れると、zil_lwb_commit()がitx(intent transaction)群をLWB(log write buffer)にパッキングし、メモリ上のZILトレインが発車します。簡単に言えば、fsyncなどがあれば即時発車、タイマ単位でZILはディスクに書き込みをしようとします。
- フラッシュ処理(ディスクI/O)
- ここからの処理がlatencyとthroughputで異なります。
フラッシュ処理 | logbias=latency (注:SLOG 無し想定) | logbias=throughput |
---|---|---|
3-1. itx 生成 | WR_COPIEDモードで動きます。 itx 内にはフルデータをコピーします。 | WR_INDIRECTに強制します。 itx は「ポインタ+メタデータ」のみ保存されます。 |
3-2. LWB 書き込み | LWBにデータ本体を含むので、ZILブロック(最も速い領域)に書きます。 | LWBにあるメタデータを書き込み。 + dmu_sync() でデータを本番ブロックへ直接書きます。METASLABのブロックサーチはこの行程で行います。 |
3-3. fsync() 応答 | LWBが安全に書けたら完了で、fsync応答を返す。 ※ZILブロックはもっとも速いエリアなのでlatencyが短い。 | LWBに加え、各データが本番ブロックに安全に書けたら完了で、fsync応答を返す。 |
3-4. 本配置 | TXG Flush処理が、実際に置くべき本番ブロックに書き込み処理を行う。METASLABの空きブロックサーチはこの行程で行う。 |
参考≫Orace SolarisのZFSはソースコード公開されていないため、下記はOpenZFS側での推定となります。しかし、logbiasはOpenZFSとOracleZFSが分岐する前からあった機能である為、この処理は概ね同じだと想定できます。