Solaris のシステム管理 (第 2 巻)

プロセスクラス情報の管理

次のリストは、システム上で構成されるクラスと、タイムシェアリングクラスのユーザー優先順位の範囲です。クラスの種類は次のとおりです。

priocntl を使用してプロセスのスケジュール優先順位を変更する

プロセスのスケジュール優先順位とは、プロセススケジューラによって割り当てられる優先順位のことです。これらの優先順位は、スケジューラのスケジュールポリシーに従って割り当てられます。dispadmin コマンドを使用すると、デフォルトのスケジュールポリシーを表示できます。dispadmin コマンドの使用方法については、「スケジューラの構成」を参照してください。

priocntl(1) コマンドを使用すると、プロセスを優先順位クラスに割り当て、プロセスの優先順位を管理できます。プロセスを管理するための priocntl コマンドの使用方法については、「優先順位を指定する方法」を参照してください。

プロセスクラスに関する基本情報を表示する方法

priocntl -l コマンドを使用すると、プロセスクラスとスケジューリングパラメタを表示できます。

$ priocntl -l

例 - プロセスクラスに関する基本情報を表示する

次の例に priocntl -l コマンドからの出力を示します。

$ priocntl -l
CONFIGURED CLASSES
==================

SYS (System Class)

TS (Time Sharing)
	Configured TS User Priority Range: -20 through 20

プロセスのグローバル優先順位を表示する方法

ps コマンドを使用して、プロセスのグローバル優先順位を表示できます。

$ ps -ecl

グローバル優先順位は、PRI カラムの下に表示されます。

例 - プロセスのグローバル優先順位を表示する

次の例は、ps -ecl からの出力を示しています。PRI カラム内のデータは、pageout が最上位の優先順位を持ち、sh が最下位の優先順位であることを示しています。

$ ps -ecl
 F S UID PID  PPID CLS PRI  ADDR      SZ  WCHAN    TTY      TIME   COMD
19 T 0   0    0    SYS 96   f00d05a8   0           ?        0:03  sched
 8 S 0   1    0    TS  50   ff0f4678 185  ff0f4848 ?       36:51   init
19 S 0   2    0    SYS 98   ff0f4018   0  f00c645c ?        0:01 pageout
19 S 0   3    0    SYS 60   ff0f5998   0  f00d0c68 ?      241:01 fsflush
 8 S 0   269  1    TS  58   ff0f5338 303  ff49837e ?        0:07    sac
 8 S 0   204  1    TS  43   ff2f6008  50  ff2f606e console  0:02     sh

優先順位を指定する方法

  1. スーパーユーザーになります。

  2. 指定した優先順位を持つプロセスを起動します。

    # priocntl -e -c class -m userlimit-p pri command_name
    

    -e

    コマンドを実行する 

    -c class

    プロセスを実行する範囲のクラスを指定する。デフォルトのクラスは TS (タイムシェアリング) または RT (リアルタイム)

    -m userlimit

    -p オプションを使用するときに、優先順位を上下できる最大範囲を指定する

    -p pri command_name

    リアルタイムスレッド用に RT クラス内で相対優先順位を指定できるようにする。タイムシェアリングプロセスの場合は、-p オプションを使用すると -20 から +20 までのユーザー提供の優先順位を指定できる

  3. ps -ecl コマンドで、プロセスの状態を確認します。

        # ps -ecl | grep command_name
    

例 - 優先順位を指定する

次の例では、ユーザーが提供する最上位の優先順位を使用して find コマンドを起動します。

# priocntl -e -c TS -m 20 -p 20 find . -name core -print
# ps -ecl | grep find

タイムシェアリングプロセスのスケジューリングパラメタを変更する方法

  1. スーパーユーザーになります。

  2. 実行中のタイムシェアリングプロセスのスケジューリングパラメタを変更します。

        # priocntl -s -m userlimit [-p userpriority] -i idtype idlist
    

    -s

    ユーザー優先順位の範囲の上限を設定し、現在の優先順位を変更できる 

    -m userlimit

    -p オプションを使用するときに、優先順位を上下できる最大範囲を指定する

    -p userpriority

    優先順位を指定できる 

    -i idtype idlist

    idtypeidlist の組み合わせを使用してプロセスを識別する。idtype では PIDUID など、ID のタイプを指定する

  3. ps -ecl コマンドで、プロセスの状態を確認します。

        # ps -ecl | grep idlist

例 - タイムシェアリングプロセスのスケジューリングパラメタを変更する

