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であることがわかります。
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技術ブログ