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

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

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

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

プロセスのスケージュール優先順位とは、プロセススケジューラによって割り当てられる優先順位のことです。これらの優先順位は、スケジューラのスケジュールポリシーに従って割り当てられます。dispadmin コマンドを使用すると、デフォルトのスケジュールポリシーを表示できます。

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

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

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


$ priocntl -l

例—プロセスクラスに関する基本情報を表示する (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

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

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


$ ps -ecl

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

例—プロセスのグローバル優先順位を表示する (ps)

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

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

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

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


    # priocntl -e -c class -m userlimit -p pri command-name
    

    -e

    コマンドを実行する 

    -c class

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

    -m userlimit

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

    -p pri command-name

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

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


    # ps -ecl | grep command-name
    

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

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


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

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

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

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


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

    -s

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

    -m userlimit

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

    -p userpriority

    優先順位を指定する 

    -i idtype idlist

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

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


    # ps -ecl | grep idlist
    

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

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


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

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

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


    注 –

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


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


    # priocntl -s -c class -i idtype idlist
    

    -s

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

    -c class

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

    -i idtype idlist

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

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


    # ps -ecl | grep idlist
    

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

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


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

注 –

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


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

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

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

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

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

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

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

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


注 –

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


  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) のマニュアルページを参照してください。

システムのプロセスに関する問題解決方法

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