最近、KLabさんがオープンソースで公開している「makuosan」を使ってみようと、意気込んでセットアップしていたら、以下のようなエラーに直面して、どうにもならなくなっていた。

CentOSが動いている「とあるホスト」にインストールしてあるmakuosanが以下のようなエラーメッセージを/var/log/meassageに残して、接続先(まぁ、同期対象のホスト群)を見失ってしまうというエラーで、回復するためには放置しても無駄で(汗)makuosanを再起動するしかなささそうだけど、再起動してもしばらくするとエラーメッセージ(ちょっと加工してますが)を吐いて接続先を見失うという無限ループ(汗)

Sep 4 11:38:01 centos makuosan: root: mrecv_gc: pong timeout some.host.net

Sep 4 11:38:01 centos makuosan: root: [error] member_del_message: pong time out: XXX.XXX.XXX.XXX(some.host.net)

これが発生するのは、makuosanを起動、もしくは再起動してからだいたい5分後。起動直後の5分間はまともに接続先が見えているんだけどなぁ…と思いつつ、なんとなくiptablesの設定を疑って他のマシンの設定ファイルとdiffを取ってみたり、makuosanを再インストールしてみたり…と、とっても五里霧中な感じのトラブルシューティングが続いた。

で、うろうろしたあげくに、makuosanのソースの「makuosan.h」を見てみると、以下のような記載があった。

/*----- timeout -----*/
#define MAKUO_SEND_TIMEOUT  500    /* 再送間隔(ms)                                 */
#define MAKUO_SEND_RETRYCNT 120    /* 再送回数                                     */
#define MAKUO_PONG_TIMEOUT  300000 /* メンバから除外するまでの時間(ms)             */
#define MAKUO_PONG_INTERVAL 45000  /* PONG送信間隔(ms)                             */
#define MAKUO_RECV_GCWAIT   180000 /* 消し損ねたオブジェクトを開放する待ち時間(ms) */

エラーメッセージに「pong timeout」と書いてあったことと、MAKUO_PONG_TIMEOUTの時間から察するに、makuosan起動直後からPING/PONGによる接続先生存確認に失敗してる感じかなぁとぼんやり妄想してみたが、やっぱりよくわからない。しかも、調べてみると、「とあるホスト」からは、周囲にいる接続先が見えなくなるけれど、周囲にいる接続先から「とあるホスト」は見えたまま…とうアンシンメトリーな状態だったことがわかり、なんとも気持ち悪かった。

…で、もうなんとなくやることがなくなって、唐突ではあるけれど「NICが怪しい」と思い始めて調べてみた。この「とあるホスト」はコストをケチるために、オンボードのNICに加えて、玄人志向製の「GBE-PCI2」(…なんか安易な型番だな)を使っていて、使っているチップはVIAの「VT6122」とのこと。いわゆる、Velocityシリーズってやつ。

この「VIA Velocity」用のドライバは、私が知る限り、2種類あって、1つがCentOSに入ってる「via_velocity」で、もう1つがVIAのサイトからダウンロードできる「velocityget」。以前、とあるMLで「via_velocity」のデキがよろしくないようで、Sambaなどで性能劣化を起こすという投稿を見つけていたので、「とあるホスト」には、VIAのサイトから「velocityget」を落として組み込んであった。…はずだったが、先日、カーネルを更新した際に「velocityget」を再インストールするのを忘れてたらしく、lsmodしてみたら、いないはずの「via_velocity」がいらっしゃった!(modprobe.confでは「velocityget」を指定してあったけれど、肝心の「velocityget」が存在しないから、代わりに「via_velocity」が読み込まれて、何となく使えてたらしい)

目下、makuosanが接続先を見失う問題に対しては、特に打つ手もなかったので、期待を込めて「velocityget」をインストールしなおし、「via_velocity」を/etc/modprobe.d/blacklistに書き込んで、マシンを再起動してみた。

そして、makuosanが起動して5分後、やや緊張しながら/var/log/messageを覗くと…何にも出力されていない。「msync –member」をやってみても、makuosanは接続先を見失っていなかった!

…というわけで、起動して5分でmakuosanが接続先を見失うという問題は、makuosanとはまったく無関係な、安いNICと怪しげなドライバが原因だったという、なんともお粗末な結末…orz。

今度、マシンにNIC足すときは、なんとなくbroadcomとかIntelのNICにしようと決めた次第である。

*1:modprobe.confでは「velocityget」を指定してあったけれど、肝心の「velocityget」が存在しないから、代わりに「via_velocity」が読み込まれて、何となく使えてたらしい