その他の使い方
Top / サポート情報 / マニュアル / Solaris SPARC Private Cloud / その他の使い方 / Oracle DatabaseのZoneへのインストール

Oracle DatabaseのZoneへのインストール

Solaris 11.4内のNative Zone(通常のSolaris11のZoneや、Branded ZoneのSolaris10を含む)を利用し、この中にOracle Databaseをインストールすることが多々あります。

この場合、IPC(Inter Process Communication:プロセス間通信)などの設定をする必要があります。

下記は、利便性の為に記載されたものです。実際はマニュアルなどを読み、設定してください。

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つのどちらかかとなっています。

  1. 実体のプールでは各top-level vdev上の予約ログ領域(ハードディスクとしては最も速い場所)
  2. slog(Separate log)といって別の高速デバイス(NVMeSSDなど)

しかし仮想マシン内では、slogは存在しないケースが普通のため、1のtop-level vdev上の予約ログ領域と認識しておくのが良いでしょう。ただし、ハードディスクでは「プール上の最も速い領域」となりますが、Enterprise SSDを用いる場合、基本的にどの領域も速度は変わりません。

 

ICSをオプションで用意し、仮想マシンに特別にslogを付ける方法もあります。I/Oの問題がどうしても出る場合は考慮対象になりえるでしょう。


ZFSに対してディスク書き込みをするとき、次のようなフェーズを取ります。

  1. 書き込み要求
    • 各writeに対して即座にデータプールへ書き込むのではなく、まずZILのitx(intent transaction)がスレッドローカルリングに入り、zil_itx_assign()にてZILオブジェクトキューに積まれます。
  2. トレイン化
    • 基本的に、ZILはRAM上に構築されます(≒In-core ZIL)。zil_commit()やzil_sync()が発効されるか、タイマ(5秒など)が切れると、zil_lwb_commit()がitx(intent transaction)群をLWB(log write buffer)にパッキングし、メモリ上のZILトレインが発車します。簡単に言えば、fsyncなどがあれば即時発車、タイマ単位でZILはディスクに書き込みをしようとします。
  3. フラッシュ処理(ディスク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が分岐する前からあった機能である為、この処理は概ね同じだと想定できます。


Private CloudPrivate Cloud
StorageStorage
NetworkNetwork