AWS ParallelCluster 3.0.0 と Ubuntu 18.04 または Ubutu 20.04 の組み合わせはヘッドノード再起動後にコンピュートノードが起動できない原因と対処方法について

ジョブを登録してもコンピュートノードが起動できません。コンピュートノードのスケーリングを管理しているデーモンが機能していないためユーザーが対処する必要があります。
2021.10.09

AWS ParallelCluster 3.0.0 と Ubuntu 20.04の組み合わせのクラスターで検証していました。以前はジョブを登録するとコンピュートノードが正常に起動してたのに、ヘッドノードを再起動後するとコンピュートノードが起動しなくなりました。原因と対処方法がわかったので紹介します。

結論

ヘッドノードへログインしsudo service supervisor startでサービスを手動起動させる必要がある。

supervisor.serviceは自動起動有効になっていますが起動してきません。

詳細は以下のリンクをご確認ください。

ワークアラウンド

インスタンス起動時にcronでサービス開始する設定を仕込めば回避できます。後述します。

対象とされる環境

  • AWS ParallelClusterのバージョンは3.0.0
  • OSはUbuntu 18.04Ubuntu 20.04のみ

原因

  • ParallelClusterのデーモンclustermgtdがヘッドノードの再起動後にデーモンが再起動しない
  • clusutermgtdがコンピュートノードのスケールアップを管理しているため、ジョブを登録してもコンピュートノードが起動できない
  • 根本的な原因はヘッドノードのsupervisord.serviceがヘッドノードの再起動にinactive (dead)であるため

状況

ジョブを登録すると以下のメッセージ(REASON)が表示され、コンピュートノードがまったく起動できない状態になりました。

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                13  cpu-spot  test.sh   ubuntu PD       0:00      1 (Nodes required for job are DOWN, DRAINED or reserved for jobs in higher priority partitions)
                14  cpu-spot  test.sh   ubuntu PD       0:00      1 (ReqNodeNotAvail, UnavailableNodes:cpu-spot-dy-c5a4xlarge-[1-20])

STATEからノードがdownしていることを確認できます。

$ sinfo
PARTITION     AVAIL  TIMELIMIT  NODES  STATE NODELIST
cpu-spot*        up   infinite     20  down~ cpu-spot-dy-c5a4xlarge-[1-20]

原因切り分けのために以下の対応しましたが解決には至りませんでした。

ヘッドノードの再起動後に発生していることがわかり、そこを中心に調査を進めました。

対処

Wikiよりsupervisord.serviceサービスが起動しない問題を抱えていることがわかりました。

サービスのステータスを確認します。

systemctl status supervisord.service

inactive (dead)でした。

実行結果

● supervisord.service - LSB: Start/stop supervisor
     Loaded: loaded (/etc/init.d/supervisord; generated)
     Active: inactive (dead)
       Docs: man:systemd-sysv-generator(8)

サービスを起動します。

sudo service supervisor start
systemctl status supervisord.service

active (running)になりました。

実行結果

● supervisord.service - LSB: Start/stop supervisor
     Loaded: loaded (/etc/init.d/supervisord; generated)
     Active: active (running) since Sat 2021-10-09 01:27:30 UTC; 6s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 1398 ExecStart=/etc/init.d/supervisord start (code=exited, status=0/SUCCESS)
      Tasks: 4 (limit: 4631)
     Memory: 83.2M
     CGroup: /system.slice/supervisord.service
             ├─1405 /opt/parallelcluster/pyenv/versions/3.7.10/envs/cookbook_virtualenv/bin/python3.7 /opt/parallelcluster/pyen>
             ├─1413 /opt/parallelcluster/pyenv/versions/3.7.10/envs/node_virtualenv/bin/python3.7 /opt/parallelcluster/pyenv/ve>
             └─1420 /opt/parallelcluster/pyenv/versions/3.7.10/envs/cookbook_virtualenv/bin/python /opt/parallelcluster/pyenv/v>

ノードのSTATEはidele%に変化しました。

$ sinfo
PARTITION     AVAIL  TIMELIMIT  NODES  STATE NODELIST
cpu-spot*        up   infinite     20  idle% cpu-spot-dy-c5a4xlarge-[1-20]
high-cpu-spot    up   infinite     10  idle~ high-cpu-spot-dy-c5a24xlarge-[1-10]

キューは捌けていきませんでした。一度scancelでキュー削除してきれいサッパリにします。

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                13  cpu-spot  test.sh   ubuntu PD       0:00      1 (Nodes required for job are DOWN, DRAINED or reserved for jobs in higher priority partitions)
                14  cpu-spot  test.sh   ubuntu PD       0:00      1 (ReqNodeNotAvail, UnavailableNodes:cpu-spot-dy-c5a4xlarge-[1-20])

キューをクリアしました。

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

テストジョブでコンピュートノード起動確認

テストジョブを投げて動作確認します。

sbatch test.sh

キューに登録されました。

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                15  cpu-spot  test.sh   ubuntu CF       0:01      1 cpu-spot-dy-c5a4xlarge-1

STATEがmix~になりました。この後すぐにdown#にならなければ問題はほぼほぼ解決したようなものです。

$ sinfo
PARTITION     AVAIL  TIMELIMIT  NODES  STATE NODELIST
cpu-spot*        up   infinite      1   mix~ cpu-spot-dy-c5a4xlarge-1
cpu-spot*        up   infinite     19  idle~ cpu-spot-dy-c5a4xlarge-[2-20]

コンピュートノード起動してくる素振りを見せるだけで2時間ほど原因切り分けしていた身としては感動的な光景です。

正常に起動しました。大きな前進です。

キューは捌けました。

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

出力結果を返したファイルが作成されています。ホスト名を返すだけのジョブでしたが、コンピュートノードの起動確認において十分な結果です。

slurm-15.out

$ cat slurm-15.out
cpu-spot-dy-c5a4xlarge-1

サービス自動起動しておけばよくないですか?

悲しいことにenabledで自動起動になっています。自動起動したあとに異常終了していたならinactive (dead)ではなくfailedになるはずです。根本的な原因まではわかりませんが、自動起動になっているにもかかわらず起動処理が走らないことに問題があるように思えます。

$ systemctl list-unit-files -t service | grep supervisord
supervisord.service                            generated       enabled

ワークアラウンド(cronでサービス起動させる)

ヘッドノード(ECインスタンス)起動時に一度だけサービス起動させるcronを仕込みます。ヘッドノードの停止・開始、再起動してもsupervisord.serviceactive (running)状態に持っていけました。

crontab -eでcronの設定に以下の1行を追記してください。

@reboot sudo systemctl start supervisord.service

動作確認はヘッドノードの停止・開始後にsystemctl status supervisord.serviceでサービスが開始されているか確認してください。

おわりに

GitHubのWikiのタイトルだとわかる人にしかわからないです。シンプルにヘッドノード再起動にコンピュートノードが起動できないという問題を抱えています。検索から当記事がヒットし一次ソースのWikiへたどり着いてもらえば幸いです。 Amazon Linux2、CentOSでは同じ問題は報告されてないため他OSは心配ありません。

参考