次のリストは、システム上で構成されるクラスと、タイムシェアリングクラスのユーザー優先順位の範囲です。クラスの種類は次のとおりです。
プロセスのスケージュール優先順位とは、プロセススケジューラによって割り当てられる優先順位のことです。これらの優先順位は、スケジューラのスケジュールポリシーに従って割り当てられます。dispadmin コマンドを使用すると、デフォルトのスケジュールポリシーを表示できます。
priocntl コマンドを使用して、プロセスを優先順位クラスに割り当てて、プロセスの優先順位を管理できます。priocntl コマンドを使用してプロセスを管理する手順については、プロセスの優先順位を指定する方法 (priocntl)を参照してください。
priocntl -l コマンドを使用すると、プロセスのスケジューリングクラスと優先順位の範囲を表示できます。
$ priocntl -l |
次の例に 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 -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 |
指定した優先順位でプロセスを起動します。
# 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 までのユーザー指定の優先順位を指定できる |
プロセス状態を確認します。
# ps -ecl | grep command-name |
次の例では、ユーザーが指定する最上位の優先順位を使用して find コマンドを開始します。
# priocntl -e -c TS -m 60 -p 60 find . -name core -print # ps -ecl | grep find |
実行中のタイムシェアリングプロセスのスケジューリングパラメータを変更します。
# priocntl -s -m userlimit [-p userpriority] -i idtype idlist |
-s |
ユーザー優先順位の範囲について上限を設定し、現在の優先順位を変更する |
-m userlimit |
-p オプションを使用するときに、優先順位を上下できる最大範囲を指定する |
-p userpriority |
優先順位を指定する |
-i idtype idlist |
idtype と idlist の組み合わせを使用してプロセスを識別する。idtype では PID や UID など、ID のタイプを指定する。idlist を使用して、pid または UID のリストを識別する |
プロセス状態を確認します。
# ps -ecl | grep idlist |
次の例では、500 ミリ秒のタイムスライス、クラス RT 内の優先順位 20、グローバル優先順位 120 を指定して、コマンドを実行します。
# priocntl -e -c RT -t 500 -p 20 myprog # ps -ecl | grep myprog |
プロセスをリアルタイムプロセスに変更したり、リアルタイムプロセスから変更したりするには、ユーザーはスーパーユーザーであるか、リアルタイムシェル内で作業中でなければなりません。
プロセスのクラスを変更します。
# priocntl -s -c class -i idtype idlist |
-s |
ユーザー優先順位の範囲について上限を設定し、現在の優先順位を変更する |
-c class |
クラス TS またはクラス RT を指定して、プロセスのクラスを変更する |
-i idtype idlist |
idtype と idlist の組み合わせを使用してプロセスを識別する。idtype では PID や UID など、ID のタイプを指定する。idlist を使用して、pid または UID のリストを識別する |
プロセス状態を確認します。
# ps -ecl | grep idlist |
次の例では、ユーザー 15249 が所有するすべてのプロセスをリアルタイムプロセスに変更します。
# priocntl -s -c RT -i uid 15249 # ps -ecl | grep 15249 |
スーパーユーザーとしてユーザープロセスをリアルタイムクラスに変更すると、そのユーザーは priocntl -s を使用して、リアルタイムのスケジューリングパラメータを変更できません。
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 シェル組み込みコマンドです。
この節では /usr/bin/nice コマンドの構文についてだけ説明し、C シェル nice 組み込みコマンドについての説明は行いません。C シェル nice コマンドについては、csh(1) のマニュアルページを参照してください。
まず、ユーザーとしてコマンドの優先順位を下げるのか、あるいはスーパーユーザーとしてコマンドの優先順位を上げるのか下げるのかを決定してから、次のうちの 1 つを選択します。
手順 2 の例に従って、ユーザーとしてコマンドの優先順位を下げる。
手順 3 に従って、スーパーユーザーとしてコマンドの優先順位を上げるか、または下げる。
ユーザーとして、 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 |
スーパーユーザーとして、 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) のマニュアルページを参照してください。
同じユーザーが所有する複数の同じジョブがないかどうかを調べます。ジョブが終了するまで待たずに多数のバックグラウンドジョブを起動するスクリプトを実行した場合に、この問題が発生することがあります。
CPU 時間が大量に増えているプロセスがないかどうかを調べます。この問題を調べるには、ps 出力の TIME フィールドを確認します。そのプロセスが無限ループに入っている可能性があります。
実行中のプロセスの優先順位が高すぎないかどうかを調べます。ps -c コマンドを使用して CLS フィールドを調べると、各プロセスのスケジューラクラスが表示されます。リアルタイム (RT) プロセスとして実行中のプロセスが CPU を独占している可能性があります。また、nice 値の大きいタイムシェアリング (TS) プロセスがないかどうかを調べます。スーパーユーザー特権を持つユーザーが、このプロセスの優先順位を上げすぎた可能性があります。システム管理者は、nice コマンドを使用して優先順位を下げることができます。
制御がきかなくなったプロセスを調べます。このようなプロセスは、CPU 時間の使用が継続的に増加していきます。プロセスが開始 (STIME) されたときに調べるか、しばらくの間 CPU 時間 (TIME) が累計されるのを観察していると、この問題が発生しているかどうかを判断できます。