[メモ] MPICH2におけるmpdboot時の407エラー

MPICH2で、次のような条件で自ノードを含んだ複数台のノードとハンドシェイクをしようとした。

     ホスト名  :   IPアドレス
自ノード  i11server13 : 192.168.0.13
ハンドシェイクするノード  i11server14 : 192.168.0.14


自ノード(i11server13)の ~/mpd.host に2台のIPアドレス(もしくはホスト名)を書きこんで、
ハンドシェイクするコマンドを打つと

	%mpdboot -n 2 -f ~/mpd.hosts
	mpdboot_i11server13 (handle_mpd_output 407): failed to handshake with mpd on 192.168.0.14; recvd output={}

というエラーが返ってきた。もちろん、ハンドシェイクは出来ていない。一方、自分だけの(1台での)ハンドシェイクは

%mpdboot -n 1 -f ~/mpd.hosts

のコマンドで出来ているのでMPICHがおかしい訳ではなさそう。

MPICHの407エラーでググったところ、望ましい結果がなかったので、いつも良くコケる原因の一つである、
ハンドシェイクするノードの /etc/hosts が共通になっているか調べたところ、ホストネームが載る一番上の行は
次のようにコメントアウトしてあり、どちらも共通だと解釈がされているはずだ。

%cat /etc/hosts]
#127.0.0.1    i11sever13    localhost.localdomain    localhost
::1           localhost6.localdomain6 localhost6
192.168.0.13  i11server13
192.168.0.14  i11server14

そこで --debugオプションを付けることで、詳細なエラーメッセージを吐くということが分かったので、実行してみた。

% mpdboot -n 2 -f ~/mpd.hosts --debug
debug: starting
running mpdallexit on i11server13
debug: launch cmd= /usr/local/mpich2/bin/mpd.py   --ncpus=1 -e -d
debug: mpd on i11server13  on port 50158
debug: info for running mpd:{'ncpus': 1, 'list_port': 50158, 'entry_port': '', 'host': 'i11server13', 'entry_host': '', 'ifhn': ''}
debug: launch cmd= rsh -n 192.168.0.14 '/usr/local/mpich2/bin/mpd.py  -h i11server13 -p 50158  --ncpus=1 -e -d'
debug: mpd on 192.168.0.14  on port 35639
mpdboot_i11server13 (handle_mpd_output 407): failed to handshake with mpd on 192.168.0.14; recvd output={}

と出力されたが、有力な情報は得られなかった。
なんとなく分かるのは、ハンドシェイクしようとしている192.168.0.14のマシンが、ハンドシェイクを拒否している感じ。


最終的に分かったことが、ハンドシェイクする際の ~/.mpd.conf に記述するパスワードの書き方が
共通ではなかった事だった。というのも、

i11server13% cat .mpd.conf
MPD_SECRETWORD=hogehoge
i11server14% cat .mpd.conf
MPD SECRETWORD=hogehoge

上記のように、MPD SECRETWORDの書き方が違った(アンダーバーを付ける・付けない)ことが原因であり、
これを共通にしたところ複数台でハンドシェイクできた。
なんとも初歩的なミスなのかもしれないが、MPICHのエラーメッセージが出ない事も不親切だ。


そんなことでMPICH2のハンドシェイク時に407エラーが出るときの対処まとめ。

  • /etc/hostsがハンドシェイクするマシンと共通になっているか?
  • .mpd.conf はパスワードだけでなく、その入れ子の名前も共通か? (これについては下記で詳細)

ところで、他のMPICH解説サイトを見ると、.mpd.confは

secretword=共通のパスワードを記入

みたいな書き方をせよ! って解説されているけど実際は、
.mpd.confに書かれている文字列が同じかどうか で判断しているよう。

試しに、両ノードの.mpd.conf に "hogehoge" としか書かなくてもハンドシェイクできちゃったし。
まぁ無事ハンドシェイクできて良かった。


ちなみに、MPICH2の420エラーは "~/.mpd.conf "のパーミッションが正常ではない、というエラーです。

%chmod 600 ~/.mpd.conf

でOK。

ホストに合ったaliasファイルを自動で読み込ませる

  • 投稿日:
  • by
  • Category:

aliasを記述したファイルを自動で読み込ませるには、 ホームディレクトリに.aliasファイルを作り、
bash なら .bchsrc 、 tcsh なら .tcshrc に
 

source .alias

と記述すればログイン時に自動で.aliasを読み込んでくれますが、
いくつかのLinux計算マシン(HPC)があって、ホームディレクトリが共有されているという環境にある、 各々のマシン(host1,host2)に合ったaliasファイル(alias1,alias2)を読み込ませたいという場合がありました。

その場合、上のように .cshrc に記述すると、どちらのマシンにログインしても同じ.cshrc が 読み込まれるので、そのため同じ.aliasファイルを読み込んでしまいます。

はじめはシェルスクリプトでhostnameを引いてマシンを判断し、それにあったaliasファイルを読み込むよう、下のようなプログラムを書き、それ を.cshrc でログイン時に実行するようにしたのですが、うまくaliasファイルを読み込んでくれません。 (hostnameはキチンと取得できているのですが。)

set host=`hostname`
echo "${host}"
switch ($host)
 case *host1*:
  echo "load source .alias1"
  source ~/.alias1
 breaksw
 case *host2*:
  echo "load source .alias2"
  source ~/.alias2
 breaksw
 default:
  echo "other host : no load alias"
 endsw

解決策として、上のシェルスクリプトを.tcshrc に書くことで、マシンに合った.aliasファイルを読み込ませることができました。
この場合、(ログイン時の)シェルが共通(tcsh)じゃないとダメなので、注意が必要です。