Zoneへマイグレーションするコツ
#contents(): { "base" : 指定されたデザイン名のファイルが存在しません。 }
Zoneの種類と選び方
Solaris 11のZoneは、大きく分けて2種類があります。
- Kernel Zone
- KernelをZone内で独自に持つ、所謂Type II型のハイパバイザ。Solaris 11.2から実装され、CPUなどの機能制限も可能であり、システムリソースを持つ。
- たとえば、Kernel Zone単位で、システムタイマーの設定が可能。
- Native Zone
- KernelをGlobal Zoneで共有する、所謂コンテナ。solaris10ゾーンなどのLegacy Zoneなども含まれる。
- カーネルリソースはグローバルゾーンが持つため、グローバルゾーンでシステム設定を行う。
Kernel Zoneの場合
原則、Kernel Zoneでは、カーネル毎にカーネルリソースを持つため、通常のシステムと同じように、様々なものが動作します。Kernel Zoneの中にはNative Zoneを設置することができるので、Kernelを分けて中にZoneをいれることが出来ます。
Solaris SPARCでは、Kernel ZoneもNative Zoneも、CPU仮想化に対するボトルネックはほぼありません。
従ってカーネルリソースを隔離したいかどうかによってカーネルゾーンを考慮するのが良いでしょう(ただし、この隔離レベルにより、1つのLDOMインスタンス内で動作できるZoneの数がことなります)。
また、Solaris 11.3や、11.2などの古いバージョンのSolarisをSSPCなどのS7/M8プロセサ上で動作させるのにも役立ちます。
Native Zone/Solaris 10 Zoneの場合
Native ZoneはカーネルをGlobal Zoneと共有し、コンテナというプロセスパーティショニングという手法を用い、OSのユーザランドのみを動作させます。
カーネルリソースをGlobal Zoneと共有しているため、Native Zoneでは、システムリソースに関連するものをGlobal Zoneで行い、アプリケーションに関連するもののみを閉鎖的な空間としてnative zoneに置くという利用方法が良いでしょう。
Native Zoneでは、カーネルリソースを共有するため、カーネルリソースに関連する監視は、non Global Zoneに置かずに、Global Zoneに設置します。
Native Zone(コンテナ)内では取得できないカーネルリソースの例
下記のものは本の一例ですが、カーネルが固有で管理するリソースの例です。
Native Zone形式のnon-global zoneからは値の取得できない、値に意味が無いため、監視などは、Global Zoneから行う必要があります。
- CPU
- Dedicated CPUを利用しない限り、CPUの負荷を観測する意味はありません。
- ファイルキャッシュ、メモリ
- メモリはnon-global zone全てを含めて「グローバルゾーンで共有」です。zoneにはメモリのキャップ指定がありますが、最大値であり移譲した値ではありません。また、swapの最大値の設定はありますが、固有で切り出しているわけではありません。
- システムタイマー
- xntpdなどはGlobal Zoneで動かし、non-global zoneでは動作させません。
- ただし、システムの設計の都合で、global zoneがインターネットに出れず、固有のnon-global zoneだけ、インターネットに出れるようにする場合は、zonecfgのlimitprivでsys_timeを設定すると良いでしょう。
- デバイスドライバ、IO類
- IOやシステムリソースは、non Global Zoneで取ることはできませんし、その意味はありません。
- 拡張アカウンティング(account、acctcom、/var/adm/exacct、svc:/system/extended-accounting)
- 拡張アカウンティングは、Global Zoneから「non-global Zoneを含めた全体」を取得することになります。
- 通常、アカウンティングサブシステム(account)は、アカウント毎の情報を得るために用いますが、カーネルリソースから取得するため、コンテナには対応していません。Solaris 11では、コンテナに対応した拡張アカウンティングシステムが搭載されており、Global Zoneに設置する事で、ゾーン毎に設定することも可能です。exacct レコードに、プロセスの場合はゾーン名 EXD PROC ZONENAME のタグを付け、タスクの場合はゾーン名 EXD TASK ZONENAME のタグを付けることができます。
- ファイルシステム情報
- 容量はGlobal Zoneで透過的に見える為、Global Zoneで監視などを行います。
参考≫ Oracle Solaris 11マニュアル>非大域ゾーン内の特権
移設手法
Kernel Zoneへの移設
Kernel Zoneへの移設は、unified Archiveという手法を用い、移設します。
ハードウェアに密着したドライバを除き、原則としてほとんどのものがそのまま、p2v可能です。
Kernel Zoneに独特の考慮点として、システムタイマーがあります。
時刻同期はxntpdなどを用いて、カーネルゾーン内で独自に行う必要があります。
Solaris SPARCのハイパバイザはType Iですが、LDOM(Oracle VM Server for SPARC)のKernel Zoneにてdedicated-cpuをアサインせず、FSSのモードで動かす場合、CPUのコンテキストスイッチがType II型のハイパバイザに近い動きになります。
そのため、x86_64の仮想マシンと若干にたntpのチューニングが必要になるケースがあります。
下記の手法は、実際に時刻がズレるなど、問題が生じたときに考察材料してください。
- iburstを使う
- minpoll、maxpollにて小さめの値を利用する。数字は、2のべき乗秒数です(例えば4に設定すると2の4乗で16秒)
- tinker panicの設定を解除する。0にすることで、大きな時間ずれが起きてもpanicモードに入りません。
- tinker stepの設定、大きな時刻ずれが発生した時に、許容してステップで秒単位で強制的にあわせていく(デフォルトはslewのみ)。
- xntpdの起動時に-gオプションをつけ、初期だけ強制的にあわせてしまう。
- svccfgコマンドで、network/ntpに対して、application/ntp_argsに設定します。