背景/目的
HPCクラスタ上のジョブ稼働状況を確認しようとする際、その都度クラスタにSSH接続して、ジョブの稼働状況を確認しようとすることは多々あります。もちろん、それが手間だと感じないのであればよいのですが、多くの方々はもっと楽にジョブの稼働状況を把握したいのではないでしょうか。
上記はHPC利用者の関心事だと思いますが、同様にHPCシステム管理者はどうでしょうか。運用の一環として計算ノードの稼働状況や各ノードのリソース使用状況をモニタリングしたくなる瞬間があるのではないでしょうか。
このような需要から、もっと簡単にジョブや計算ノードの状況を参照できるようにしたいです。そのため本記事では、Webブラウザから参照できる「3分で出来る簡易式HPCジョブ実行状況参照サイト」を作る手順をまとめたいと思い、記事を書きました。自身もよく使う手法でありながら、毎回書き方や手順を忘れてしまうのでメモとして残したい意図もあります。
ゴールイメージ
簡易的でよいので下記3点があれば最低限、ポータルサイト的な機能を果たせるかと思います。
- クラスタ内の各計算ノードの稼働状況とリソース使用状況を確認できること
- 投入されているジョブのキューイング状況が確認できること
- 上記2点のデータがいつ時点の結果かを把握できること
上記だけでは参照したい情報が不足していると感じられる場合、HPCクラスタの利用者の要望に応じて表示できるデータを追記できる柔軟性/余白があれば特に問題はないものと判断しました。
動作確認環境
今回は下記の環境で各種プログラムを実行しています。サーバそれ自体はAWS上にEC2を立てて動作検証を行いました。
- OS: Ubuntu 24.04.1 LTS
- Docker version: 26.1.3 (Apache起動時に利用)
- Open PBS: 23.06.06 (ジョブスケジューラに利用)
- Apache: 2.4.63
上記の環境で諸々の動作を確認したため、今回はPBS系のジョブ/計算ノード確認コマンドを利用しています。Slurmなど別のジョブスケジューラを使う場合は、類するコマンドに入れ替えて以降のスクリプトを使えば同様のことが実現できるものと理解しています。
また、今回ApacheをDocker経由で使っていますが、ホストマシンに直接Webサーバをインストールして実行しても差し支えないです。その場合はDockerを使ったコマンドを無視して、/var/www/配下のディレクトリなどにhtmlファイルをコピーしてください。
実行手順
以下、Webブラウザから簡易的にジョブの実行状況を参照できるようにするための作業手順を記載します。
■ ジョブの実行状況をhtmlファイル形式で出力する:
以下のようなシェルスクリプトを作成し、投入したジョブや計算ノードの状況をhtmlファイルに出力します。
#!/bin/bash
cat <<EOT > /home/ubuntu/JobExecution.html
<!DOCTYPE html>
<HTML lang="ja">
<meta charset="UTF-8">
<HEAD>
<TITLE>Job Status</TITLE>
</HEAD>
<BODY>
■ 取得時刻:<pre>`date`</pre>
<BR>
<BR>
■ 計算ノードとジョブの割り当て状況は以下の通りです
<BR>
<pre>
`pbsnodes -aSj`
</pre>
<BR>
<BR>
■ ジョブの実行状況は以下の通りです
<pre>
`qstat -a`
</pre>
</BODY>
</HTML>
■ Docker を使ってhttpdを起動する:
今更な気もしますが下記で、Apacheのdocker imageをpullしコンテナを起動してください。
実行ユーザをdocker groupに加えていない場合、permission deniedが出力されると思うので、sudoで実行するなり、dockerグループへ実行ユーザを追加するなりしてください。
### Imageのpull操作
docker image pull httpd
### Containerを起動する。ホストマシンの80番以外を使いたい場合は左側の80を別の空いているポート番号へ入れ替えてください。
docker run -d -p 80:80 httpd
ここまで出来たら生成したhtmlファイルをdockerコンテナ内部にコピーしてください。
### Container ID「c7efcdee6b06」は各自docker psコマンド等で確認してください。
docker cp JobExecution.html c7efcdee6b06:/usr/local/apache2/htdocs/
ひとまず、ここまで完了すれば動作確認ができます。ここで区切って、まずは想定通りにブラウザ上から当該サーバへアクセスし、ジョブや計算ノードの出力結果が参照できることを確認してください。
出力結果

上記のような出力が得られればOKです。ただし、このままではhtmlファイルが更新されないため、ジョブの実行状況画面はずっと変わらないままになってしまいます。そこで、最後に出力結果を更新できるよう作業を行います。
ジョブの実行状況更新
ここで実施すべきことは2点あり、1つが先ほど示したスクリプト「JobExecutionStatus.sh」への一部追記です。もう1点がcrontabへの記述となります。
■ JobExecutionStatus.shへの追記
スクリプトの末尾に下記のハイライト部分を追記して、スクリプト内部でhtmlファイルの生成とコンテナ内部へのhtmlファイルコピーを実施してしまいます。
(自分で書いておいてアレですが、Container IDを直打ちするのはスクリプトの可読性を下げてしまう恐れがあるので、複数人で維持管理を行う場合は、コンテナ起動時にコンテナに名前を付けてあげることを推奨します。。)
#!/bin/bash
cat <<EOT > /home/ubuntu/JobExecution.html
<!DOCTYPE html>
<HTML lang="ja">
<meta charset="UTF-8">
<HEAD>
<TITLE>Job Status</TITLE>
</HEAD>
<BODY>
■取得時刻:<pre>`date`</pre>
<BR>
<BR>
■ 計算ノードとジョブの割り当て状況は以下の通りです
<BR>
<pre>
`pbsnodes -aSj`
</pre>
<BR>
<BR>
■ ジョブの実行状況は以下の通りです
<pre>
`qstat -a`
</pre>
</BODY>
</HTML>
EOT
### Container IDは各自で書き換えてください
docker cp JobExecution.html c7efcdee6b06:/usr/local/apache2/htdocs/
■ crontabの記述
PBS系のコマンドをcrontabで動かそうとしても、PATHが通っていなくてコマンドが実行できない状況が起こるためPATHの記述。そして、作成したスクリプトのcrontabへの登録作業。この2点を実施したcrontab -l の結果は下記の通りです。
### DockerとPBSが使える任意のユーザのcrontabに下記を登録してください。
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/pbs/bin
#SHELL=/bin/bash
# Edit this file to introduce tasks to be run by cron.
(中略)
### 1分間隔でジョブの実行状況を更新する
# m h dom mon dow command
*/1 * * * * bash /home/ubuntu/JobExecution.sh
これで毎分ページが更新されるハズ。
自分のブラウザ上でも毎分結果が更新されていることを確認しました。
その他
今回はApacheを使ったWebサーバを通じて結果を参照していましたが、生成したファイルをAmazon S3の上に保存して参照したりしてもよいかもしれないなと思いました。どこに行っても必要とされるポータル的な機能だと感じるので、備忘録的に記事に書けてよかったな~と思っています。気になる点やご指摘事項はコメント等でお知らせください!
以上
コメントを残す