hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

nice,reniceコマンドの使い方



1 nice,reniceコマンドとは?

nice,reniceコマンドは、NICE値(プロセス優先度)を変更するコマンドです。NICE値は、-20から19の値をとります。-20が最も高い優先度、19が最も低い優先度になります。プロセス起動時のNICE値は0です。それぞれ、以下のように使い分けます。

コマンド名 用途
nice プロセス起動時のNICE値を指定するときに使う
renice 実行中プロセスのNICE値を変更するときに使う

2 検証環境

CentOS版数は以下のとおりです。仮想マシンは最小構成で作成しました。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

3 プロセス起動時のNICE値を変更する方法

3.1 デフォルト値の確認

stressコマンドを実行します。stressコマンドを実行するとCPU使用率が100%近くになるのでご注意ください。なお、stressコマンドの使い方は、stressコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# stress -c 1 -q &
[1] 1647

psコマンドを使って、stressプロセスの状態を確認します。
PID=1647は親プロセス、PID=1648は子プロセスです。親プロセスは、do_wait関数を呼び出して、子プロセスの終了を待っています。do_wait関数は、waitシステムコールの延長で呼び出されるカーネル関数です。子プロセスは、ltraceコマンドで確認するとわかるのですが、rand関数を繰り返し実行しています。また、親プロセスはCPU3,子プロセスはCPU2で動作していることがわかります。そして、NICE値は、親プロセス/子プロセスともに、デフォルトの0であることがわかります。なお、psコマンドの使い方は、psコマンドの使い方を参照してください。

[root@server ~]# ps -C stress -o pid,ppid,args,ni,psr,wchan
   PID   PPID COMMAND                      NI PSR WCHAN
  1647   1521 stress -c 1 -q                0   3 do_wait
  1648   1647 stress -c 1 -q                0   2 -

なお、topコマンドでも、NICE値の確認ができます。stressの親プロセス、子プロセスのPIDを指定してtopコマンドを実行してみます。なお、topコマンドの使い方は、topコマンドの使い方 - hana_shinのLinux技術ブログを参照してくだい。

[root@server ~]# top -p 1647,1648

topコマンドの実行結果は、以下のとおりです。NICE値が0であることがわかります。
f:id:hana_shin:20220330193658p:plain

3.2 デフォルト値の変更方法(最高優先度)

プロセス起動時のNICE値を最高優先度(-20)に変更してみます。

[root@server ~]# nice -n -20 stress -q -c 1 &
[1] 1700

psコマンドでプロセスの状態を確認してみます。親プロセス、子プロセスともに、NICE値が-20で動作していることがわかります。

[root@server ~]# ps -C stress -o pid,ppid,args,ni,psr,wchan
   PID   PPID COMMAND                      NI PSR WCHAN
  1700   1521 stress -q -c 1              -20   3 do_wait
  1701   1700 stress -q -c 1              -20   1 -

stressコマンドを終了します。

[root@server ~]# pkill stress
[1]+  Terminated              nice -n -20 stress -q -c 1

3.3 デフォルト値の変更方法(最低優先度)

プロセス起動時のNICE値を最低優先度(19)に変更してみます。

[root@server ~]# nice -n 19 stress -q -c 1&
[1] 1693

psコマンドでプロセスの状態を確認してみます。親プロセス、子プロセスともに、NICE値が19で動作していることがわかります。

[root@server ~]# ps -C stress -o pid,ppid,args,ni,psr,wchan
   PID   PPID COMMAND                      NI PSR WCHAN
  1693   1521 stress -q -c 1               19   1 do_wait
  1694   1693 stress -q -c 1               19   2 -

stressコマンドを終了します。

[root@server ~]# pkill stress
[1]+  Terminated              nice -n 19 stress -q -c 1

4 実行中プロセスのNICE値を変更する方法

4.1 PID単位で変更する方法(-p)

PID(プロセスID)単位でNICE値を変更する方法について説明します。まず、stressコマンドを実行します。

[root@server ~]# stress -c 1 -q &
[1] 1704

psコマンドでプロセスの状態を確認してみます。親プロセス、子プロセスともに、NICE値が0であることがわかります。

[root@server ~]# ps -C stress -o pid,ppid,args,ni,psr,wchan
   PID   PPID COMMAND                      NI PSR WCHAN
  1704   1521 stress -c 1 -q                0   2 do_wait
  1705   1704 stress -c 1 -q                0   3 -

子プロセスのNICE値を最高優先度(-20)に変更します。

[root@server ~]# renice -n -20 -p 1705
1705 (process ID) old priority 0, new priority -20

psコマンドでプロセスの状態を確認してみます。子プロセスのNICE値が最高優先度(-20)に変更されたことがわかります。

