PBSProのテーブル構成が分かったので、ジョブ投入状況を
別テーブルに記録するようなTRIGGERを作ってみた。

実行中のジョブ情報は各種テーブルにあるのだが、ジョブ終了後消えてしまいます

本来なら商用品の PBS Control を導入すればできるようです

基本情報を取得する

まずは、投入したqueueの投入時間と終了時間を取得してみる。対象は「pbs.job」テーブル 終了時間はji_savetmの値としています
*「pbs.job」テーブルからエントリーが削除される際に、ログを残すのがいいのかもしれない. その場合はBeforeでdeleteの時にinsertすればいいかも

データ収集用のテーブル「public.job_hist」を作成します。

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
-
|
|
|
|
|
|
|
|
|
!
CREATE TABLE job_hist (
   ji_jobid  text NOT NULL,
   ji_state  int not null,
   ji_substate int not null,
   ji_svrflags int not null,
   ji_stime    bigint not null,
   ji_queue   text not null,
   ji_destin  text,
   ji_savetm  timestamp not null,
   ji_creattm timestamp not null
);

項目名は pbs.job の項目と同じです。
次に、トリガーの中身. トリガーが呼び出された際、実行されるプロシージャを用意します。

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
!
 
 
 
CREATE OR REPLACE FUNCTION qsub_history() RETURNS trigger AS $job_hist$
BEGIN
  IF    (TG_OP='INSERT') THEN
    INSERT into job_hist (ji_jobid, ji_state, ji_substate,ji_svrflags,ji_stime,ji_queue,ji_destin,ji_savetm,ji_creattm) values
         (new.ji_jobid, new.ji_state, new.ji_substate,new.ji_svrflags,new.ji_stime,new.ji_queue,new.ji_destin,new.ji_savetm,new.ji_creattm);
  ELSIF (TG_OP='UPDATE') THEN
    UPDATE job_hist set ji_state =new.ji_state,
                      ji_substate=new.ji_substate,
                      ji_svrflags=new.ji_svrflags,
                      ji_stime   =new.ji_stime,
                      ji_queue   =new.ji_queue,
                      ji_destin  =new.ji_destin,
                      ji_savetm=new.ji_savetm,
                      ji_creattm=new.ji_creattm
     where ji_jobid=OLD.ji_jobid;
  END IF;
  RETURN NULL;
END;
$job_hist$ LANGUAGE plpgsql;

次に、作ったプロシージャを呼び出すトリガー「job_hist」を「pbs.job」テーブルに対して作る。

すべて開くすべて閉じる
  1
  2
  3
 
 
 
CREATE TRIGGER job_hist
AFTER INSERT OR UPDATE on pbs.job
    FOR EACH ROW EXECUTE procedure  qsub_history();

これで、qsubが実行されるとそのjobIDと使ったqueue名、そして経過時間が記録されます。
pbs.job」のデータはジョブ終了後に消えてしまいます

付随情報も取りたい

上記はjobIDの生存期間とか、現在の状態、どのqueueで実行されたかが分かるが、詳細は不明。
詳細を得るには「pbs.job_attr」を観察する必要がある。
なので、この「pbs.job_attr」も監視するようにします。

まずデータ収集用のテーブル「public.job_hist」に追加フィールドを用意します

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ALTER TABLE job_hist
 ADD Job_Owner text,
 ADD Job_Name text,
 ADD Output_Path text,
 ADD Error_Path text,
 ADD Join_Path text,
 ADD ctime text,
 ADD etime text,
 ADD mtime text,
 ADD qtime text,
 ADD euser text,
 ADD egroup text,
 ADD comments text,
 ADD exec_host text,
 ADD queue text,
 ADD cput text,
 ADD cpupercent text,
 ADD mem text,
 ADD ncpus text,
 ADD vmem text,
 ADD walltime text;

次に「pbs.job_attr」からデータを拾うプロシージャ「qsub_history_attr()」を用意します
*すっごくエレガントではないSQL文. いずれ変更する予定

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
 
 
 
CREATE OR REPLACE FUNCTION qsub_history_attr() RETURNS trigger AS $job_hist$
DECLARE
   Job_Owner_ TEXT;
   Job_Name_  TEXT;
   Output_Path_ TEXT;
   Error_Path_ TEXT;
   Join_Path_ TEXT;
   ctime_ TEXT;
   etime_ TEXT;
   mtime_ TEXT;
   qtime_ TEXT;
   euser_ TEXT;
   egroup_ TEXT;
   comments_ TEXT;
   exec_host_ TEXT;
   queue_ TEXT;
   cput_ TEXT;
   cpupercent_ TEXT;
   mem_ TEXT;
   ncpus_ TEXT;
   vmem_ TEXT;
   walltime_ TEXT;
