メモリーリーク
私は特殊な構成を使用している。ヘッドレスのゲートウェイでは bitcoind が動作しており、デスクトップでは標準の bitcoin クライアントが動作している(両方とも Linux OpenSuSE、ゲートウェイは 11.1、デスクトップは 11.3、bitcoin は両方とも 0.3.12)。TCP ポート 8333 はゲートウェイからデスクトップに転送されている(そのためゲートウェイのクライアントは着信接続を受けられない)。原因は不明だが、ゲートウェイの後にデスクトップのクライアントを起動すると、デスクトップのクライアントが接続できず、長時間にわたって接続数が 0 と 2 の間を行き来する。最終的には接続できることもあるが、接続できない間はメモリーが大量にリークする。約 200KB/秒(0-2 の切り替えのたびに)。クライアントが即座に接続できれば気づかない程度かもしれないが、私のケースではそうならない。デスクトップを先に起動し、その後ヘッドレスクライアントを(デスクトップが接続した後に)起動すれば、すべて正常に動作し、リークは発生しない(あるいは無視できる程度である)。ブートストラップ関数またはブートストラッププロセスのどこかで解放されていないメモリーがあるのではないかと推測している。
0 と 2 の間で接続が行き来しているのは、自分自身に接続している場合かもしれない。-connect スイッチを使っているか?
自分でコンパイルしたものか、それともリリースビルドか?バージョンは何だ?
200Kb/秒がどうなっているかわからない。接続試行の間に少なくとも 0.5秒待つはずだ。0 と 2 の接続間でどれくらい速く点滅しているか?1秒に 2回より速いか?
Linux での wait 関数は:
inline void Sleep(int64 n)
{
boost::thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(n));
}
これが正しく動作しなければ、ループを最速で回り続けることが可能だ。
うーん、今はバグが消えたが、どんな状態だったかは覚えている。コンパイル済みのリリースバイナリで、既に述べた通り 0.3.12 だ。-connect は使っていなかった。フリッカリングは 0 から 2 まで高速で(0.5秒未満)、その後約 1秒間 0 接続で停止した。フリッカー自体はほぼ毎秒だった(それ以上ではない)。connrefused を即座に受けたような感じだ。ログを見ていたが、保存しなかった。接続と切断が理由もなく繰り返されるだけで、特に興味深いことはなかった。
htop で RES メモリーを測定した。1秒ごとに更新されるため、実際のリーク速度は見えない。現在、クライアントは起動後に接続を試みて 0-2 の間でフリッカーするが、5〜10回だけで、その後 1 つの接続が確立される。その後 1 と 3 の間でフリッカーし、リークは発生しない。その後接続数は 40 以上に増え、すべて安定する。再現するには、クライアントが IRC から IP を取得した直後にネットワーク接続を切断し、接続を試みて失敗させればいい。
0.3.13 でまたリークが発生した。ログはこちら:http://pastebin.com/g0gqi7kx 接続と切断が何の変化もなく何度も繰り返されるのでカットし、外部の固定 IP は検閲した(正しく検出されている)。ポート 8333 は転送されており外部から見える。シャットダウン時に Bitcoin の RES サイズは 150 MB まで増加していた。
自分自身に接続している。21回の接続試行すべてがバージョン 31300(0.3.13)のノードに対するものだった。まだ全員が 0.3.13 にしているわけではない。
IRC は機能しているようだ。他に試すべきノードがあるはずだ。
切断後すぐに自分自身への接続を再試行しないようにする必要があるかもしれない。ただ、なぜそうなっているのかわからない。nLastTry をリセットしてキューの後ろに回すはずだが、ログには表示されていない。
addr.dat を別の場所に移動してみてくれ。その中に何か問題があるかもしれない。
-addnode を使用しているか?
-minimizetotray 以外のスイッチは使っていない。なしで試したり、addr.dat を削除して試したりしたが、何も変わらなかった。接続数は 0 から 2 の間で揺れている。bitcoind が自分のゲートウェイで動作していて、(おそらく)自分のノードが gw と同じ外部 IP を報告するため、ピアが自分のノードに接続するのを妨げている。だからクライアントが自分のノードに接続しようとすると、gw 上の bitcoind に接続してしまう。しかし、NAT 越しでも自分のノードが誰にも接続できないのはなぜだろう? gw ノード上の接続数を確認したら 100 だった。単一の IP への接続にハードリミットがあるのだろうか? ローカルノードのフルログはこちら:http://pastebin.com/0Aege9mb