メモリーとスレッドの配置最適化開発者ガイド

第 2 章 MPO 可観測性ツール

この章では、Solaris オペレーティングシステムに用意されている MPO 機能を使用する場合に利用できるツールについて説明します。

次の内容について説明します。

pmadvise ユーティリティー

pmadvise ユーティリティーは、プロセスでのメモリーの使用方法を定義する規則をプロセスに適用します。pmadvise ユーティリティーは、madvise(3C) ツールを使用して、「アドバイス」と呼ばれる規則をプロセスに適用します。このツールは、特定の時間に、メモリー位置の特定の部分範囲に対してアドバイスを適用することができます。一方、madv.so.1(1) ツールは、ターゲットプログラムの実行期間全体にわたり、指定されたタイプのセグメントすべてに対してアドバイスを適用します。

pmadvise ユーティリティーには次のオプションがあります。

-f

このオプションは、ターゲットプロセスを制御下に置きます。このオプションは、ほかのどのプロセスの制御よりも優先します。proc(1) のマニュアルページを参照してください。

-o

このオプションは、ターゲットプロセスに適用するアドバイスを指定します。アドバイスは、次の形式で指定してください。

private=advice
shared=advice
heap=advice
stack=advice
address:length=advice

advice の値には、次のいずれかを指定できます。

normal
random
sequential
willneed
dontneed
free
access_lwp
access_many
access_default

アドレスと長さを指定して、アドバイスを適用する部分範囲を指定することができます。アドレスは 16 進表記、長さはバイト数で指定してください。

長さが指定されていない場合で、開始アドレスがセグメントの先頭を指しているときは、pmadvise ユーティリティーはそのセグメントにアドバイスを適用します。長さには修飾文字 K、M、G、T、P、または E を追加できます。これらはそれぞれ、キロバイト、メガバイト、ギガバイト、テラバイト、ペタバイト、およびエクサバイトを表します。

-v

このオプションは、現在適用されているアドバイス規則の値および位置を、pmap(1) ツールの書式の詳細出力で表示します。

pmadvise ツールは、正当なオプションはすべて処理しようとします。オプションで不正なアドレス範囲が指定されている場合、pmadvise ツールはそのオプションの処理を試みるときにエラーメッセージを表示し、そのオプションをスキップします。構文エラーを検出した場合、pmadvise ツールはどのオプションも処理せずに終了し、使用法のメッセージを表示します。

特定の領域に対するアドバイスが、より一般的な領域に対するアドバイスと衝突している場合は、特定の領域に対するアドバイスが優先されます。特定のアドレス範囲を指定するアドバイスは、ヒープ領域およびスタック領域に対するアドバイスより優先されます。また、ヒープ領域およびスタック領域に対するアドバイスは、プライベートメモリーおよび共有メモリーに対するアドバイスより優先されます。

次の各グループに含まれるアドバイス規則は、同じグループ内のほかのアドバイス規則とは互いに排他的です。

MADV_NORMAL, MADV_RANDOM, MADV_SEQUENTIAL
MADV_WILLNEED, MADV_DONTNEED, MADV_FREE   
MADV_ACCESS_DEFAULT, MADV_ACCESS_LWP, MADV_ACCESS_MANY

plgrp ツール

plgrp ユーティリティーは、1 つ以上のプロセス、スレッド、または軽量プロセス (LWP) について、ホーム lgroup と lgroup のアフィニティーを表示したり設定したりできます。各スレッドには、作成時にホーム lgroup が割り当てられます。CPU 資源またはメモリー資源をスレッドに割り当てるとき、システムは、スレッドのホームにもっとも近い位置にある使用可能な資源を探すために、スレッドのホーム lgroup から順番に lgroup 階層を検索します。

システムにより、各スレッドのホーム lgroup が選択されます。ホーム lgroup に対するスレッドのアフィニティーは、最初は none、つまりアフィニティーなしに設定されます。スレッドが、ホーム lgroup に対するスレッドのアフィニティーより高いアフィニティーを、プロセッサセット内の lgroup に対して設定すると、システムはスレッドをその lgroup に移動します。CPU に割り当てられているスレッドは移動されません。ホーム lgroup に対するスレッドのアフィニティーが削除 (none に設定) されると、プロセッサセット内でもっとも高いアフィニティーを持っている lgroup がホーム lgroup としてスレッドに割り当て直されます。

lgroup のアフィニティーのさまざまなレベルおよびその意味の詳細については、lgrp_affinity_set(3LGRP) のマニュアルページを参照してください。

plgrp ツールでは、次のオプションがサポートされています。

-a lgroup list

このオプションは、リスト内の lgroup に対して、指定されたプロセスまたはスレッドのアフィニティーを表示します。

-Algroup list/ none|weak|strong[,...]

このオプションは、リスト内の lgroup に対して、指定されたプロセスまたはスレッドのアフィニティーを設定します。lgroup/affinity の組み合わせをコンマで区切って並べたリストを使用して、複数のアフィニティーを一度に設定することができます。

-F

