Hatena::ブログ(Diary)

bobchinの日記 このページをアンテナに追加 RSSフィード

2009年09月24日(木)

[][][]Hack 101. Renice コマンド 09:00 Hack 101. Renice コマンド - bobchinの日記 を含むブックマーク

renice は実行中プロセススケジューリングの優先順位を変更します。

実行中プロセスの優先順位を低くするには?(nice 値を増やす)

以下の例では、存在するシェルスクリプトが nice 値 10 で実行中です。(ps の出力の 6 番目のカラム

$ ps axl | grep nice-test

0 509 13245 13216 30 10 5244 968 wait SN pts/1 0:00 /bin/bash ./nice-test.sh

nice 値を増やす(優先順位を下げる)ために、以下に示すように renice コマンドを実行します。

$ renice 16 -p 13245

13245: old priority 10, new priority 16

$ ps axl | grep nice-test

0 509 13245 13216 36 16 5244 968 wait SN pts/1 0:00 /bin/bash ./nice-test.sh

[Note: nice-test.sh (PID 13245) の 6 番目のカラムは nice 値が 16 になっています]

実行中プロセスの優先順位を高くするには?(nice 値を減らす)

以下に示すように、存在するシェルスクリプトが nice 値 10 で実行中です。(ps の出力の 6 番目のカラム

$ ps axl | grep nice-test

0 509 13254 13216 30 10 4412 968 wait SN pts/1 0:00 /bin/bash ./nice-test.sh

優先順位を上げるために、以下に示すように より小さい nice 値を指定します。

しかし、root だけが実行中プロセスの優先順位を上げることができます。

root 以外のユーザの場合は次のようなエラーメッセージが表示されます。

$ renice 5 -p 13254

renice: 13254: setpriority: Permission denied
Login as root to increase the priority of a running process

$ su -

# renice 5 -p 13254
13254: old priority 10, new priority 5

# ps axl | grep nice-test

0 509 13254 13216 25 5 4412 968 wait SN pts/1 0:00 /bin/bash ./nice-test.sh
[Note: 6番目のカラムは nice 値がより小さい 5 を示しています(優先順位が上がった)]

takagimasahirotakagimasahiro 2009/09/24 12:32 本文をテキストとしてコピーできるPDFならまだましだけど、できないやつだと相当つらいですねぇ……。

2009年09月23日(水)

[][][]Hack 100. Nice コマンド 16:17 Hack 100. Nice コマンド - bobchinの日記 を含むブックマーク

カーネルは、nice 値に基づいてプロセスにどのくらいプロセッサ時間が必要かを決定します。

有効な nice 値の範囲は -20 〜 20 です。

nice 値が -20 のプロセスは、優先順位が高くなります。

nice 値が 20 のプロセスは、優先順位が低くなります。


ps axl を使用して、以下に示すように実行中のプロセスすべての nice 値を表示します。

# ps axl 

F  UID    PID  PPID  PRI  NI    VSZ    RSS  WCHAN   STAT TTY TIME COMMAND
4    0      1     0  16    0   2172    552  -       S      ? 0:17 init [5]
1    0      3     1  34   19      0      0  ksofti  SN     ? 3:18 [ksoftirqd/0]
1    0     10     1   5  -10      0      0  worker  S<     ? 0:01 [events/0]
4    0   5145     1  25   10  32124  18592  -       SNs    ? 0:08 /usr/bin/python /usr/bin/rhn-applet-gui --sm-client-id default4
4    0   5147  5142  16    0   3528    604  -       S      ? 0:00 /sbin/pam_timestamp_check -d root
1  503  17552  4180  16    0  14208   3920  -       S      ? 0:01 /home/www/apache2/bin/httpd -f /home/www/apache2/conf/httpd.conf -k start

シェルスクリプトの優先順位を低くするには?(nice 値を大きくする)

以下の例では、nice-test.sh スクリプトをバックグランドで実行したときに、

nice 値は 0 になっています。

$ ./nice-test.sh &

[3] 13009

$ ps axl | grep nice-test

0 509 13009 12863 17 0 4652 972 wait S pts/1 0:00 /bin/bash ./nice-test.sh

[Note: 値が 0 である6番目のカラムが nice 値です]

では、以下に示すように nice 値を変えて同じシェルスクリプトを実行させましょう。

$ nice -10 ./nice-test.sh &

[1] 13016

$ ps axl | grep nice-test

0 509 13016 12863 30 10 4236 968 wait SN pts/1 0:00 /bin/bash ./nice-test.sh

[Note: 値が 0 である6番目のカラムがシェルスクリプトの nice 値です]

シェルスクリプトの優先順位を高くするには?(nice 値を低くする)

以下の例では、nice-test.sh スクリプトに nice 値 -10 を割り当てています。

$ nice --10 ./nice-test.sh &

[1] 13021

$ nice: cannot set priority: Permission denied

Note: root ユーザしか負の nice 値を設定できません。

root としてログインして同じことをしてみてください。

以下では nice コマンド引数 10 の前に2つのハイフンがあることに注意してください。

# nice --10 ./nice-test.sh &

[1] 13060 

# ps axl | grep nice-test

4 0 13060 13024 10 -10 5388 964 wait S< pts/1 0:00 /bin/bash ./nice-test.sh

[Note: 値が -10 である6番目のカラムがシェルスクリプトの nice 値です]

2009年09月17日(木)

[][][]Hack 99. Sysctl コマンド 16:37 Hack 99. Sysctl コマンド - bobchinの日記 を含むブックマーク

sysctl コマンドを使用して直接 Linux カーネルパラメータを変更できます。

sysctl は実行中に Linux カーネルパラメータを設定するのに役立ちます。

# sysctl -a

dev.cdrom.autoclose = 1
fs.quota.writes = 0
kernel.ctrl-alt-del = 0
kernel.domainname = (none)
kernel.exec-shield = 1
net.core.somaxconn = 128
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_wmem = 4096 16384 131072
net.ipv6.route.mtu_expires = 600
sunrpc.udp_slot_table_entries = 16
vm.block_dump = 0

変更を永続的にするには /etc/sysctl.conf 内のカーネルパラメータを変更してください。

/etc/sysctl.conf 内のカーネルパラメータを変更後、

変更を反映するために syctl -p を実行します。

再起動後も変更が保持されるでしょう。

# vi /etc/sysctl.conf
# sysctl -p

一時的にカーネルパラメータを変更するには

一時的にカーネルパラメータを変更するには、次のコマンドを実行します。

再起動後に変更内容は失われることに注意してください。

# sysctl -w {variable-name=value}