試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GNU/Linuxにおけるプロセスの優先度指定について

GNU/LinuxのOS上で動作しているプログラムは優先度が指定でき、プロセス起動時に指定することも動作時に変更することもできる。

  1. 優先度とその値について
  2. nice値の指定
    1. プロセスの起動時にnice値を指定する
    2. 実行中のプロセスのnice値を変更する
  3. nice値の確認
    1. psコマンド
    2. topコマンド
    3. GUIツール

優先度とその値について

プロセスの優先度は40段階のnice値という情報によって管理される。値は-20から19*1の値をとり、標準の値は0だが、値が大きいほうが優先度は低く、この点において多少ややこしいため、「『他のプロセスに先を譲る度合い』が『niceである度合い/niceさ*2』」、「遠慮するプロセスはniceである」という理解をしたほうが分かりやすいかもしれない。

       19      ...      0      ...      -20
(優先されない)       (標 準)       (優先される)
(他のプロセスに                 (他のプロセスに
 先を譲る)                        先を譲らない)
(niceである)                     (niceではない)

管理者権限のユーザは0よりも高い優先度の値(-1から-20)に設定することができるが、一般ユーザは原則として「自分の権限で動作するプロセスについて0から19の値でのみ」という制約のもとでnice値が設定できる。ただし、/etc/security/limits.confの設定を変更後ログアウト/ログインを行うことで、この制約の度合いは変更できる。
例えば
ファイル名: /etc/security/limits.conf

[ユーザ名]          -       nice             -10

という設定を追加した場合、そのユーザのみ、19から-10の範囲でnice値が変更できるようになる。ユーザ名の部分は「@[グループ名]」としてグループ単位で設定することもできる。

nice値の指定

プロセスの起動時にnice値を指定する
プロセスを起動する際、実行するコマンド行の先頭に「nice -n [nice値]」を付けることにより、nice値が適用された状態で実行(起動)できる。nice値の既定値は10(「-n 10」と等価)*3だが、「10」を指定する場合でも(省略せず)「-n 10」としたほうが分かりやすい気がする。

(推奨する書式)
$ nice -n [nice値] [コマンド] ([コマンドへの引数...])
(おすすめしない書式)
$ nice -[nice値] [コマンド] ([コマンドへの引数...])

2つ目の書式では「-5」でnice値5、「--5」でnice値-5となり紛らわしいため、おすすめはできない。
なお、変更する権限のない値を指定すると

nice: cannot set niceness: 許可がありません

となる。

実行中のプロセスのnice値を変更する
実行中のプロセスに対してreniceコマンドを実行することにより、そのプロセスのnice値を変更できる。プロセスID以外にユーザ名やプロセスグループID*4による指定も行えるが、プロセスIDを使用することが多い。
新しいnice値は最初の引数にそのまま指定し、ハイフンなどは付けない。「5」ではnice値5、「-5」ではnice値-5となる。

$ renice [新しいnice値] -p [プロセスID]

変更に成功すると

[プロセスID]: 古い優先度は [古いnice値]、新たな優先度は [新しいnice値] です

と表示される。変更する権限のない値を指定すると

renice: [プロセスID]: setpriority: 許可がありません

となる。
下はプロセスIDを調べるための作業例。

(自分の権限で動作するプロセスとそのプロセスIDを一覧)
$ ps -U $(whoami) -o args:74,pid
(自分の権限で動作するプロセスとプロセスIDの一覧から絞り込む)
$ ps -U $(whoami) -o args:74,pid | grep "[文字列]"

下はプロセス名の一部の文字列を指定して、マッチする全てのプロセスのnice値を一括変更する。

$ for pid in $(pgrep [プロセス名の一部]); do renice [新しいnice値] -p ${pid}; done; unset pid

もちろん、プロセスIDはデスクトップ環境のシステムモニタ/タスクマネージャの類(GUIツール)から確認することもできる。

nice値の確認

psコマンド
psでは-oオプションで指定できるフォーマットの「nice」でnice値が得られる。

(現在のユーザの権限で実行している全プロセスのコマンド行とnice値の一覧)
$ ps -U $(whoami) -o args:76,nice
(上の一覧にプロセスIDを追加)
$ ps -U $(whoami) -o args:70,pid,nice

もちろん「| grep "[文字列]"」での絞り込みも可能。

topコマンド
topでは「NI」という項目にそのプロセスのnice値が表示される。

GUIツール
プロセスIDと同様、nice値もデスクトップ環境のシステムモニタ/タスクマネージャの類から確認できる。
(2015/1/14)manページのリンク先を修正

関連URL:

使用したバージョン:

  • coreutils (nice) 7.1
  • util-linux-ng (renice) 2.14.1
  • procps (ps/pgrep) 3.2.7

*1:範囲外の値を指定すると有効範囲内の「-20」や「19」という値になる

*2:英語ではnicenessと呼ぶ

*3:nice [コマンド] ([コマンドへの引数...])」の書式で実行した場合

*4:プロセスのグループ化された集まり(プロセスグループ)におけるリーダーのプロセスのプロセスIDで、プロセスグループの識別に使用する