このオプションは、ターゲットプロセスを制御下に置きます。このオプションは、ほかのどのプロセスの制御よりも優先します。proc(1) のマニュアルページを参照してください。

-h

このオプションは、指定されたプロセスまたはスレッドのホーム lgroup を返します。これは、オプションを指定せずに plgrp ツールを使用した場合のデフォルトの動作です。

-H lgroup list

このオプションは、指定されたプロセスまたはスレッドのホーム lgroup を設定します。このオプションは、リスト内の lgroup に対して強いアフィニティーを設定します。plgrp ユーティリティーは、複数の lgroup が指定された場合、ラウンドロビン方式でこれらの lgroup をホーム lgroup としてスレッドに割り当てようとします。

lgroup の指定

lgroup list 変数の値は、次の属性の 1 つ以上をコンマで区切って並べたリストです。

all キーワードは、システム内のすべての lgroup ID を表します。root キーワードは、ルート lgroup の ID を表します。leaves キーワードは、すべての葉 lgroup の ID を表します。葉 lgroup とは、子を持っていない lgroup のことです。

プロセスおよびスレッドの引数の指定

plgrp ユーティリティーは、1 つ以上のプロセスまたはスレッドを空白文字で区切って並べたリストを引数として受け取ります。proc(1) ツールで使用される構文と同じ構文で、プロセスとスレッドを指定できます。pid または /proc/pid という構文を使用して、プロセス ID を整数で指定できます。/proc/pid 構文ではシェル展開を使用できます。プロセス ID だけを指定すると、plgrp ユーティリティーの引数には、そのプロセスのすべてのスレッドが含められます。

pid/lwpid という構文でプロセス ID とスレッド ID を指定することにより、スレッドを明示的に指定できます。「-」文字を使用して一度に範囲を選択するか、コンマで区切って並べたリストを使用して、プロセス内の複数のスレッドを指定できます。pid というプロセス ID を持つプロセスのスレッド 1、2、7、8、および 9 を指定するには、構文 pid/1,2,7-9 を使用します。

lgrpinfo ツール

lgrpinfo ツールは、lgroup の階層、内容、および特性に関する情報を出力します。lgrpinfo ツールは、Solaris::Lgrp モジュールを必要とする Perl スクリプトです。このツールは、liblgrp(3LIB) API を使用してシステムから情報を取得し、人が読める形式で出力します。

引数を指定せずに lgrpinfo ツールを呼び出すと、システム内のすべての lgroup に関する一般的な情報が出力されます。コマンド行で lgrpinfo ツールに lgroup ID を渡すと、指定した lgroup に関する情報が返されます。lgroup を指定するには、その lgroup ID を使用するか、次のキーワードのいずれかを使用することができます。

all

このキーワードは、すべての lgroup を指定します。これはデフォルトの動作です。

root

このキーワードは、ルート lgroup を指定します。

leaves

このキーワードは、すべての葉 lgroup を指定します。葉 lgroup とは、lgroup 階層内で子を持っていない lgroup のことです。

intermediate

このキーワードは、すべての中間 lgroup を指定します。中間 lgroup とは、親と子を持っている lgroup のことです。

lgrpinfo ツールは、無効な lgroup ID を受け取った場合、その無効な ID を示すメッセージを表示し、コマンド行で渡されたほかの lgroup の処理を続行します。lgrpinfo ツールは、引数内に無効な lgroup がない場合、状態 2 で終了します。

lgrpinfo ツールのオプション

引数を指定せずに lgrpinfo ツールを呼び出すと、オプション -celmrt all を指定した場合と同じ動作になります。lgrpinfo ツールの有効なオプションは次のとおりです。

-a

このオプションは、指定された lgroup ID について、トポロジ、CPU、メモリー、負荷、および応答時間値の情報を出力します。このオプションを指定すると、-T オプションも指定した場合を除き、-tcemrlL オプションの動作を組み合わせた動作になります。-T オプションを指定した場合は、-a オプションの動作に -t オプションの動作は含まれなくなります。

-c

このオプションは、CPU の情報を出力します。

-C

このオプションは、リスト内の各 lgroup をその子で置き換えます。このオプションを -P オプションまたは -T オプションと組み合わせることはできません。引数がまったく指定されていない場合、このオプションはすべての lgroup に適用されます。

-e

このオプションは、葉 lgroup に関する lgroup 平均負荷率を出力します。

-G

このオプションは、lgroup 階層を OS 表示で出力します。ツールのデフォルトの動作では、lgroup 階層は呼び出し元の表示で出力されます。呼び出し元の表示には、呼び出し元で使用できる資源だけが含まれています。OS 表示と呼び出し元表示の詳細については、lgrp_init(3LGRP) のマニュアルページを参照してください。

-h

このオプションは、ツールに関するヘルプメッセージを表示します。

-I

