例題で学ぶ HP-UX Workload Manager White paper 目次 はじめに ............................................................................................................................................. 2 WLM とは?........................................................................................................................................ 2 WLM のインストール............................................................................................................................. 3 はじめての WLM.................................................................................................................................. 3 ワークロード(作業負荷)の準備 .......................................................................................................... 4 WLM の起動 ................................................................................................................................... 5 複数のワークロード グループ ............................................................................................................. 6 ストレッチ ゴール .............................................................................................................................. 7 目標(ゴール)の設定 ............................................................................................................................ 8 実行時間の計測............................................................................................................................... 8 設定ファイルの変更 .......................................................................................................................... 9 目標達成状況の確認 ...................................................................................................................... 11 より厳しい目標 ............................................................................................................................... 11 余剰リソースの分配 ........................................................................................................................ 13 条件による SLO の有効化/無効化 ........................................................................................................ 14 無駄な割り当て .............................................................................................................................. 14 動的なワークロードの検出 ............................................................................................................... 14 SLO の有効化/無効化の確認........................................................................................................... 16 利用率目標の設定 ............................................................................................................................. 17 まとめ............................................................................................................................................... 20 参考情報 .......................................................................................................................................... 21 はじめに 本書では、HP Work Load Manager(以下 WLM)の提供する機能を理解するために、いくつかの例題を使用して学ん でいきます。実際に例題を使った演習を行うことで、設定ファイルの書き方や WLM コマンドの使い方を効率よく習得で きます。 本書は、WLM の持つ全ての機能をカバーするものではありません。また設定ファイルのシンタックス(文法)を細かく説 明するものでもありません。これらの情報は WLM のユーザーガイドに記述されています。 2003 年 6 月にリリースされた WLM A.02.01 以降では、本書で使用する設定ファイルと perl スクリプトが /opt/wlm/examples/userguide 以下に配置されています。従って、ユーザーはこれらのファイルをゼロから作成する 必要はなく、簡単に本書の内容を試すことができます。 Note: WLM A.02.01 より前のバージョンでは本書で使用している設定ファイルはあらかじめ用意されていません。し かし使用するファイルの内容はすべて本書に記載されているので、これらのファイルをエディタなどで作成することによ って一通りの演習は可能となっています。ただし一部のコマンド(wlminfo など)は利用できません。 WLM とは? WLM は、アプリケーションへのリソースの割り振りを自動的に行い、パフォーマンスの最適化を行う HP のソフトウェア 製品です。この割り振りはあらかじめ設定されたサービスレベル目標 (Service Level Objectives: SLO) に基づいて行 われます。 WLM では、ワークロード グループと呼ばれるグループに、ユーザーやアプリケーションをアサインし、それぞれのグル ープには 1 つ以上の SLO を設定します。この SLO の優先度やアプリケーションの負荷状況に応じて、CPU リソースの 割り振りが動的に調整されます。その結果、システムの持つリソースを有効活用すると共に、優先度の高いアプリケー ションが負荷の変動に関わらず常に一定以上のパフォーマンスを維持できるようシステムを構築することができます。 WLM とは? パフォーマンス計測 目標に到達しているか どうかを判断 WLM CPU resource for group A CPU resource for group B 50% 50% 必要ならCPUの 割り当てを変更 したがって WLM が最も威力を発揮するのは複数のアプリケーションが単一のシステム (OS) 上で動作するような場合 です1。WLM を使用することで重要なアプリケーションへの最低限のリソース割り当てを保証しつつ、同時にコンソリデ ーションによるシステム全体の利用率向上を達成できます。 1 WLM は Virtual Partitions(vPars)と組み合わせて使用することで、複数 OS 間で CPU リソースの調整を行うこともできます。 2 WLM のインストール PA-RISC サーバー、Itanium サーバー共に WLM でサポートされます。それぞれの WLM の最新リリースは以下のとお りです。 • B8843CA HP-UX WLM A.02.01 • B8843CA HP-UX WLM A.02.01.01 HP-UX 11.00、HP-UX 11i v.1.0 (11.11) 向け HP-UX 11i v.2.0 (11.23) 向け 上記の WLM が収録されているメディア (CD、DVD)、あるいは depot を用意して swinstall コマンドを使ってインストー ルを行ってください。ただし、次の OE(オペレーティング環境)にはあらかじめ WLM が含まれているため、別途インスト ールする必要はありません。 • HP-UX 11i v.1.0 (11.11) Mission Critical Operating Environment • HP-UX 11i v.2.0 (11.23) Mission Critical Operating Environment なお、WLM をインストールすると次の製品も自動的にインストールされます。 • B3835CA PRM (Process Resource Manager) • T1302AA WLM Toolkit WLM 自体のインストールにはシステムの再起動は必要ありませんが、同時に PRM をインストールした場合にはシス テムの再起動が必要となります。 はじめての WLM さ っ そ く サ ン プ ル の 設 定 フ ァ イ ル を 使 っ て 、 WLM を 動 か し て み ま し ょ う 。 最 初 の 設 定 フ ァ イ ル (/opt/wlm/examples/userguide/initial.wlm) は次のようなものです。 # # # # # # # # # # # # # # # # # # Name: initial.wlm Version information: $Revision: 1.5 $ Dependencies: This example was designed to run with HP-UX WLM version A.01.02 or later. It uses the cpushares keyword introduced in A.01.02 and is, consequently, incompatible with earlier versions of HP-UX WLM. Requirements: To ensure WLM places the perl scripts below in their assigned workload groups, add "/opt/perl/bin/perl" (without the quotes) to the file /opt/prm/shells. prm { groups = g2 : 2; # Define a workload group ←c # Assign loop.pl to that workload group apps = g2 : /opt/perl/bin/perl loop.pl; # To ensure WLM places the loop.pl script in its # assigned workload group, add "/opt/perl/bin/perl" # (without the quotes) to the file /opt/prm/shells gmincpu = g2 : 5; # Ensure the workload group gets at least 5 CPU # shares, even if its SLO is not active gmaxcpu = g2 : 30; # Ensure the workload group gets no more than 30 # CPU shares } slo test { # Define an SLO for the workload group ←d 3 pri = 1; # Assign the SLO a priority of 1 (top priority) # Ensure the SLO requests 15 CPU shares cpushares = 15 total; # An SLO’s request may not be met--depending on # its priority and the amount of available CPU. # Of course in this configuration with only one # SLO, this SLO will receive its requested CPU # shares. entity = PRM group g2; # Associate the SLO with the workload # group defined for it ←e } このファイルでは g2 というワークロード グループのみを定義し、グループ ID として 2 が与えられています(①参照)。 定義したそれぞれのグループに対して、少なくとも 1 つの SLO を設定する必要があります。これには slo 構文を使用し ます。この設定ファイルでは test という SLO がグループ g2 に対して定義されています(②および③参照)。 loop.pl グループ g2 CPU範囲 5~30 SLO test 優先度1(高) CPU要求 15 initial.wlm の概念図 次のコマンドを入力して、このファイルの文法をチェックすることができます。 # /opt/wlm/bin/wlmd –c initial.wlm 文法上の問題がない場合は、コマンド実行後、何も出力されません。 ワークロード(作業負荷)の準備 これで設定ファイルの準備は整いました。次に必要となるのはワークロード(作業負荷)です。ここではワークロードとし て loop.pl という名前の perl スクリプトを使用します。このスクリプトの最初の 1 行は次のようになっています。 #!/opt/perl/bin/perl –w もし perl が異なる場所にインストールされている場合には、必要に応じてこの行を修正してください。–w オプションを指 定することにより、多くの有益な警告が出力されます。 この perl スクリプトが WLM によって、あらかじめ定義されたワークロード グループに割り当てられることを確実にする ために、以下の行を/opt/prm/shells に加えてください(perl の場所が異なる場合は、対応する場所を追加)。 /opt/perl/bin/perl もし perl がインストールされていない場合は、同様の処理を行うシェル スクリプトを作成することも可能です。その場合 は、使用するシェルの絶対パスを/etc/prm/shells に追加するのを忘れないようにしてください。 4 以下に示すように、loop.pl スクリプトは無限ループです。内側のループの実行に要した時間を繰り返し表示します。 #!/opt/perl/bin/perl -w # # Name: # loop.pl # # Version information: # # $Revision: 1.3 $ $maxcount = 3000000; # Here is an infinite loop while (1) { $count = 1; $start = time(); while ($count <= $maxcount) { $count++; } $end = time(); printf (“loop.pl: Elapsed time=%.2f seconds\n”, $end-$start); } WLMの起動 以上で設定ファイルとワークロードの用意ができました。今からワークロードによる負荷をかけて、WLM を動かしてみ ましょう。ここで使用する perl スクリプトは多くの出力を生成するので、別のウィンドウで開始したほうがよいでしょう。次 のコマンドを実行してスクリプトを開始します。 # /opt/wlm/examples/userguide/loop.pl 開始したスクリプトが、どのワークロード グループとして走っているかを確認するには、次のコマンドを実行します。 # ps –P この時点では、スクリプトはどのワークロード グループにも属していません。従って PRMID 欄には何も値が入っていま せん。では WLM を起動してみましょう。root でログインし、次の wlmd コマンドを実行します。-l オプションは、ログ統 計情報を/var/opt/wlm/wlmdstats に出力します。 # /opt/wlm/bin/wlmd –a initial.wlm –l slo これにより wlmd プロセスがスタートされ、WLM のインターバルごとに、それぞれの SLO の情報が wlmdstats ファイル に書き出されます。デフォルトのインターバルは 60 秒です。wlmdstats ファイルの中を見て、どの SLO がアクティブに なっているか、どれくらいの CPU が割り当てられているかを確認してください。 # tail –f /var/opt/wlm/wlmdstats 少なくとも 60 秒待ってから、ps–P コマンドを実行してみてください。今度は loop.pl がワークロード グループ g2 に 属しているのを見ることができます。 さらに WLM が動作しているので、スクリプトの出力が遅くなっているはずです。以前はスクリプトが必要なだけの CPU を使うことができましたが、WLM が有効となったことで、スクリプトへの CPU の割り当てが制限され、ループが終了す るまでにより時間がかかるようになっているためです。 次へ進む前に、ps コマンドで loop.pl の PID を取得し、スクリプトを終了させます。 # kill PID_of_loop.pl 5 複数のワークロード グループ 次は、設定ファイルにグループを 1 つ追加してみましょう。loop.pl のコピーである loop2.pl と loop3.pl を用 意し、それぞれをグループ g2 と g3 に割り当てることにします(④および⑤)。loop.pl は設定ファイルから削除しま す。新しい設定ファイルは次のようになります (/opt/wlm/examples/userguide/multiple_groups.wlm)。 # # # # # # # # # # # # # # # # # # # # Name: multiple_groups.wlm Version information: $Revision: 1.5 $ This file is based on the file initial.wlm. Comments below indicate changes in this file from the initial.wlm file. Dependencies: This example was designed to run with HP-UX WLM version A.01.02 or later. It uses the cpushares keyword introduced in A.01.02 and is, consequently, incompatible with earlier versions of HP-UX WLM. Requirements: To ensure WLM places the perl scripts below in their assigned workload groups, add "/opt/perl/bin/perl" (without the quotes) to the file /opt/prm/shells. prm { groups = g2 : 2, g3 : 3; # Added group g3 # Changed loop.pl to loop2.pl # Placed loop3.pl in the new group apps = g2 : /opt/perl/bin/perl loop2.pl, ←f g3 : /opt/perl/bin/perl loop3.pl; ←g # Added gmincpu/gmaxcpu values for group g3 gmincpu = g2 : 5, g3 : 5; gmaxcpu = g2 : 30, g3 : 60; } slo test2 { # Changed name of SLO pri = 1; cpushares = 15 total; entity = PRM group g2; } slo test3 { # Defined an SLO for the new workload group pri = 1; cpushares = 20 total; entity = PRM group g3; } 6 multiple_groups.wlm の概念図 loop2.pl loop3.pl グループ g2 CPU範囲 5~30 グループ g3 CPU範囲 5~60 SLO test2 優先度1(高) CPU要求 15 SLO test3 優先度1(高) CPU要求 20 WLM を起動する前に、スクリプト loop2.pl と loop3.pl を開始します。 # /opt/wlm/examples/userguide/loop2.pl # /opt/wlm/examples/userguide/loop3.pl ここで、それぞれのスクリプトが内側のループの実行に要している時間がほぼ同じである点を確認してください。それで は、次のコマンドを入力して WLM を起動してみましょう。 # /opt/wlm/bin/wlmd –a multiple_groups.wlm –l slo WLM が別の設定ファイルを使って既に動いている場合でも、再起動の必要はありません。上記のコマンドを入力する ことで、WLM は古い設定に代わって新しい設定ファイルの内容を自動的に適用します。WLM のインターバル時間経 過後に、次のコマンドを実行して各 SLO の状況を確認してみてください。 # wlminfo slo Fri May SLO Name test2 test3 9 16:45:53 2003 Group g2 g3 Pri 1 1 Req Shares 15 15 20 20 State Concern PASS PASS test2 SLO には 15%、test3 SLO には 20%の CPU シェアが割り当てられている様子を見ることができます。 ストレッチ ゴール さきほどの例ではワークロード グループ g3 のほうがより多くの CPU を獲得し、その結果ループの完了にかかる時間 も短くなっていました。新しい SLO を追加してこの状況を変えてみましょう。グループ g2 に優先度の低い SLO を追加し ます。この SLO はストレッチ ゴールと呼ばれます。WLM は、高い優先度の SLO をすべて満たした後にリソースの余裕 がある場合、それより優先度の低い SLO を順番に満足させようと試みます。 slo test2_stretch { pri = 2; cpushares = 30 total; entity = PRM group g2; } 上記の SLO を設定ファイルの最後に追加してください。設定ファイルは/opt/wlm/examples/userguide/stretch.wlm のようになります。この設定ファイルを使って WLM を再起動します。 # /opt/wlm/bin/wlmd –a stretch.wlm –l slo 7 WLM は、全ての優先度 1 の SLO を満足させた後に、まだ CPU シェアに余裕がある場合、グループ g2 に 30%の CPU シェアを割り当てようとします。この CPU の追加割り当てによって、今度は loop2.pl のほうが loop3.pl より 速く走るようになります。 stretch.wlm の概念図 loop2.pl loop3.pl グループ g2 CPU範囲 5~30 グループ g3 CPU範囲 5~60 SLO test2 優先度 1 (高) CPU要求 15 SLO test3 優先度 1 (高) CPU要求 20 SLO test2_stretch 優先度 2 (低) CPU要求 30 目標(ゴール)の設定 これまでの例では、静的な CPU 割り当てを行ってきました。次のステップでは、WLM の最大の特徴である動的な割り 当て調整に挑戦してみましょう。この方法では、WLM が割り当てることの出来る CPU の範囲を設定し、何らかの測定 基準に基づいた目標(ゴール)を指定します。WLM は与えられた範囲内でダイナミックにリソースを調整し、できるだけ その目標を達成しようと試みます。 実行時間の計測 では具体的な目標値を設定するために、あらかじめ次のような設定ファイルを使って WLM を動かして、loop2.pl と loop3.pl のループ実行に現在どれくらいの時間を要しているのかを測ってみることにします。 # # # # # # # # # # # # # # # # # # # # # # # Name: baseline.wlm Version information: $Revision: 1.5 $ This file is based on the file multiple_groups.wlm. Comments below indicate either changes in this file from the multiple_groups.wlm file or new syntax elements that will be uncommented in a later configuration. Dependencies: This example was designed to run with HP-UX WLM version A.01.02 or later. It uses the cpushares keyword introduced in A.01.02 and is, consequently, incompatible with earlier versions of HP-UX WLM. Requirements: To ensure WLM places the perl scripts below in their assigned workload groups, add "/opt/perl/bin/perl" (without the quotes) to the file /opt/prm/shells. prm { groups = g2 : 2, g3 : 3; apps = g2 : /opt/perl/bin/perl loop2.pl, 8 g3 : /opt/perl/bin/perl loop3.pl; gmincpu = g2 : 5, g3 : 5; gmaxcpu = g2 : 30, g3 : 60; } slo test2 { pri = 1; cpushares = 15 total; ←c entity = PRM group g2; } slo test3 { pri = 1; mincpu = 20; # Replaced cpushares statement with mincpu/maxcpu ←d maxcpu = 50; # statements because cpushares keyword cannot be used # with the goal keyword, which is introduced below and # will be uncommented in metric_goal.wlm. # # (mincpu and maxcpu statements only serve to bound requests for CPU # shares--they do not make CPU shares requests. When an SLO has a mincpu # and maxcpu, but no goal or cpushares statement, WLM simply gives the # SLO’s associated workload group the number of CPU shares specified in # the mincpu statement.) entity = PRM group g3; # The remaining elements will be uncommented in a later configuration. # goal = metric count_time3 < 20.0; ←e } # tune count_time3 { # coll_argv = wlmrcvdc; # } ←f 目標に基づいた SLO をセットアップするためにいくつかの行が追加されていますが、今はコメントアウトされています。 これらの行の詳細についてはこれから説明していきます。それではスクリプトを開始し(もし既に開始されていなけれ ば)、WLM の設定をアクティブにしましょう。 # /opt/wlm/examples/userguide/loop2.pl # /opt/wlm/examples/userguide/loop3.pl # /opt/wlm/bin/wlmd –a baseline.wlm –l slo この設定では、以下のようなスクリプト出力を得ました。 loop2.pl: Elapsed time = 22.00 seconds loop3.pl: Elapsed time = 17.00 seconds また wlminfo slo で確認すると、loop2.pl は 15%、loop3.pl は 20%の CPU シェアを獲得していることがわ かります。これらの数字は test2 SLO の cpushares の値(①)と test3 SLO の mincpu の値(②)です。設定ファイル 中で、test3 SLO には goal や cpushares を指定していませんが、この場合 WLM は、SLO の優先度と利用可能な CPU を考慮して、対応するワークロード グループの mincpu の値を割り当てます。 両スクリプトの出力から、現在の CPU パワーにおけるだいたいの経過時間 (Elapsed time) を見積もることができます。 loop3.pl の実行にかかった時間を書き留めておいてください。 いったん WLM を停止し、loop3.pl を終了させます。 # /opt/wlm/bin/wlmd –k # kill PID_of_loop3.pl 設定ファイルの変更 それでは目標を設定するために WLM の設定ファイルを変更しましょう。先ほどの設定ファイル baseline.wlm からコメ ントアウトを外したものが/opt/wlm/examples/userguide/metric_goal.wlm です。この metric_goal.wlm ファイル内 の SLO test3 には、あらかじめ測定値 count_time3 を 20 以下に維持するという目標が記述されていますが(③)、 さきほどの見積もりから loop3.pl の実行にはだいたい 17 秒かかるという値を得たので、ここではこの値より小さい 10 秒を目標値として設定することにします(ご使用の環境に応じて適切な値を選択してください。先ほど測定した loop3.pl の値より小さい数字を指定します)。 9 SLO はこの目標を達成するために、mincpu と maxcpu の値に基づいて 20 から 50 の範囲の CPU シェアを使用す ることができます。測定値 count_time3 は、ワークロードが内側ループに費やす時間です。これまで loop3.pl を 使っていたワークロードは、後で示す loop3_wlmsend.pl というスクリプトに置き換えられます。 metric_goal.wlm の概念図 loop2.pl loop3_wlmsend.pl グループ g2 CPU範囲 5~30 グループ g3 CPU範囲 5~60 SLO test2 優先度 1 (高) CPU要求 15 SLO test3 優先度 1 (高) 目標 count_time3 < 10 CPU要求範囲 20~50 以前コメントアウトされていた行には、tune という新しい構文が含まれています(④)。これは、測定値を取り込む wlmrcvdc というコマンドをスタートさせます。この tune 構文には count_time3 という名前がつけられているので、 取り込まれた値は count_time3 へ代入され、goal 構文の中で使用されます。この値は、以下の perl スクリプトが 示すように wlmsend コマンドにより wlmrcvdc へと送られます。 wlmsend コマンドにより送られる count_time3 という値は、以前の loop3.pl スクリプトの内側ループの実行に 費 や さ れ て い た 時 間 で す 。 loop3.pl ス ク リ プ ト に 、 wlmsend コ マ ン ド を 追 加 し た も の が 次 に 示 す loop3_wlmsend.pl スクリプトです (/opt/wlm/examples/userguide/loop3_wlmsend.pl)。 #!/opt/perl/bin/perl -w # # Name: # loop3_wlmsend.pl # # Version information: # # $Revision: 1.4 $ $maxcount = 3000000; # Here is an infinite loop while (1) { $count = 1; $start = time(); while ($count <= $maxcount) { $count++; } $end = time(); $time_spent = $end - $start; printf (“loop3_wlmsend.pl: Elapsed time=%.2f seconds \n”, $time_spent); # Here is the wlmsend line: system “/opt/wlm/bin/wlmsend count_time3 $time_spent”; ←g # The wlmsend command sets the value of count_time3 to $time_spent # and informs WLM of this value by means of the tune structure # named for the count_time3 metric, starting in the file # metric_goal.wlm. } 10 スクリプト中の system キーワード(⑤)は、次の UNIX コマンドを実行します。 /opt/wlm/bin/wlmsend count_time3 $time_spent 実際にループの実行に要した時間$time_spent が count_time3 へと代入され、WLM へと送られます。今回、 loop2.pl は測定値を使用しないので、wlmsend コマンドは使用しません。 目標達成状況の確認 では WLM を起動し、スクリプトを走らせてみましょう。 # /opt/wlm/bin/wlmd –a metric_goal.wlm –l slo # /opt/wlm/examples/userguide/loop2.pl # /opt/wlm/examples/userguide/loop3_wlmsend.pl Note: ここでスクリプトより先に WLM を起動しているのは、loop3_wlmsend.pl 内から wlmsend を呼ぶ前に、 WLM 側でデータを受ける準備を整えておく必要があるからです。もし WLM が動作していないときに、wlmsend を実 行すると、以下のようなメッセージを受け取ります。 wlmsend: Wait time expired: Rendezvous point does not exist 上記の設定でしばらく perl スクリプトを走らせた後、loop3_wlmsend.pl のループ時間は 9 秒に落ち着きました。一方 の loop2.pl は 22 秒から変化はありません。CPU の割り当てとしては loop2.pl には 15%、loop3_wlmsend.pl には 37%の CPU シェアが割り振られました。 loop3_wlmsend.pl が属しているグループ g3 は、maxcpu の値である 50 を使用するまでには至っていません。これ は、ここで設定した目標が 37%のシェアで既に達成されているからです。ループ時間が 9 秒となったことで、目標が達 成され、wlmsend slo -v を実行すると以下のような出力を見ることができます。State 欄を見ると test3 は PASS となっており、この SLO が現在達成されていることが確認できます。また-v オプションを付けることで、設定され ている目標値 (Goal) と現在の測定値 (Metric) も併せて確認することができます。 # wlminfo slo -v Mon May 12 16:01:22 2003 SLO Name Group Pri Metric Goal Req Shares State Concern test2 g2 1 - 15 15 PASS test3 g3 1 9 10 37 37 PASS なお、使用している環境によっては、このような結果が得られないかもしれません。その場合はゴールの値を調整して、 再度 WLM を実行してみてください。 より厳しい目標 もし、現在の設定で目標が達成できないようならどうすればよいのでしょう?この場合、ユーザーは以下のどちらかを 選択することになります。 • ワークロード グループの gmaxcpu 値、あるいは SLO の maxcpu 値を大きくする。 • goal 構文の count_time3 の値を大きくする(より簡単な目標にする) しかし、ここでは目標を簡単にはせずにより厳しくした場合、WLM はどのような振る舞いをするのかを見てみることにし ましょう。 この例では設定ファイルの目標値、 goal = metric count_time3 < 10.0; を、以下のように書き換えてみます。 goal = metric count_time3 < 5; 11 WLM は、インターバル時間毎にワークロードのパフォーマンス データを収集し、そのデータに基づいて CPU の割り当 てを調整します。この間隔はデフォルトでは 60 秒です。従って、目標を達成するためには少し時間がかかることもあり ます。もし、WLM のデータ収集と CPU の調整をより短い間隔で行いたい場合には、wlm_interval により小さい値 を指定してください。この値は設定ファイル中のグローバル tune 構文(tune の後に何も名前を記述しない)内で指定さ れます。 harder_goal.wlm の概念図 loop2.pl loop3_wlmsend.pl グループ g2 CPU範囲 5~30 グループ g3 CPU範囲 5~60 SLO test2 優先度 1 (高) CPU要求 15 SLO test3 優先度 1 (高) 目標 count_time3 < 5 CPU要求範囲 20~50 全体の環境設定 wlm_interval 30 sec 目標を厳しくすることに加えて、次の tune 構文を追加することにより WLM インターバルを短くします。 tune { wlm_interval = 30; } こうして出来た新しい設定ファイルは/opt/wlm/examples/userguide/harder_goal.wlm となります。WLM を再起動 して新しい設定を反映させます。 # /opt/wlm/bin/wlmd –a harder_goal.wlm –l slo これで、WLM は 30 秒ごとにデータを収集し、CPU の割り当てを変更します。スクリプトの出力は次のようになりました。 loop2.pl: Elapsed time = 22.00 seconds loop3_wlmsend.pl: Elapsed time = 7.00 seconds 今度は目標は達成されていません。これは、割り当てることのできる最大のリソース(50%)を使っても目標(5 秒以下) を達成することができなかったためです。この結果は wlminfo コマンドでも確認できます。Goal の 5 に対して Metric が 7 となっており、State 欄は FAIL と表示されています。また今回のようにリソースを一杯まで使っている 場合には Concern 欄に Max と表示されます。 # wlminfo slo –v Mon May 12 16:49:03 2003 SLO Name Group Pri Metric Goal Req Shares State Concern test2 g2 1 - 15 15 PASS test3 g3 1 7 5 50 50 FAIL Max 12 余剰リソースの分配 CPU の割り当ては loop2.pl と loop3_wlmsend.pl それぞれに 15%、50%となっています。これはシステムで利用可能 なシェアがまだ 35%残っていることを意味しますが、デフォルトではこれらの余剰シェアは全てワークロード グループ OTHERS に割り当てられます。この様子はコマンド wlminfo group を実行することで確認することができます。 # wlminfo group Mon May 12 17:13:33 2003 Workload Group PRMID CPU Shares CPU Util Mem Shares State OTHERS 1 35.00 0.00 0.00 ON g2 2 15.00 14.96 0.00 ON g3 3 50.00 49.80 0.00 ON tune 構文に新しいキーワード distribute_excess を追加することで、この余剰リソースを他のワークロード グル ープへも配分することができるようになります。値として 1 を指定してください。 tune { wlm_interval = 30; distributed_excess = 1; } distribute_excess.wlm の概念図 loop2.pl loop3_wlmsend.pl グループ g2 CPU範囲 5~30 グループ g3 CPU範囲 5~60 SLO test2 優先度 1 (高) CPU要求 15 SLO test3 優先度 1 (高) 目標 count_time3 < 5 CPU要求範囲 20~50 全体の環境設定 wlm_interval 30 sec distribute_excess 1 (enable) 結果、設定ファイルは/opt/wlm/examples/userguide/distribute_excess.wlm のようになります。新しい設定を有効に してみましょう。 # /opt/wlm/bin/wlmd –a distribute_excess.wlm –l slo 何回かインターバルを経過した後、スクリプトの出力は次のようになります。 loop2.pl: Elapsed time = 11.00 seconds loop3_wlmsend.pl: Elapsed time = 5.00 seconds 前の設定と比較して、ループ実行時間が短くなっているのがわかります。これは loop2.pl と loop3_wlmsend.pl の CPU シェアがそれぞれ 30%、60%へと増えたためです。両ワークロードは期待通りに余剰 CPU を利用することができ ています。 スクリプトを終了させてください。 # kill PID_of_loop2.pl # kill PID_of_loop3_wlmsend.pl 13 条件による SLO の有効化/無効化 SLO は、時間や年月日、システム イベント、アプリケーションのメトリックに依存して有効化/無効化を切り替えることが できます。条件によって SLO を有効化するには、tune 構文で condition キーワードを使用します。 無駄な割り当て これまでは 2 つの perl スクリプトを同時に実行してきましたが、今回は 1 度に一つだけ動かすことにします。 distribute_excess.wlm と loop2.pl を使って WLM を開始してください。 # /opt/wlm/bin/wlmd –a distribute_excess.wlm –l slo # /opt/wlm/examples/userguide/loop2.pl wlminfo group コマンドで CPU シェアの割り当て状況を見てみると、ワークロード グループ g2 は test2 SLO を達 成するために 30 CPU をもらっていることがわかります。一方、test3 SLO はグループ g3 で動作しているアプリケーシ ョンが一つもないのにも関わらず 60 シェアを獲得しています。 # wlminfo group Mon May 12 17:59:51 2003 Workload Group PRMID CPU Shares CPU Util Mem Shares State OTHERS 1 10.00 0.00 0.00 ON g2 2 30.00 29.88 0.00 ON g3 3 60.00 0.00 0.00 ON こ の ケ ー ス で は 、 test3 SLO は 有 効 で あ る 必 要 は あ り ま せ ん 。 同 様 に 、 も し loop2.pl を 停 止 し 、 loop3_wlmsend.pl を開始した場合も、test2 SLO が 30 CPU シェアを獲得してしまうのを見ることができます(グル ープ g2 にアクティブなアプリケーションがないのにも関わらず)。WLM の condition キーワードはこの問題を解決 します。 動的なワークロードの検出 まず、WLM にアプリケーションの状態を報告する小さなスクリプトを書きます。以下のスクリプト reporter.pl は、 loop2.pl と loop3.pl ス ク リ プ ト が 走 っ て い る か ど う か を 1 分 ご と に WLM に 報 告 し ま す ( こ こ で loop3_wlmsend.pl に 代 わ っ て 再 び loop3.pl を 使 用 し ま す ) 。 reporter.pl は loop2_active と loop3_active という 2 つのメトリック(測定値)を使用します(①および②を参照)。もし該当するスクリプトがアクティ ブならば、メトリックには 1 がセットされます。 #!/opt/perl/bin/perl -w # # Name: # reporter.pl # # Version information: # # $Revision: 1.4 $ # This script uses the ps command to see if the scripts loop2.pl and # loop3.pl are running. If a script is running, the wlmsend command # sends a value of 1 for the script; otherwise, it sends a value of 0. # Here is an infinite loop while (1) { $loop2_running = `env UNIX95= ps -C loop2.pl | wc -l`; --$loop2_running; # Line count is one more due to header $loop3_running = `env UNIX95= ps -C loop3.pl | wc -l`; --$loop3_running; # Line count is one more due to header # # # # # The following wlmsend commands set the values for the metrics loop2_active and loop3_active to $loop2_running and $loop3_running respectively. WLM picks up these values because of the tune structures named for the metrics in the file condition.wlm. 14 system “/opt/wlm/bin/wlmsend loop2_active $loop2_running”; system “/opt/wlm/bin/wlmsend loop3_active $loop3_running”; sleep(60); # Wait for 60 seconds ←c ←d } WLM が loop2_active、loop3_active メトリックを使用できるようにするために distribute_excess.wlm ファイルを変更す る必要があります。そのメトリックの値が 0 でないときだけそれぞれの SLO をアクティブとするような条件を設定ファイ ルに追加します(③および④)。さらに、グローバル tune 構文と count_time3 tune 構文を削除し、loop3_wlmsend.pl を loop3.pl へと戻します。test3 SLO の goal 構文は cpushares へと変更します(⑤)。こうして出来たファイルが以下に示 す/opt/wlm/examples/userguide/condition.wlm です。 # # # # # # # # # # # # # # # # # # # # # Name: condition.wlm Version information: $Revision: 1.6 $ This file is based on the file distribute_excess.wlm. Comments below either indicate changes in this file from the distribute_excess.wlm file or explain elements of this file. Dependencies: This example was designed to run with HP-UX WLM version A.01.02 or later. It uses the cpushares keyword introduced in A.01.02 and is, consequently, incompatible with earlier versions of HP-UX WLM. Requirements: To ensure WLM places the perl scripts below in their assigned workload groups, add "/opt/perl/bin/perl" (without the quotes) to the file /opt/prm/shells. # Removed tune structure that changed WLM interval and set # distribute_excess prm { groups = g2 g3 apps = g2 : g3 : : 2, : 3; /opt/perl/bin/perl loop2.pl, /opt/perl/bin/perl loop3.pl; # Changed loop3_wlmsend.pl # to loop3.pl gmincpu = g2 : 5, g3 : 5; gmaxcpu = g2 : 30, g3 : 60; } slo test2 { pri = 1; cpushares = 15 total; entity = PRM group g2; condition = metric loop2_active; # Added condition statement so ←e } # that SLO is active only when the # metric loop2_active is nonzero, # which indicates the loop2.pl # workload is running slo test3 { # Removed the mincpu, maxcpu, and goal statements pri = 1; cpushares = 50 total; # Added a cpushares statement ←g entity = PRM group g3; condition = metric loop3_active; # Added condition statement so ←f } # that SLO is active only when the # metric loop3_active is nonzero, # which indicates the loop3.pl # workload is running # Added tune structure to get value for loop2_active metric; # value for metric is set by using wlmsend in reporter.pl script tune loop2_active { coll_argv = wlmrcvdc; } # Added tune structure to get value for loop3_active metric; 15 # value for metric is set by using wlmsend in reporter.pl script tune loop3_active { coll_argv = wlmrcvdc; } # Removed count_time3 tune structure distribute_excess.wlm の概念図 loop2.pl loop3.pl グループ g2 CPU範囲 5~30 グループ g3 CPU範囲 5~60 SLO test2 優先度 1 (高) CPU要求 15 条件 loop2_active = 1 SLO test3 優先度 1 (高) CPU要求 50 条件 loop3_active = 1 SLOの有効化/無効化の確認 では、期待通りに WLM が動作するか確認してみましょう。もし loop3_wlmsend.pl がまだ動作しているなら、スクリプト を停止します。 # kill PID_of_loop3_wlmsend.pl そして、WLM と reporter.pl、loop2.pl を開始します。 # /opt/wlm/bin/wlmd –a condition.wlm –l slo # /opt/wlm/examples/userguide/reporter.pl # /opt/wlm/examples/userguide/loop2.pl Note: ここで最初に WLM を起動しているのは、reporter.pl 内から wlmsend を呼ぶ前に、WLM 側でデータを受 ける準備を整えておく必要があるからです。もし WLM が動作していないときに、wlmsend を実行すると、以下のよう なメッセージを受け取ります。 wlmsend: Wait time expired: Rendezvous point does not exist WLM インターバル経過後に、wlminfo slo コマンドで確認すると、test3 SLO が無効 (State=OFF) となっており、 gmincpu で指定したシェア(この場合は 5)だけ使っていることを見ることができます。一方の test2 SLO は 15%のシ ェアを獲得しています。ここで、loop2.pl を停止し loop3.pl を開始した場合は、今度は test2 SLO が無効となり、 gmincpu である 5 シェアだけが割り当てられます。そして test3 SLO は有効となり、50%のシェアを使用できるように なります。 16 次の例は test2 SLO が有効、test3 SLO が無効となっている場合です。 # wlminfo slo Wed May 14 11:46:45 2003 SLO Name test2 test3 Group g2 g3 Pri 1 1 Req Shares 15 15 5 State Concern PASS OFF Disabled スクリプトを停止します。 # kill PID_of_loop3.pl # kill PID_of_reporter.pl 利用率目標の設定 さて、本書で最後に学習するのは、利用率に基づいた目標です。この利用率という値は、次の式で算出されます。 利用率 = (実際に使用しているリソース)/(そのグループに割り当てられているリソース) 割り当てられている量のうちほとんどを使ってない場合は、利用率はほぼ 0%となり、割り当てられたリソースをすべて 使い切っている場合には 100%となります。この利用率目標は、もっとリソースが必要なときに自動的に追加のリソー スを割り当てたいときや、逆にあまり負荷が高くないときに余っているリソースを開放したいときなどに有効な方法です。 この方法は、先ほど学習した目標(ゴール)を使う方法とは異なり、外部から入力される値(メトリック)を必要とせずに動 的なリソース調整ができる点が特徴です。 次の例では、これまで使用してきた loop3.pl を loop3_usage_goal.pl へと変更します。まず$maxcount の値を 1000000 へと減らし(①)、system コマンドの行を削除します。次に sleep 関数の呼び出しを追加し(②)、このスクリプ トが CPU をめいっぱい使わないように「間」を入れます。この変更によってスクリプトが所属するグループは、以前ほど には CPU を必要としなくなります。利用率目標を使うことによって、このような必要とされていない CPU リソースの割り 当てを自動的に解除し、他のグループから利用可能とすることができます。 変更後の/opt/wlm/examples/userguide/loop3_usage_goal.pl は次のようになります。 #!/opt/perl/bin/perl –w # # Name: # loop3_usage_goal.pl # # Version information: # # $Revision: 1.3 $ $maxcount = 1000000; ←c # Here is an infinite loop while (1) { $count = 1; sleep(7); # Sleep for 7 seconds ←d $start = time(); while ($count <= $maxcount) { $count++; } $end = time(); $time_spent = $end - $start; printf “loop3_usage_goal.pl: Elapsed time=%.2f seconds \n”, $time_spent; } 17 この loop3_usage_goal.pl と一緒に使用する WLM の設定ファイル /opt/wlm/examples/userguide/usage_goal.wlm は以下のようになります。今回の例では loop2.pl は走らせないの で、グループ g2 に関しては特に変更はありません。一方、test3 SLO には利用率目標が設定されています(③)。目標 は CPU の利用率を 60%から 90%の間に保つことです。また test3 SLO の mincpu は 5 に減らしています(④)。 # # # # # # # # # # # # # # # # # # # # # Name: usage_goal.wlm Version information: $Revision: 1.5 $ This file is based on the file condition.wlm. Comments below indicate changes in this file from the condition.wlm file. Dependencies: This example was designed to run with HP-UX WLM version A.01.02 or later. It uses the cpushares keyword introduced in A.01.02 and is, consequently, incompatible with earlier versions of HP-UX WLM. Requirements: To ensure WLM places the perl scripts below in their assigned workload groups, add "/opt/perl/bin/perl" (without the quotes) to the file /opt/prm/shells. prm { groups = g2 : 2, g3 : 3; apps = g2 : /opt/perl/bin/perl loop2.pl, g3 : /opt/perl/bin/perl loop3_usage_goal.pl; gmincpu = g2 : 5, g3 : 5; gmaxcpu = g2 : 30, g3 : 60; } slo test2 { pri = 1; cpushares = 15 total; entity = PRM group g2; # Removed condition statement } slo test3 { pri = 1; mincpu = 5; # Changed mincpu from 20 to 5 ←f maxcpu = 50; entity = PRM group g3; goal = usage _CPU 60 90; # Changed from a metric goal to a } # usage goal # # Removed condition statement ←e # Removed the tune structures 18 usage_goal.wlm の概念図 loop2.pl loop3_usage_goal.pl グループ g2 CPU範囲 5~30 グループ g3 CPU範囲 5~60 SLO test2 優先度 1 (高) CPU要求 15 SLO test3 優先度 1 (高) 利用率目標 60~90% CPU要求範囲 5~50 それでは loop3_usage_goal.pl スクリプトを走らせ、WLM を動かしてみましょう。 # /opt/wlm/examples/userguide/loop3_usage_goal.pl # /opt/wlm/bin/wlmd –a usage_goal.wlm –l slo WLM 開始直後は約 28%のシェアが test3 SLO に割り当てられます。その後、何回か WLM インターバルを経過して、 割り当ては約 11%へと落ち着きました。そのうちの 7%が実際に使われているので利用率はだいたい 70%となり、あら かじめ設定した利用率 60~90%の目標を満足しています。 # wlminfo group Mon May 12 17:57:40 2003 Workload Group OTHERS g2 g3 PRMID 1 2 3 CPU Shares 74.00 15.00 11.00 CPU Util 0.00 0.00 7.74 Mem Shares 0.00 0.00 0.00 State ON ON ON 利用率の数字を確認するには wlminfo slo –v コマンドを使用します。Metric 欄にその SLO の利用率が表示されます。 # wlminfo slo -v Mon May 12 18:01:25 2003 SLO Name test2 test3 Group g2 g3 Pri Metric 1 1 72.8 Goal 90 Req Shares 15 15 10.7 11 State Concern PASS PASS 使用しているシステムの環境によっては、このような結果が得られないかもしれません。その場合は、 loop3_usage_goal.pl 中の sleep 関数への引き数を変更し負荷を調整してください。利用率が高すぎる場合は、sleep 関数へ渡す値を大きくし、低すぎる場合は、小さくします。 19 まとめ 本書では WLM の基本的な使い方をいくつか見てきました。グループを定義してそのグループにリソースを割り当てる 方法、さらに SLO に優先度をつけて重要度の高いものから順にリソースを分配していく方法を学びました。次に、パフ ォーマンスの目標を設定し、その目標を達成するよう WLM がダイナミックにリソースを調節する方法も試しました。他 にも条件によって SLO の有効化/無効化を切り替える方法、利用率という概念の目標の設定方法についても学習しま した。 こうした基本的な機能を組み合わせるだけでもかなり実用的なリソース制御を行うことができますが、WLM はこの他に も以下に示すような多彩な機能を提供しています。 • プロセッサ グループの動的なサイズ調整(Psets との連携) • Virtual Partition 間での CPU の動的な移動、ロード バランシング機能 • 監査、課金データの記録 • MC/ServiceGuard のフェイルオーバーに対応したリソース割り当て • EMS を使った SLO の監視 • 必要に応じた予約プロセッサの有効化(iCOD との連携) • リソースの分配状況や SLO の達成度をグラフで確認できる Java GUI • GlancePlus のパフォーマンス データを WLM に取り込む機能 • C プログラムや各種スクリプト言語から WLM にデータを送るための API やコマンドの提供 またこれらに加えて、Apache や Oracle、WebLogic など代表的なアプリケーションとの連携を簡単に行うためのツー ルキットが標準で添付されます。このツールキットにはあらかじめテンプレートとしていくつかの設定ファイルやスクリプ ト例が用意されているので、それらを使用することで迅速なシステム構築が可能となります。 20 参考情報 www.hp.com/go/wlm WLM 製品紹介ページ (英語) docs.hp.com/ HP テクニカル ドキュメント ポータルサイト (英語、日本語) WLM のリリースノート、ユーザーズガイドが入手可能。 software.hp.com/ ソフトウェア ダウンロード サイト (有償、無償) WLM もダウンロード可能 (英語) itrc.hp.com/ サポート情報サイト (パッチ、ユーザーコミュニティなど) hp-ux workload/resource management フォーラムで WLM が話題に (英文) お問い合わせはカスタマー インフォメーションセンターへ 03-6416-6660 月∼金9:00∼19:00 土10:00∼18:00(日、祝祭日、年末年始および5/1を除く) HP-UX製品に関する情報は http://www.hp.com/jp/hpux 記載されている会社名および商品名は、各社の商標または登録商標です。 記載事項は2003年10月現在のものです。 本書に記載された内容は、予告なく変更されることがあります。 本書中の技術的あるいは校正上の誤り、省略に対して、 いかなる責任も負いかねますのでご了承ください。 本書は、『HP-UX Workload Manager User’s Guide Version A.02.01』(英語)の 第2章『Learning WLM by example』を翻訳して、加筆、編集したものです。 © Copyright 2003 Hewlett-Packard Development Company, L.P. 日本ヒューレット・パッカード株式会社 〒140-8641東京都品川区東品川2-2-24 天王洲セントラルタワー PDFHS04001-01
© Copyright 2024 ExpyDoc