0

C# から呼び出された Mono の Dns クラスで、非常に再現性の高い問題に遭遇しました。複数のマシン (たとえば、クラスター上) から複数の呼び出しを行うと、多かれ少なかれ同時に (バッチ プログラムの起動時など) 、いくつかの乱数の呼び出しがハングします。

Mono Dns クラスが適切にタイムアウトしてリクエストを再発行していない可能性が高いようです。DNS は UDP ベースの RPC プロトコルを使用しますが、UDP は信頼できないため、10 個のパケットが DNS サーバーに同時にヒットした場合、または何かと 1 つのパケットがヒットした場合紛失した場合、返信はありません。

これが私の質問です: Mono の C# から Dns.GetHostName または Dns.GetHostInfo への呼び出しを中断するクリーンな方法を知っている人はいますか?

4

1 に答える 1

0

今では、自分の質問に答える必要があると思います。つまり、Mono のライブラリには、DNS と通信するための何らかのバグがあり、2005 年頃から文書化されていますが、まだ修正されていません。DNS ライブラリの 2 番目のバージョンがあり、一部の人々はより適切に機能すると主張しています。

私自身の目的のために、コードからほとんどすべての DNS 呼び出しを削除できることがわかりました。結局のところ、DNS で失われたパケットによって引き起こされる DNS コードのハングは、非常に恐ろしいものです。

これは、UDP 通信をあたかも信頼できるかのように扱うコードの良い例だと思います。負荷が高い場合を除いて信頼性が高いため、決して修正されない長引くバグがあります。しかし、Mono DNS に高負荷をかけるだけで、非常に簡単にトリガーされます。

于 2013-07-18T19:54:15.363 に答える