このオプションは、指定された ID と一致する ID だけを出力します。このオプションは、-c-G-C、または -P オプションと組み合わせることができます。-c オプションを指定すると、一致するすべての lgroup に含まれている CPU のリストが出力されます。-c オプションを指定しない場合は、一致する lgroup の ID が表示されます。引数がまったく指定されていない場合、このオプションはすべての lgroup に適用されます。

-l

このオプションは、lgroup の応答時間に関する情報を出力します。各 lgroup について示される応答時間値は、オペレーティングシステムによって定義されたもので、プラットフォーム固有の数値です。実行中のシステムで lgroup を相対的に比較する目的にのみ使用できます。この値は、ハードウェアデバイス間の実際の応答時間を表しているとは限らず、異なるプラットフォームには当てはまらない場合もあります。

-L

このオプションは、lgroup の応答時間表を出力します。この表は、各 lgroup からほかの各 lgroup に対する相対応答時間を示します。

-m

このオプションは、メモリーの情報を出力します。メモリーサイズの報告には、サイズが 0 から 1023 の整数範囲に収まるような単位が使用されます。-u オプションを使用すると、この動作を変更することができます。値が 10 より小さい場合のみ、小数部も表示されます。

-P

このオプションは、リスト内の各 lgroup をその親で置き換えます。このオプションを -C オプションまたは -T オプションと組み合わせることはできません。引数がまったく指定されていない場合、このオプションはすべての lgroup に適用されます。

-r

このオプションは、lgroup の資源に関する情報を出力します。-T オプションを指定すると、中間 lgroup の資源についてのみ情報が表示されます。

-t

このオプションは、lgroup のトポロジに関する情報を出力します。

-T

このオプションは、システムの lgroup トポロジをツリー形式でグラフィカルに表示します。このオプションは、-a-c-e-G-l-L-m-r、および -u オプションとの組み合わせでのみ使用できます。出力を中間 lgroup だけに制限するには、-r オプションを使用します。-T オプションと -a オプションを組み合わせるときは、-t オプションは省略します。ルート lgroup が唯一の lgroup である場合を除き、このオプションではルート lgroup に関する情報は出力されません。

-uunits

このオプションは、メモリーの単位を指定します。units 引数の値には、bkmgtp、または e を指定できます。これらはそれぞれ、バイト、キロバイト、メガバイト、ギガバイト、テラバイト、ペタバイト、およびエクサバイトを表します。

Solaris::lgrp モジュール

この Perl モジュールは、liblgrp に含まれている lgroup API への Perl インタフェースを提供します。このインタフェースを使用すると、lgroup 階層を探索し、その内容と特性を検出し、lgroup に対するスレッドのアフィニティーを設定することができます。このモジュールを使用して、lgrp_user.h ヘッダーファイルで定義されているさまざまな定数や関数にアクセスできます。このモジュールには、ライブラリへの手続き型インタフェースとオブジェクトインタフェースが用意されています。

このモジュールは、デフォルトの動作では何もエクスポートしません。次のタグを使用すると、このモジュールで定義されている定数と関数を選択的にインポートできます。

:LGRP_CONSTANTS

LGRP_AFF_NONELGRP_AFF_STRONGLGRP_AFF_WEAKLGRP_CONTENT_DIRECTLGRP_CONTENT_HIERARCHYLGRP_MEM_SZ_FREELGRP_MEM_SZ_INSTALLEDLGRP_VER_CURRENTLGRP_VER_NONELGRP_VIEW_CALLERLGRP_VIEW_OSLGRP_NONELGRP_RSRC_CPULGRP_RSRC_MEMLGRP_CONTENT_ALLLGRP_LAT_CPU_TO_MEM

:PROC_CONSTANTS

P_PIDP_LWPIDP_MYID

:CONSTANTS

:LGRP_CONSTANTS:PROC_CONSTANTS

:FUNCTIONS

lgrp_affinity_get()lgrp_affinity_set()lgrp_children()lgrp_cookie_stale()lgrp_cpus()lgrp_fini()lgrp_home()lgrp_init()lgrp_latency()lgrp_latency_cookie()lgrp_mem_size()lgrp_nlgrps()lgrp_parents()lgrp_root()lgrp_version()lgrp_view()lgrp_resources()lgrp_lgrps()lgrp_leaves()lgrp_isleaf()lgrp_lgrps()lgrp_leaves()

:ALL()

:CONSTANTS():FUNCTIONS()

この Perl モジュールには、次のメソッドがあります。

:CONSTANTS タグまたは :ALL タグを使用して、定数をエクスポートできます。次に示す定数はどれでも、Perl プログラムで使用することができます。

基になるライブラリ関数が失敗すると、このモジュール内の関数は undef または空のリストを返します。モジュールでは、次のエラーコードが使用されます。

EINVAL

指定された値が無効です。

ENOMEM

システムメモリーが不足したため操作を完了できませんでした。

ESRCH

指定されたプロセスまたはスレッドが見つかりませんでした。

EPERM

呼び出しプロセスの実効ユーザーが適切な特権を持っておらず、実ユーザー ID または実効ユーザー ID が特定のスレッドの実ユーザー ID または実効ユーザー ID とも一致していません。