[root@server ~]# ps -C stress -o pid,ppid,args,ni,psr,wchan
   PID   PPID COMMAND                      NI PSR WCHAN
  1704   1521 stress -c 1 -q                0   2 do_wait
  1705   1704 stress -c 1 -q              -20   1 -

次に、親プロセスのNICE値を最低優先度(19)に変更してみます。

[root@server ~]# renice -n 19 -p 1704
1704 (process ID) old priority 0, new priority 19

psコマンドでプロセスの状態を確認してみます。親プロセスのNICE値が最低優先度(19)に変更されたことがわかります。

[root@server ~]# ps -C stress -o pid,ppid,args,ni,psr,wchan
   PID   PPID COMMAND                      NI PSR WCHAN
  1704   1521 stress -c 1 -q               19   2 do_wait
  1705   1704 stress -c 1 -q              -20   3 -

stressコマンドを終了します。

[root@server ~]# pkill stress
[1]+  Terminated              stress -c 1 -q

4.2 PGID単位で変更する方法(-g)

stressコマンドを実行します。

[root@server ~]# stress -c 1 -q &
[1] 1716

psコマンドでプロセスの状態を確認してみます。stressのPGIDは1716、NICE値は0であることがわかります。

[root@server ~]# ps -C stress -o pid,ppid,pgid,args,ni,psr,wchan
   PID   PPID   PGID COMMAND                      NI PSR WCHAN
  1716   1521   1716 stress -c 1 -q                0   0 do_wait
  1717   1716   1716 stress -c 1 -q                0   1 -

stressの親プロセス/子プロセスともにNICE値を-10に変更してみます。

[root@server ~]# renice -n -10 -g 1716
1716 (process group ID) old priority 0, new priority -10

stressの親プロセス/子プロセスともにNICE値が-10に変更されたことがわかります。

[root@server ~]# ps -C stress -o pid,ppid,pgid,args,ni,psr,wchan
   PID   PPID   PGID COMMAND                      NI PSR WCHAN
  1716   1521   1716 stress -c 1 -q              -10   0 do_wait
  1717   1716   1716 stress -c 1 -q              -10   1 -

stressコマンドを終了します。

[root@server ~]# pkill stress
[1]+  Terminated              stress -c 1 -q

4.3 ユーザ名単位で変更する方法(-u)

ここでは、stressではなくhttpdを使って確認してみます。psコマンドを実行すると、親プロセスのユーザ名はroot,子プロセスのユーザ名はapacheであることがわかります。

[root@server ~]# ps -C httpd -o pid,ppid,user,args,ni,psr,wchan
   PID   PPID USER     COMMAND                      NI PSR WCHAN
  1756      1 root     /usr/sbin/httpd -DFOREGROUN   0   1 poll_schedule_timeout
  1757   1756 apache   /usr/sbin/httpd -DFOREGROUN   0   3 inet_csk_accept
  1758   1756 apache   /usr/sbin/httpd -DFOREGROUN   0   2 inet_csk_accept
  1759   1756 apache   /usr/sbin/httpd -DFOREGROUN   0   3 inet_csk_accept
  1760   1756 apache   /usr/sbin/httpd -DFOREGROUN   0   2 inet_csk_accept
  1761   1756 apache   /usr/sbin/httpd -DFOREGROUN   0   1 inet_csk_accept

ユーザ名がapacheのプロセスのNICE値を5に変更してみます。

[root@server ~]# renice -n 5 -u apache
48 (user ID) old priority 0, new priority 5

ユーザ名がapacheのプロセスのNICE値が5に変更されたことがわかります。

[root@server ~]# ps -C httpd -o pid,ppid,user,args,ni,psr,wchan
   PID   PPID USER     COMMAND                      NI PSR WCHAN
  1756      1 root     /usr/sbin/httpd -DFOREGROUN   0   1 poll_schedule_timeout
  1757   1756 apache   /usr/sbin/httpd -DFOREGROUN   5   3 inet_csk_accept
  1758   1756 apache   /usr/sbin/httpd -DFOREGROUN   5   2 inet_csk_accept
  1759   1756 apache   /usr/sbin/httpd -DFOREGROUN   5   3 inet_csk_accept
  1760   1756 apache   /usr/sbin/httpd -DFOREGROUN   5   2 inet_csk_accept
  1761   1756 apache   /usr/sbin/httpd -DFOREGROUN   5   1 inet_csk_accept

親プロセス、子プロセスは、次のカーネル関数を呼び出してI/O完了待ちの状態です。
・親プロセス:poll_schedule_timeout(poll/selectシステムコールの延長で呼ばれる)
・子プロセス:inet_csk_accept(acceptシステムコールの延長で呼ばれる)

4.4 topコマンドを使う方法

topコマンドを使う方法は以下に移行しました。
topコマンドの使い方 - hana_shinのLinux技術ブログ