次の例では、500 ミリ秒のタイムスライス、クラス RT 内の優先順位 20、グローバル優先順位 120 を指定して、コマンドを実行します。

# priocntl -e -c RT -t 500 -p 20 myprog
# ps -ecl | grep myprog

プロセスのクラスを変更する方法

  1. (省略可能) スーパーユーザーになります。


    注 -

    プロセスをリアルタイムプロセスに変更したり、リアルタイムプロセスから変更したりするには、ユーザーはリアルタイムシェル内でスーパーユーザーであるか、作業中でなければなりません。


  2. プロセスのクラスを変更します。

        # priocntl -s -c class -i idtype idlist
    

    -s

    ユーザー優先順位の範囲について上限を設定し、現在の優先順位を変更できる 

    -c class

    クラス TS またはクラス RT を指定して、プロセスのクラスを変更する

    -i idtype idlist

    idtypeidlist の組み合わせを使用してプロセスを識別する。idtype では PIDUID など、ID のタイプを指定する

  3. ps -ecl コマンドで、プロセスの状態を確認します。

        # ps -ecl | grep idlist
    

例 - プロセスのクラスを変更する

次の例では、ユーザー 15249 が所有するすべてのプロセスをリアルタイムプロセスに変更します。

# priocntl -s -c RT -i uid 15249
# ps -ecl | grep 15249

注 -

スーパーユーザーとしてユーザープロセスをリアルタイムクラスに変更すると、その後ユーザーはリアルタイムのスケジューリングパラメタを (priocntl -s を使用して) 変更できません。


nice を使用してタイムシェアリングプロセスの優先順位を変更する

nice(1) コマンドは、SunOS の旧バージョンとの下位互換性を保つためにのみサポートされます。priocntl コマンドを使用する方がプロセスを柔軟に管理できます。

プロセスの優先順位は、そのスケジュールクラスポリシーと nice number 番号によって決定されます。各タイムシェアリングプロセスは、ユーザーが与えた優先順位を加算して計算されるグローバル優先順位を持っています。これは、nice コマンドまたは priocntl コマンド、およびシステムによって計算される優先順位の影響を受けます。

プロセスの実行優先順位番号は、オペレーティングシステムによって割り当てられ、スケジュールクラス、使用される CPU 時間、nice 値 (タイムシェアリングプロセスの場合) などの複数の要素によって決定されます。

各タイムシェアリングプロセスは、親プロセスから継承したデフォルトの nice 番号で起動します。nice 値は、ps レポートの NI カラムに表示されます。

ユーザーは、自分が与える nice 番号優先順位を大きくしてプロセスの優先順位を下げることができます。ただし、nice 番号を小さくしてプロセスの優先順位を上げることができるのは、スーパーユーザー (または root) だけです。これは、ユーザーが各自のプロセスの優先順位を大きくして CPU の独占比率を高めるのを防ぐためです。

nice 番号の範囲は 0 から +40 までで、0 は最上位の優先順位を与えます。デフォルト値は 20 です。nice コマンドには利用できるバージョンが 2 つあり、一方は標準バージョンの /usr/bin/nice で、他方は C シェルの一部となっているバージョンです。

プロセスの優先順位を変更する方法

nice 番号を変更して、コマンドやプロセスの優先順位を変更できます。プロセスの優先順位を下げるには、次のコマンドを使用します。

/usr/bin/nice command_name

nice 番号を 4 単位で増やす (デフォルト)

/usr/bin/nice +4 command_name

nice 番号を 4 単位で増やす

/usr/bin/nice -10 command_name

nice 番号を 10 単位で増やす

第 1 と第 2 のコマンドは、nice 番号を 4 単位で増やします (デフォルト)。第 3 のコマンドは、nice を 10 単位で増やしていますが負数の増分なので、プロセスの優先順位を下げます。

次のコマンドは、nice 番号を小さくしてコマンドの優先順位を上げます。

プロセスの優先順位を上げるには、次のコマンドを使用します。

/usr/bin/nice -10 command_name

nice 番号を小さくしてコマンドの優先順位を上げる

/usr/bin/nice -10 command_name

nice 番号を小さくしてコマンドの優先順位を上げる。最初のマイナス記号はオプションの記号で、第 2 のマイナス記号は負の数を示す

上記のコマンドでは、nice 番号を小さくしてコマンド command_name の優先順位を上げます。第 2 のコマンドでは、2 つのマイナス記号が必要なので注意してください。

プロセスの問題解決方法

すでに判明している問題の解決方法のヒントを次に示します。