qshowコマンド

pbsnodes -aSjqstat -ft の出力をいい感じに表示するコマンドです.

最新のビルド済みバイナリのダウンロード

$ wget https://github.com/k3kaimu/cluster-tools/releases/latest/download/qshow
$ chmod +x qshow

表示例

$ qshow
vnode   state     njobs  ncpus f/t  mem f/t      gpu       users
------  --------  -----  ---------  -----------  ---  ----------
xsnd00      free      5       3/28   50gb/192gb  2/2  c222222*21,   aa000* 4
xsnd01      free      6       2/28   30gb/192gb  2/2  c222222*21, b111111* 1,   aa000* 4
xsnd02      free      5      14/28  124gb/192gb  2/2  b111111* 1, d333333*10,   aa000* 3
xsnd03      free      2      26/28  160gb/192gb  2/2  b111111* 2
xsnd04      free      2      26/28  160gb/192gb  2/2  b111111* 2
xsnd05  job-busy      8       0/28   38gb/192gb  2/2  c222222*21,   aa000* 7
xsnd06  job-busy      8       0/28   38gb/192gb  2/2  c222222*21,   aa000* 7
xsnd07  job-busy      8       0/28   26gb/192gb  2/2  c222222*21, b111111* 1,   aa000* 6
xsnd08  job-busy      8       0/28   26gb/192gb  2/2  c222222*21, b111111* 1,   aa000* 6
xsnd09  job-busy      1       0/28    0gb/192gb  2/2  d333333*28
xsnd10  job-busy      8       0/28   38gb/192gb  2/2  c222222*21,   aa000* 7
xsnd11  job-busy      8       0/28   38gb/192gb  2/2  c222222*21,   aa000* 7
xsnd12  job-busy      8       0/28   38gb/192gb  2/2  c222222*21,   aa000* 7
xsnd13  job-busy      8       0/28   38gb/192gb  2/2  c222222*21,   aa000* 7
------  --------  -----  ---------  -----------  ---  ----------

Username    tJob  tCPU  tMem      rJob  rCPU  rMem    
----------  ----  ----  --------  ----  ----  --------
     aa000    65    65   264.0GB    65    65   264.0GB
   b111111     2     8   128.0GB     2     8   128.0GB
   c222222    22   462  2772.0GB    10   210  1260.0GB
   d333333     4    94   616.0GB     2    38   232.0GB
----------  ----  ----  --------  ----  ----  --------

Job ID      Username    S  tCPU  tMem      rMem      vMem      CPU(%)  CPU Time    Walltime  
----------  ----------  -  ----  --------  --------  --------  ------  ----------  ----------
     66615       aa000  R     1     8.0GB     0.1GB     0.7GB       4    00:00:36   167:26:58
     77357     b111111  R     4    64.0GB     0.1GB     2.2GB      75    00:00:09    25:41:00
     77359     b111111  R     4    64.0GB     0.1GB     2.7GB      75    00:00:10    25:18:10
     77421     d333333  R    28   192.0GB     0.1GB     1.7GB      98    00:00:11    19:51:55
     77425     d333333  R    10    40.0GB     0.1GB     2.5GB      81    00:00:12    19:14:55
     77608     d333333  Q    28   192.0GB         ?         ?       0  ----:--:--  ----:--:--
     77609     d333333  Q    28   192.0GB         ?         ?       0  ----:--:--  ----:--:--
  77628[2]     c222222  R    21   126.0GB     2.2GB     9.0GB    2040    08:05:01    00:24:22
  77628[3]     c222222  R    21   126.0GB     2.2GB     9.0GB    2017    08:02:37    00:24:17
  77628[4]     c222222  R    21   126.0GB     2.1GB     9.0GB    2045    08:09:49    00:24:22
  77629[0]     c222222  Q    21   126.0GB         ?         ?       0  ----:--:--  ----:--:--
  77629[1]     c222222  Q    21   126.0GB         ?         ?       0  ----:--:--  ----:--:--
  77629[2]     c222222  Q    21   126.0GB         ?         ?       0  ----:--:--  ----:--:--
  77629[3]     c222222  Q    21   126.0GB         ?         ?       0  ----:--:--  ----:--:--
  77629[4]     c222222  Q    21   126.0GB         ?         ?       0  ----:--:--  ----:--:--
----------  ----------  -  ----  --------  --------  --------  ------  ----------  ----------

オプション

  • -h, --help

ヘルプを表示します.

  • -n, --node

ノードの情報を表示します.

  • -u, --user

ユーザーの情報を表示します.

  • -j, --job

ジョブの情報を表示します.

  • -m, --mine

