#!/bin/csh -f setenv GAUSS_EXEDIR /apl/g94 #setenv GAUSS_SCRDIR /work1 #setenv GAUSS_SCRDIR /work2 #setenv GAUSS_SCRDIR /work3 setenv GAUSS_SCRDIR /work4 # setenv GAUSS_SCRDIR1 /work1 setenv GAUSS_SCRDIR2 /work2 setenv GAUSS_SCRDIR3 /work3 setenv GAUSS_SCRDIR4 /work4 # set IN = ts.mp2.6-31Gdd set DAT = gausWork # set DATA = $HOME/$DAT set IN = $DATA/$IN set OUT = $IN.out set CT = `date` set JID = `getjid` echo Gaussian JOB$JID $CT $$ started | memo # cd $DATA touch $OUT if(-e $OUT) rm -f $OUT # (/bin/time /bin/mpa -core 0 $GAUSS_EXEDIR/g94 < $IN )\\ >& $OUT # set GPIDS=`grep PID= $OUT | cut -d= -f3 | tr -d '.'` foreach GPID($GPIDS) set CHKFile=$GAUSS_SCRDIR/g94-$GPID.chk set INTFile=$GAUSS_SCRDIR/g94-$GPID.int set RWFile=$GAUSS_SCRDIR/g94-$GPID.rwf set D2EFile=$GAUSS_SCRDIR/g94-$GPID.d2e set SCRFile=$GAUSS_SCRDIR/g94-$GPID.scr set CHKFile1=$GAUSS_SCRDIR1/g94-$GPID.chk set INTFile1=$GAUSS_SCRDIR1/g94-$GPID.int set RWFile1=$GAUSS_SCRDIR1/g94-$GPID.rwf set D2EFile1=$GAUSS_SCRDIR1/g94-$GPID.d2e set SCRFile1=$GAUSS_SCRDIR1/g94-$GPID.scr . . . if(-e $CHKFile) rm -f $CHKFile if(-e $INTFile) rm -f $INTFile if(-e $RWFile) rm -f $RWFile if(-e $D2EFile) rm -f $D2EFile if(-e $SCRFile) rm -f $SCRFile if(-e $CHKFile1) rm -f $CHKFile1 if(-e $INTFile1) rm -f $INTFile1 if(-e $RWFile1) rm -f $RWFile1 if(-e $D2EFile1) rm -f $D2EFile1 if(-e $SCRFile1) rm -f $SCRFile1 . . . end set CT = `date` echo Gaussian JOB$JID $CT $$ terminated | memo # END OF GAUSSIAN SCRIPT
このスクリプトは環境変数の初期化後GAUSSIANプロセスを実行し、 GAUSSIANプロセス終了後に作業ファイルの残りを削除して終了する ようにコーディングされている。 このスクリプトにはecho文部分にgetjidとmemoという簡単な記録用 スクリプトが含ませており、NQSによって実行されたGAUSSIAN Jobの 利用状況が把握できる(利用者IDやJobの正常・異常終了の記録と取 っている)。その記録からTable 1 に示すような結果が得られた。この表 から、明らかに1995年5月から1996年7月の間に約16 %のGAUSSIAN Jobが異常終了していることが判る(GAUSSIAN Jobは正常に終了した 場合は作業ファイルを残さないが、実行中の全てのプロセスに同時 SIGKILLを発行すると、作業ファイルを残したまま終了する。この場 合をGAUSSIANが異常終了したと定義する)。GAUSSIANの異常終了時の 巨大な残留ファイルは、システム運用上さまざまな悪影響を及ぼす。 この問題を解決するために下記のようなfindコマンドで深夜に、作 成されてから一週間経過した日付を持つファイルやディレクトリを 削除するコマンドを時限式で発行するようにした。同時に多くの GAUSSIAN Jobが投入されるのでなければ、この方法は有効であると 考えたが、
0 3 * * * find /work1 -mtime +7 -name "*" -exec rm\\ -rf {} \; 15 3 * * * find /work2 -mtime +7 -name "*" -exec rm\\ -rf {} \; 30 3 * * * find /work3 -mtime +7 -name "*" -exec rm\\ -rf {} \; 45 3 * * * find /work4 -mtime +7 -name "*" -exec rm\\ -rf {} \;
これはGAUSSIAN Jobが投入される頻度が週2,3本であれば、恐らく有
効であると考えられたが、GAUSSIAN Jobは続けて投入されている場
合が多く、期待するところの効果は得られなかった。
#!/usr/local/bin/perl $dir = "/usr/adm/limit"; # Define queue names for batch queues $a = "A"; # $b = "B"; # 2.6 hours $c = "C"; # 24 hours $d = "D"; # unlimited $x = "X"; # unlimited # Define cpu limits for batch jobs $limit{$a} = 480; # 'A' queue $limit{$b} = 9600; # 'B' queue $limit{$c} = 86400; # 'C' queue $limit{$d} = 0; # 'D' queue $limit{$x} = 0; # UNLIMITED QUEUE # Unbuffer output $| = 1; # Loop through all jobs open(QSTAT,"/usr/convex/bin/qstat -a| /bin/grep\\ RUNNING | /bin/grep -v type= |"); while() { s/^ *//; # Extract info from QSTAT output ($x,$req0,$reqid,$uname,$pri,$x,$x) = split; if ($pri eq 'RUNNING') { $uname = $reqid; $reqid = $req0; } $secs = 0; $qname = "NULL"; open(QPS,"/usr/convex/bin/qps -r $reqid |\\ /bin/grep $reqid|"); while( ) { s/^ *//; # Extract info from QPS output ($qname,$x,$x,$x,$time,$x,$x) = split; # Convert time into seconds @tim = split(':', $time); $secs = $secs + 60 * $tim[0] + $tim[1]; } close(QPS); if (($secs > 0) && ($qname ne 'NULL') &&\\ ($limit{$qname} != 0)) { if ($secs > $limit{$qname}) { system("/usr/convex/bin/qps -r $reqid | \\ /bin/cat $dir/CarbonCopy $dir/nqslimit.hd.msg\\ - $dir/nqslimit.tl.msg | \\ /usr/bin/mailx \\ -s \"CPU TIME LIMIT [$limit{$qname} secs]\\ EXCEEDED - $reqid\" \\ $uname"); system("/usr/convex/bin/qdel -15 $reqid"); system("/usr/convex/bin/qps -r $reqid|grep \\ $reqid > /dev/null 2>&1"); if ($?>>8 == 0) { system("/usr/convex/bin/qdel -k $reqid"); } } } } close(QSTAT);
このスクリプトは次に述べるような構造をしている。NQSのコマンド群
の中のqstatで全JobのJobプロセスIDを取得し、次にqpsコマンドでNQS
によって実行されているプロセスのCPU使用時間を取得して、超過分プ
ロセスがあればqstatで取得したJobプロセス番号でqdelコマンドを発
行し、その旨を該当利用者にE-mailで通知するというものである。こ
のスクリプトは時限式で運用されている。しかしながらqdelコマンド
を用いているため、これが原因でGAUSSIAN Job正常に終了せず、異常
終了する可能性がある。これを確かめるために、CPU時間超過した
GAUSSIAN Jobを故意に流したままにし、上述のスクリプトを手動で実
行したところ、CPU時間超過Jobプロセスは全て削除されたものの、や
はり作業ファイルが残り、GAUSSIAN Jobは正常終了しないことが明ら
かになった。この理由からGAUSSIAN Jobはqdelで削除するのではなく、
別の方法を採らなければならないことがわかった。
幸いにも当大学はGAUSSIANをソースファイル形式で購入しているので、
プログラムの動作を直接追跡できる。その追跡調査の結果、一つのキ
ープロセスを殺すと、GAUSSIANの最後に起動されるプロセスが作業フ
ァイル削除などの後処理を行うことが判明したので、このキープロセ
スだけを上述のスクリプトに優先的に削除させるようにすれば、上述
の問題が解決できると考えられる。そこでこの点に注目してCPU時間
超過監視スクリプトを修正を行い、一ヵ月間運用を続けたところ、下
記のTable 2および3のような結果が得られた(Table 2とTable 3は、それぞれ上述の
スクリプトの修正前と修正後の、GAUSSIAN Jobのログの結果である)。