Solaris のシステム管理 (上級編)

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

次のリストは、システム上で構成可能なプロセススケジューリングクラスを示しています。タイムシェアリングクラスのユーザー優先順位の範囲も示しています。

プロセススケジューリングクラスの種類は次のとおりです。

プロセスのスケジュール優先順位の変更 (priocntl)

プロセスのスケジュール優先順位とは、スケジュールポリシーに従ってプロセススケジューラによって割り当てられる優先順位のことです。dispadmin コマンドを使用すると、デフォルトのスケジュールポリシーを表示できます。詳細は、dispadmin(1M) のマニュアルページを参照してください。

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

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

  1. priocntl -l コマンドを使用して、プロセスのスケジューリングクラスと優先順位の範囲を表示します。


    $ priocntl -l
    

例 12–5 プロセスクラスに関する基本情報を表示する (priocntl)

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


# 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

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

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


    $ ps -ecl
    

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


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

次の例は、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

Procedureプロセスの優先順位を指定する方法 (priocntl)

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (セキュリティサービス)』「RBAC の構成 (作業マップ)」を参照してください。

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


    # priocntl -e -c class -m user-limit -p pri command-name
    
    -e

    コマンドを実行する

    -c class

    プロセスを実行する範囲のクラスを指定する。有効なクラスは TS (タイムシェアリング)、RT (リアルタイム)、IA (対話型)、FSS (公平配分)、および FX (固定優先順位)

    -m user-limit

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

    -p pri command-name

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

  3. プロセス状態を確認します。


    # ps -ecl | grep command-name
    

例 12–7 プロセスの優先順位を指定する (priocntl)

次の例では、ユーザーが指定できる最上位の優先順位を使用して find コマンドを開始します。


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

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

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (セキュリティサービス)』「RBAC の構成 (作業マップ)」を参照してください。

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


    # priocntl -s -m user-limit [-p user-priority] -i idtype idlist
    
    -s

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

    -m user-limit

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

    -p user-priority

    優先順位を指定する

    -i xidtype xidlist

    xidtypexidlist の組み合わせを使用してプロセスを識別する。「xidtype」ではプロセス ID やユーザー ID など、ID のタイプを指定する。「xidlist」ではプロセス ID またはユーザー ID のリストを識別する

  3. プロセス状態を確認します。


    # ps -ecl | grep idlist
    

例 12–8 タイムシェアリングプロセスのスケジューリングパラメータを変更する (priocntl)

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


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

Procedureプロセスのクラスを変更する方法 (priocntl)

  1. (省略可能) スーパーユーザーまたは同等の役割になります。

  2. プロセスのクラスを変更する


    # priocntl -s -c class -i idtype idlist
    
    -s

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

    -c class

    クラス TS (タイムシェアリング) または RT (リアルタイム) を指定して、プロセスのクラスを変更する

    -i idtype idlist

    xidtypexidlist の組み合わせを使用してプロセスを識別する。xidtype ではプロセス ID やユーザー ID など、ID のタイプを指定する。「xidlist」ではプロセス ID またはユーザー ID のリストを識別する


    注 –

    プロセスをリアルタイムプロセスに変更したり、リアルタイムプロセスから変更したりするには、ユーザーはスーパーユーザーであるか、リアルタイムシェル内で作業中でなければなりません。スーパーユーザーとしてユーザープロセスをリアルタイムクラスに変更すると、そのユーザーは priocntl -s を使用して、リアルタイムのスケジューリングパラメータを変更できません。


  3. プロセス状態を確認します。


    # ps -ecl | grep idlist
    

例 12–9 プロセスのクラスを変更する (priocntl)

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


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

タイムシェアリングプロセスの優先順位の変更 (nice)

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

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

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

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

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

nice 値の範囲は 0 から +39 までで、0 が最上位の優先順位です。各タイムシェアリングプロセスのデフォルトの nice 値は 20 です。このコマンドには、利用できるバージョンが 2 つあります。標準バージョンの /usr/bin/nice と、C シェルの組み込みコマンドです。

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

この方法により、ユーザーがプロセスの優先順位を下げることができます。ただし、スーパーユーザーはプロセスの優先順位を上げたり、下げたりすることができます。


注 –

この節では /usr/bin/nice コマンドの構文についてだけ説明し、C シェル nice 組み込みコマンドについての説明は行いません。C シェルの nice コマンドについては、csh(1) のマニュアルページを参照してください。


  1. プロセスの優先順位をユーザーとして変更するか、スーパーユーザーとして変更するかを決定します。次のいずれかの手順に従います。

    • ユーザーとして、手順 2 の例に従ってコマンドの優先順位を下げます。

    • スーパーユーザーとして、手順 3 の例に従ってコマンドの優先順位を上げたり下げたりします。

  2. ユーザーとして、nice 値を大きくすることでコマンドの優先順位を下げます。

    次の nice コマンドは、nice 値を 5 単位分大きくすることで、 command-name を実行する優先順位を下げます。


    $ /usr/bin/nice -5 command-name
    

    上記のコマンドでは、マイナス記号は次にくるものがオプションであることを表します。このコマンドは、次のように指定することもできます。


    % /usr/bin/nice -n 5 command-name
    

    次の nice コマンドは、nice 値をデフォルトの 10 単位分大きくすることで、 command-name の優先順位を下げます。ただし、最大値の 39 を超えさせることはできません。


    % /usr/bin/nice command-name
    
  3. スーパーユーザーか同等の役割で、nice 値を変更してコマンドの優先順位を上げたり下げたりします。

    次の nice コマンドは、nice 値を 10 単位分小さくすることで、command-name の優先順位を上げます。ただし、最低値の 0 未満にすることはできません。


    # /usr/bin/nice --10 command-name
    

    上記のコマンドでは、最初のマイナス記号は次にくるものがオプションであることを表します。2 番目のマイナス記号は負の数を表します。

    次の nice コマンドは、nice 値を 5 単位分大きくすることで、command-name の優先順位を下げます。ただし、最高値の 39 を超えさせることはできません。


    # /usr/bin/nice -5 command-name
    
参照

詳細は、nice(1) のマニュアルページを参照してください。