Armadilloフォーラム

スクリプト内で実行中のプロセス優先度を変更したい

funayama

2015年2月28日 14時47分

お世話になっております。

実行中にプロセス優先度を変更する場合、
reniceコマンドを使用できますでしょうか。

また、実際に
renice +10
でプロセス優先度を下げておりますが、
実際に下がっていないような気がしています。
psコマンドでは優先度の確認ができないようです。
確認する方法をご教授下さい。
よろしくお願いいたします。

コメント

y.nakamura

2015年2月28日 15時42分

中村です。

> renice +10
> でプロセス優先度を下げておりますが、
> 実際に下がっていないような気がしています。
> psコマンドでは優先度の確認ができないようです。
> 確認する方法をご教授下さい。

Armadilloのpsやtopでは確認できないみたいです。
/proc/[pid]statで表示してくれます。

http://linuxjm.sourceforge.jp/html/LDP_man-pages/man5/proc.5.html
の/proc/[pid]/statの説明の中の
(18) priority %ld

(19) nice %ld

実際にA420でやってみると...
(表示のコピペで80桁で改行を入れてます)

[root@armadillo420-0 (ttymxc1) ~]# ps | grep inet
  740 root        632 S < inetd
 1425 root        576 S   grep inet
 
[root@armadillo420-0 (ttyp0) ~]# cat /proc/740/stat
740 (busybox) S 1 740 740 0 -1 4194624 174 0 0 0 1 0 0 0 20 0 1 0 1297 4382720 1
58 4294967295 32768 704312 3196399296 3196398372 1075607924 0 0 4096 90115 32219
25080 0 0 17 0 0 0 0 0 0
 
[root@armadillo420-0 (ttymxc1) ~]# renice +10 740
740: old priority 0, new priority 10
 
[root@armadillo420-0 (ttyp0) ~]# cat /proc/740/stat
740 (busybox) S 1 740 740 0 -1 4194624 174 0 0 0 1 0 0 0 30 10 1 0 1297 4382720 
158 4294967295 32768 704312 3196399296 3196398372 1075607924 0 0 4096 90115 3221
925080 0 0 17 0 0 0 0 0 0
 
[root@armadillo420-0 (ttymxc1) ~]# renice -10 740
740: old priority 10, new priority -10
 
[root@armadillo420-0 (ttyp0) ~]# cat /proc/740/stat
740 (busybox) S 1 740 740 0 -1 4194624 174 0 0 0 1 0 0 0 10 -10 1 0 1297 4382720
 158 4294967295 32768 704312 3196399296 3196398372 1075607924 0 0 4096 90115 322
1925080 0 0 17 0 0 0 0 0 0

右の方にある"1297"の3個左がnice値のようです。

--
なかむら

funayama

2015年3月5日 23時59分

中村さん

お世話さまです。
いつも丁寧に説明して頂けるので助かります。
ありがとうございました。

追加で教えて頂きたいことがあります。
コマンドによってプロセスのnice値を変更できないものはありますか。
具体的に、ftp,find,及びUserProgramでは問題なく変更できますか。
UserProgramが起動されたらftp,findの優先レベルを下げたいのですが...。
どうもうまく確認できません。
ご教授下さい。
よろしくお願いいたします。

y.nakamura

2015年3月6日 3時11分

中村です。

> コマンドによってプロセスのnice値を変更できないものはありますか。
> 具体的に、ftp,find,及びUserProgramでは問題なく変更できますか。
> UserProgramが起動されたらftp,findの優先レベルを下げたいのですが...。
> どうもうまく確認できません。

ftpはポート21に接続があったときに、その都度、inetdから起動されます。
ですのでftpの優先順位を下げようとするなら、inetdの方を変更すれば
いいのではないでしょうか?
nice値は親プロセスの値を継承することになってますので。

findは・・・・シェルスクリプトから何かしたいときに起動されるのですよね?
UserProgramが起動しているときにあとからfindを起動するなら、
niceコマンドでnice値を指定してfindを起動するようにすれば
いいのではないでしょうか?

と、ここまで書いて、A400にniceあったかな?と試してみたら、
not foundと言われてしまいました。

ftpとinetdの関係と同じように、findを使っているプログラム(
シェルスクリプトかな?)のnice値を変えてしまえば、そこから
起動するfindのnice値もかわるのでは?

UserProgramが起動する前から動いているfindがあって、
(何を探すのかわかりませんけど、そんなに長い時間ずっと
動いているfindがいるのでしょうか?)、それのnice値を
変えたいなら、やっぱりreniceコマンドだと思いますよ。

なんかピント外れな返事を書いているかもしれません。
だったら申し訳ないです。

--
なかむら

funayama

2015年3月7日 15時34分

中村さん

お世話様です。
コメントありがとうございます。

> findは・・・・シェルスクリプトから何かしたいときに起動されるのですよね?
> UserProgramが起動しているときにあとからfindを起動するなら、
> niceコマンドでnice値を指定してfindを起動するようにすれば
> いいのではないでしょうか?
まさにこの場合に当てはまります。
現在、inetdでは修正が入っていません。
UserProgram起動後、シェルの方でfindが起動され、
UserProgramがこれまでに生成したUSBメモリ内の
画像ファイル(数万個)を検索しに行きます。
その後で画像があればftpでサーバーに転送します。

ここで問題となっているのは、ftpでは問題ないのですが、
findが起動されるとUserProgramの動きがとたんに
遅くなってしまいます。

reniceコマンドでfind実行前にnice値を下げるように
設定していますが(renice +10 $$)ftpしか有効に
ならないようなのです。
nice値はfindも+10に下げられているようなのですが...。
どこに問題があるのでしょうか。

ご教授下さい。
よろしくお願いいたします。

y.nakamura

2015年3月7日 18時34分

中村です。

だいたいの状況は理解できました。
前の投稿でftpをサーバ側と思い込んで書いていましたが、
クライアント側だったのですね。すみません。

> reniceコマンドでfind実行前にnice値を下げるように
> 設定していますが(renice +10 $$)ftpしか有効に
> ならないようなのです。

シェル自身(上の引用の$$がそういうことですよね)の優先順位を変えて
findを実行したときのfindのnice値を調べてみましたが、試した範囲では
ちゃんと変わっていました。

次のようにして調べました。
毎回pidを調べて/proc/[pid]/statを表示させ、nice値の値を
確認するのが面倒なので、次のスクリプトを用意。
これを"a"とします。
(findコマンドが2つ以上あっても大丈夫なようにしてあります)

#!/bin/sh
 
pids=`ps | grep find | grep -v grep | awk '{print $1}'`
if [ "$pids" = "" ]; then
  echo "find command not found."
  exit
fi
 
for pid in $pids
do
  cmdline=`strings -n 1 /proc/$pid/cmdline`
  nice=`awk '{print $19}' /proc/$pid/stat`
  echo pid=$pid nice=$nice cmdline=[$cmdline]
done

findは、時間がかかる"/"からの表示にします。

端末を2つ用意し、一方の端末で
# find /

この実行が終わらないうちに別の端末で
# /a
pid=4462 nice=0 cmdline=[find /]

findを実行した端末で(前のfindが終わったあと)
# renice 10 $$
1364: old priority 0, new priority 10
# find /

別の端末で
# ./a
pid=4481 nice=10 cmdline=[find /]

このように、findのnice値が10に代わっています。

--
なかむら

funayama

2015年3月12日 6時49分

中村さん

お世話様です。
ご教授ありがとうございました。
findのnice値は10になっていることが確認できました。
遅くなる原因については趣旨が変わってしまいますので
改めて登録させて頂きます。
ありがとうございました。