自身のジョブのみ表示します.

  • -c, --color

カラー表示を有効にします.

  • --noheader

vnode state njobs ncpus f/t mem f/t gpu usersや,その次の行のハイフンの表示を無くします. フォーマット指定と組み合わせることで,qshowの結果を他のシェルスクリプトやプログラムで処理する際の利便性が向上すると思われます.

--nodefmt

ノードの情報を表示する際のフォーマットを指定します.
デフォルトでは--nodefmt='%name:6s %state:-8s %njobs:5s %cpu:9s %mem:11s %gpu:3s %users:-(%(%7s*%2d%), %)'と等価です.
使用可能なカラムは次の通りです.

  • name:ノード名
  • state:そのノードの状態
  • njobs:そのノードで実行中のジョブの数
  • cpu:そのノードのCPUコア空き状況
  • mem:そのノードのメモリの空き状況
  • gpu:そのノードのGPUの空き状況
  • users:そのノードでジョブを実行しているユーザーのリスト

詳しくはフォーマット指定の書式を参照してください.

--userfmt

ユーザーの情報を表示する際のフォーマットを指定します.
デフォルトでは--userfmt='%user:-10s %tjob:4s %tcpu:4s %tmem:8s %rjob:4s %rcpu:4s %rmem:8s'と等価です.
使用可能なカラムは次の通りです.

  • user:ユーザー名
  • tjob:ユーザーの実行中かキュー待機中のジョブの数
  • tcpu:ユーザーの実行中かキュー待機中のジョブが消費する合計CPUコア数
  • tmem:ユーザーの実行中かキュー待機中のジョブが消費する合計メモリ量
  • rjob:ユーザーの実行中のジョブ数
  • rcpu:ユーザーの実行中のジョブが確保している合計CPUコア数
  • rmem:ユーザーの実行中のジョブが確保している合計メモリ量

詳しくはフォーマット指定の書式を参照してください.

--jobfmt