BEGIN
  IF    (TG_OP='INSERT') THEN
     SELECT min(case attr_name when 'Job_Owner' THEN attr_value END),
            min(case attr_name when 'Job_Name'  THEN attr_value END),
            min(case attr_name when 'Output_Path'  THEN attr_value END),
            min(case attr_name when 'Error_Path'  THEN attr_value END),
            min(case attr_name when 'Join_Path'  THEN attr_value END),
            min(case attr_name when 'ctime'  THEN attr_value END),
            min(case attr_name when 'etime'  THEN attr_value END),
            min(case attr_name when 'mtime'  THEN attr_value END),
            min(case attr_name when 'qtime'  THEN attr_value END),
            min(case attr_name when 'euser'  THEN attr_value END),
            min(case attr_name when 'egroup'  THEN attr_value END),
            min(case attr_name when 'comment'     THEN attr_value END),
            min(case attr_name when 'exec_host'  THEN attr_value END),
            min(case attr_name when 'queue'     THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='cput') THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='cpupercent') THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='mem') THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='ncpus') THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='vmem') THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='walltime') THEN attr_value END)
      INTO Job_Owner_,Job_Name_,Output_Path_,Error_Path_,Join_Path_,ctime_,etime_,mtime_,qtime_,euser_,egroup_,comments_,exec_host_,queue_,cput_,cpupercent_,mem_,ncpus_,vmem_,walltime_
      FROM pbs.job_attr where ji_jobid=new.ji_jobid GROUP BY ji_jobid;
      UPDATE job_hist SET ( Job_Owner,Job_Name,Output_Path,Error_Path,Join_Path,ctime,etime,mtime,qtime,euser,egroup,comments,exec_host,queue,cput,cpupercent,mem,ncpus,vmem,walltime ) =
                          (Job_Owner_,Job_Name_,Output_Path_,Error_Path_,Join_Path_,ctime_,etime_,mtime_,qtime_,euser_,egroup_,comments_,exec_host_,queue_,cput_,cpupercent_,mem_,ncpus_,vmem_,walltime_)
              where ji_jobid=new.ji_jobid;
  ELSIF (TG_OP='UPDATE') THEN
     SELECT min(case attr_name when 'Job_Owner' THEN attr_value END),
            min(case attr_name when 'Job_Name'  THEN attr_value END),
            min(case attr_name when 'Output_Path'  THEN attr_value END),
            min(case attr_name when 'Error_Path'  THEN attr_value END),
            min(case attr_name when 'Join_Path'  THEN attr_value END),
            min(case attr_name when 'ctime'  THEN attr_value END),
            min(case attr_name when 'etime'  THEN attr_value END),
            min(case attr_name when 'mtime'  THEN attr_value END),
            min(case attr_name when 'qtime'  THEN attr_value END),
            min(case attr_name when 'euser'  THEN attr_value END),
            min(case attr_name when 'egroup'  THEN attr_value END),
            min(case attr_name when 'comment'     THEN attr_value END),
            min(case attr_name when 'exec_host'  THEN attr_value END),
            min(case attr_name when 'queue'     THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='cput') THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='cpupercent') THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='mem') THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='ncpus') THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='vmem') THEN attr_value END),
            min(case when( attr_name = 'resources_used') and ( attr_resource ='walltime') THEN attr_value END)
      INTO Job_Owner_,Job_Name_,Output_Path_,Error_Path_,Join_Path_,ctime_,etime_,mtime_,qtime_,euser_,egroup_,comments_,exec_host_,queue_,cput_,cpupercent_,mem_,ncpus_,vmem_,walltime_
      FROM pbs.job_attr where ji_jobid=new.ji_jobid GROUP BY ji_jobid;
      UPDATE job_hist SET ( Job_Owner,Job_Name,Output_Path,Error_Path,Join_Path,ctime,etime,mtime,qtime,euser,egroup,comments,exec_host,queue,cput,cpupercent,mem,ncpus,vmem,walltime ) =
                          (Job_Owner_,Job_Name_,Output_Path_,Error_Path_,Join_Path_,ctime_,etime_,mtime_,qtime_,euser_,egroup_,comments_,exec_host_,queue_,cput_,cpupercent_,mem_,ncpus_,vmem_,walltime_)
              where ji_jobid=OLD.ji_jobid;
  END IF;
  RETURN NULL;
END;
$job_hist$ LANGUAGE plpgsql;

この関数「qsub_history_attr()」を使用するTriggerを作ります。

すべて開くすべて閉じる
  1
  2
  3
 
 
 
CREATE TRIGGER job_hist
AFTER INSERT OR UPDATE on pbs.job_attr
    FOR EACH ROW EXECUTE procedure  qsub_history_attr();

これでジョブが誰によって実行されたか、現実時間での計算時間(walltime)などがjob_histテーブルに追記されます


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2019-09-30 (月) 01:26:37 (22d)