Windows で C++ から DNS クエリを実行するために getaddrinfo を使用しています。以前は Windows API の DnsQuery を使用していましたが、これは問題なく機能していましたが、ソフトウェアに IPv6 サポートを追加するときに getaddrinfo に切り替えました。それ以来、私は次のことを見てきました。
私の問題は、getaddrinfo が完了するまでに非常に長い時間がかかる場合があることです。getaddrinfo からの通常の応答は数ミリ秒かかりますが、およそ 10000 分の 1 の時間で、場合によっては 15 秒程度の時間がかかりますが、数分かかる場合がいくつかあります。
サーバーで Wireshark を実行し、アプリケーションのデバッグ ログを分析したところ、次のように表示されました。
- 関数 getaddrinfo を呼び出します。
- 15 秒後、私のマシンは DNS サーバーにクエリを実行します。
- 数ミリ秒後、DNS サーバーから応答が返ってきます。
ここで奇妙なことに、実際の DNS クエリは 10 分の 1 秒しかかからないのに、getaddrinfo が実際に実行される時間はそれよりもはるかに長くなります。
この問題は多くのユーザーから報告されているため、私のマシンに固有の問題ではありません。
では、getaddrinfo は DNS サーバーに接続する以外に何をするのでしょうか?
編集:
- 複数のアドレスで問題が発生しました。これらのアドレスを使用して問題を再現しようとすると、問題は発生しません。
- 私は愚かなことをしました。DNS クエリごとに、etc/services が解析されます。ただし、それは数分の遅延を説明するものではありません。(ありがとうD.ショーリー)
編集 2
- 私のソフトウェアによって作成される DNS クエリの 1 つのタイプは、アンチスパム DNSBL クエリです。あるユーザーのログによると、ip.address1.example.com の検索には常に正確に 2039 秒かかるように見えましたが、another.ip.address.example.com の検索には常に正確に 1324 秒かかりました。その翌日、これらのアドレスのルックアップはまったく問題ありませんでした。最初は、DNS BL の作成者が何らかのタイムアウトを設定したのではないかと考えていました。しかし、これが中心的な問題だった場合、getaddrinfo はもっと早くタイムアウトするべきでしたか?