ジョブの情報を表示する際のフォーマットを指定します.
デフォルトでは--jobfmt='%id:-s %user:-s %queue:-6s %name:-s %S:1s %tcpu:4s %tmem:8s %rmem:8s %vmem:8s %#6(%cpup:5s%%%|CPU%%%) %cput:10s %walltime:10s %#-(%container:1s/%image:s%|Container%)'と等価です.
使用可能なカラムは次の通りです.

  • id:ジョブのID
  • user:ジョブを投入したユーザー
  • queue:投入されたキュー
  • name:ジョブ名
  • S:ジョブの状態(キュー待機の場合Q,実行中の場合R,終了済みの場合X
  • tcpu:ジョブが確保したCPUコア数
  • tmem:ジョブが確保したメモリ量
  • rmem:実際にジョブが消費しているメモリ量
  • vmem:実際にジョブが消費している仮想メモリ量
  • cpup:ジョブがどれだけCPU負荷をかけているか.最大はtcpu * 100の値
  • cput:ジョブが消費したCPU時間
  • walltime:ジョブの経過時間
  • container:Dockerの場合Docker,Singularityの場合Singularity
  • image:実行しているイメージの名前

詳しくはフォーマット指定の書式を参照してください.

フォーマット指定の書式

qshowではオプションの--nodefmt--userfmt--jobfmtを与えることで表示する情報のフォーマットを変えることができます. フォーマット指定文字列はC言語のように%から始まる記法になっています. より詳細には,%{column-name}:{fmt-spec}となっており,{column-name}はカラム名,{fmt-spec}-10sなどのフォーマット指定子です.

フォーマット指定子{fmt-spec}は基本的にはC言語のフォーマット指定子ですが,少し異なっています. フォーマット指定子{fmt-spec}{fmt-align}{fmt-width}{fmt-type}の三つの要素から構成されます.

  • {fmt-align} 文字列を右詰めするか(+),左詰めするか(-)を指定します. デフォルトでは右詰め(+)になっています.

  • {fmt-width} 出力される文字列の最大文字数.これ以上の文字列は切り落とされます. 指定されない場合,無制限に文字列を出力します.

  • {fmt-type}

    • s:すべての型で利用できます.基本的にはこれを用いると良いでしょう.
    • d:整数

例えばフォーマット指定子{fmt-spec}-10sのとき,文字列は最大10文字で切り捨てられ,10文字以下の文字列は左詰めされます.

たとえば,次の例では各ノードのノード名(6文字まで)と割り当てられているジョブの数(4文字まで)を表示します. また,二つのカラムの間には四つの半角スペースを挿入しています.

$ qshow -n --nodefmt='%name:6s    %njobs:4s'
vnode     njob
------    ----
xsnd00       4
xsnd01       3
xsnd02       4
xsnd03       1
xsnd04       1
xsnd05       8
xsnd06       8
xsnd07       8
xsnd08       7
xsnd09       1
xsnd10       7
xsnd11       7
xsnd12       7
xsnd13       7
------    ----

他のプログラムでqshowの出力を処理したい場合,--noheaderオプションを有効にしてカンマ区切りやスペース区切りで出力すると便利かもしれません.

$ qshow  --noheader -n --nodefmt='%name:s,%njobs:s'
xsnd00,0
xsnd01,1
xsnd02,1
xsnd03,1
xsnd04,1
xsnd05,7
xsnd06,7
xsnd07,7
xsnd08,7
xsnd09,1
xsnd10,4
xsnd11,0
xsnd12,0
xsnd13,0

--nodefmtにおけるusersは特殊です. 詳しくはD言語のstd.typecons.tuple.toStringのドキュメントを参照してください.

以下の例は,各ノードの名前とジョブを実行しているユーザーをカンマ区切りで表示します.

$ qshow  --noheader -n --nodefmt='%name:s,%users:(%(%s%),%)'
xsnd00,c222222,aa000
xsnd01,c222222,b111111,aa000
xsnd02,b111111,d333333,aa000
xsnd03,b111111
xsnd04,b111111
xsnd05,c222222,aa000
xsnd06,c222222,aa000
xsnd07,c222222,b111111,aa000
xsnd08,c222222,b111111,aa000
xsnd09,d333333
xsnd10,c222222,aa000
xsnd11,c222222,aa000
xsnd12,c222222,aa000
xsnd13,c222222,aa000

また,cpu*userと表示するには,%1$s%2$2sのように%<idx>$<fmt>とし,次のように指定します. このとき,<idx>1にはユーザー名が,<idx>2にはCPU数がそれぞれ対応します.

$ qshow  --noheader -n --nodefmt='%name:s,%users:(%(%2$2s*%1$s%),%)'
xsnd00,21*c222222, 4*aa000
xsnd01,21*c222222, 1*b111111, 4*aa000
xsnd02, 1*b111111,10*d333333, 3*aa000
xsnd03, 2*b111111
xsnd04, 2*b111111
xsnd05,21*c222222, 7*aa000
xsnd06,21*c222222, 7*aa000
xsnd07,21*c222222, 1*b111111, 6*aa000
xsnd08,21*c222222, 1*b111111, 6*aa000
xsnd09,28*d333333
xsnd10,21*c222222, 7*aa000
xsnd11,21*c222222, 7*aa000
xsnd12,21*c222222, 7*aa000
xsnd13,21*c222222, 7*aa000

複合カラムフォーマット(v1.5.0以降)

フォーマットにカラム名が指定されておらず,%#{fmt-align}{fmt-width}({fmt-nested}%|{fmt-column-name}%)のようになっているとき,{fmt-nested}{fmt-column-name}という名前の単一のカラムを形成するようになります. たとえば,ジョブ情報の出力において%#-15(%container:1s/%image:s%|Container%)というフォーマットは,コンテナランタイムの種類の1文字(%container:1s)とコンテナイメージ名(%image:s)を/で区切り出力したものが単一のカラムになります. また,カラムの値は15文字で切り捨てられ,そのカラムのヘッダーにはContainerと表示されます.

$ qshow -j --jobfmt='%#-15(%container:1s/%image:s%|Container%)'
Container      
---------------
S/imc.tut.ac.jp
D/prg-env:2019.
D/prg-env:2019.
D/prg-env:2019.
D/prg-env:2019.
D/prg-env:2019.
D/prg-env:2019.
D/prg-env:2019.
D/prg-env:2019.
D/prg-env:2019.
S/imc.tut.ac.jp
S/imc.tut.ac.jp
---------------

カラムに単位を付ける用途にも利用できます. 以下の例ではCPU利用率の末尾に%を付加しています.

bash-4.2$ qshow -j --jobfmt='%#(%cpup:4s %%%|CPU(%%)%)'
CPU(%)
------
   4 %
  98 %
  75 %
  98 %
  95 %
 150 %
  97 %
  96 %
  96 %
 150 %
2570 %
2581 %
------

ビルド

  1. 以下のページを参考にしてD言語のコンパイラをインストールします

    @outlandkarasu D言語環境構築 2019年版 - Qiita

  2. このリポジトリをクローンしてビルドするとqshowというバイナリができあがります

$ git clone https://github.com/k3kaimu/cluster-tools
$ cd cluster-tools
$ dub build --single qshow.d
$ ls
README.md  qshow  qshow.d