WindowsのC++からgetaddrinfoを使用してDNSクエリを実行しています。私はWindows API DnsQueryを使用していましたが、うまくいきましたが、私のソフトウェアにIPv6サポートを追加すると、getaddrinfoに切り替えました。それ以来、私は以下を見てきました:getaddrinfoからの応答が遅い
私の問題は、いくつかの時間getaddrinfoが完了するのに非常に時間がかかることです。 getaddrinfoの典型的な応答はほんの数ミリ秒かかりますが、10000回のうち約1時間ですが、場合によっては15秒程度かかりますが、数分かかる場合もあります。
私は、サーバー上のWiresharkを実行し、私のアプリケーションのデバッグログを分析し、以下を参照してくださいました。
- 私は、関数のgetaddrinfoを呼び出します。
- 15秒後、私のマシンはDNSサーバに問い合わせます。
- ミリ秒後に、私はDNSサーバーから応答を受け取ります。
実際のDNSクエリはわずか10分の1秒しかかかりませんが、getaddrinfoが実際に実行する時間はかなり長くなります。
問題は多くのユーザーから報告されているため、私のマシンに固有の問題ではありません。
これで、getaddrinfoはDNSサーバーに何か連絡するのですか?
編集:
- 問題は、いくつかのアドレスで発生しました。これらのアドレスを使用して問題を再現しようとすると、問題は発生しません。
- 私は何か愚かなことをしました。すべてのDNSクエリで、etc/servicesが解析されます。しかし、それは数分間の遅延を説明するものではありません。私のソフトウェアによって行われたDNSクエリの(おかげD.Shawley)
編集2
- 一つのタイプは、アンチスパムDNSBLクエリです。 1人のユーザーからのログでは、ip.address1.example.comの検索では常に正確に2039秒かかっていたようですが、another.ip.address.example.comの検索では常に正確に1324秒かかりました。それ以降の翌日、それらのアドレスのルックアップはうまくいきました。最初はDNS BLの作者が何らかのタイムアウトを彼らの側に置いていると思っていました。しかし、これがコアの問題だった場合、getaddrinfoは以前にタイムアウトしていたはずですか?
特定の特定のアドレスが遅いクエリのみですか? – SimonJ
FileMonのようなものを実行し、 'c:\ windows \ system32 \ drivers \ etc \ services'と' c:\ windows \ system32 \ drivers \ etc \ hosts'を毎回読んでパーズするような何かをしないようにしてくださいあなたが 'getaddrinfo()'と呼ぶ時間です。 –
少なくとも、すべての呼び出しでhostsファイルを解析するのはほぼ確実ですが、それは1ミリ秒または2秒を超えてはなりません。 –