前回、
Solaris ゾーン上の CPU リソースは FSS(Fair Share Scheduler) でスケジューリングされる説明をしましたが、今回は、任意のゾーンに対するスケジューリング
クラスを FSS 以外に変更する方法を紹介します。
ゾーンのスケジューリングクラスをデフォルトの FSS から変更する為には、対象となる
ゾーンが使用する CPU プールの pool.scheduler プロパティーに有効なスケジューリング
クラスを設定します。
それでは早速、RT(Real Time Scheduler)で動作するゾーンを
作成してみましょう。具体的には、zonecfg の
scheduling-class プロパティー
を使ってゾーンのスケジューリングクラスを設定します。
今回は、CPU プールを作成する手間を省く為、ゾーン起動時に自動でプールを
構成する dedicated-cpu プロパティをゾーンに設定しました。
下記の例は、ゾーン名 real-zone に、2 CPU 分の CPU プールを割り当て、
scheduling-class を RT で定義しております。
# zonecfg -z real-zone
real-zone: そのような構成済みゾーンはありません
'create' を使用して、新しいゾーンの構成を開始してください。
zonecfg:real-zone> create
zonecfg:real-zone> set zonepath=/export/zone/real-zone
zonecfg:real-zone> add dedicated-cpu
zonecfg:real-zone:dedicated-cpu> set ncpus=2
zonecfg:real-zone:dedicated-cpu> end
zonecfg:real-zone> set scheduling-class=RT
zonecfg:real-zone> verify
zonecfg:real-zone> commit
zonecfg:real-zone> exit
# zoneadm -z real-zone install
Preparing to install zone .
Creating list of files to copy from the global zone.
...
The file contains a log of the zone installation.
# zoneadm -z real-zone boot
これでゾーンのスケジューリングクラスを RT に設定したゾーンが作成できました。
現在、検証環境では、下記のように FSS で動作する zone01 と、RT で動作する real-zone が稼働しております。
# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
1 zone01 running /export/zone/zone01 native shared
2 real-zone running /export/zone/real-zone native shared
poolstat コマンドで、プールの状態 (real-zone 用にプールが作成されている事) を
確認します。
# poolstat
pset
id pool size used load
1 SUNWtmp_real-zone 2 0.00 0.00
0 pool_default 2 0.00 0.00
次に、各ゾーン内で priocntl -d にて起動されるプロセスのスケジューリングクラス
を確認します。
zone01# priocntl -d
TIME SHARING PROCESSES:
PID TSUPRILIM TSUPRI
6487 0 0
real-zone# priocntl -d
REAL TIME PROCESSES:
PID RTPRI TQNTM TQSIG
6484 0 1000 0
今度は実際に各ゾーンに負荷をかけ、起動するプロセス
のスケジューリングクラスを確認してみます。
今回、zone01 と real-zone それぞれで CPU に負荷を
かける
nspin を実行した結果が下記となります。
zone01 では、PID 6522 と 6523、real-zone では、PID 6524 と 6525 が
起動しております。
# ps -efl -o pid,zone,comm | grep nspinx の結果6523 zone01 ./nspinx6522 zone01 ./nspinx6524 real-zone ./nspinx6525 real-zone ./nspinx
prstat -z の結果より、PRI を確認すると、real-zone で実行しているプロセスの
PRI が 60 より大きいので、RT でスケジューリングされている事が確認できます。
prstat -z の結果
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP6525 root 1344K 540K cpu0 100 - 0:01:53 25% nspinx/16524 root 1344K 672K cpu1 100 - 0:01:53 25% nspinx/16522 root 1344K 672K cpu3 20 0 0:01:57 25% nspinx/16523 root 1344K 540K run 20 0 0:01:57 25% nspinx/1
....
....
ZONEID NPROC SWAP RSS MEMORY TIME CPU ZONE
2 14 17M 20M 0.2% 0:03:59 50% real-zone
1 14 22M 25M 0.3% 0:03:58 50% zone01
0 52 173M 256M 3.2% 0:01:13 0.0% global
Total: 80 processes, 312 lwps, load averages: 4.92, 5.53, 2.86
ご参考で、各スケジューリングクラスに割り当たる PRI 番号は下記コマンドで
確認できます。
# priocntl -l
CONFIGURED CLASSES
==================
SYS (System Class)
TS (Time Sharing)
Configured TS User Priority Range: -60 through 60
FX (Fixed priority)
Configured FX User Priority Range: 0 through 60
IA (Interactive)
Configured IA User Priority Range: -60 through 60
FSS (Fair Share)
Configured FSS User Priority Range: -60 through 60
RT (Real Time)
Maximum Configured RT Priority: 59
(補足情報)
今回、Real Time スケジューラで動作するゾーンを紹介しましたが、Real Time スケジューラで
動作するゾーンでは、FSS 制御下で動作するプロパティ( cpu-share や capped-cpu ) が制御
できませんので設計時に注意が必要です。
(参考資料)
ゾーンのスケジューリングクラス
http://docs.sun.com/app/docs/doc/819-0385/gepst?l=ja&a=view
(参考情報)
過去の 「やっぱり Sun がスキ!」blog 記事一覧はこちらを参照下さい。
http://wikis.sun.com/display/yappri/Home