だから私はたくさんのDNSクエリを作りたいです。
Begin/EndGetHostEntry非同期ペアから (数千の) タスクを作成します。
var lookupTask = Task.Factory.FromAsync
( Dns.BeginGetHostEntry,
(Func<IAsyncResult, IPHostEntry>) Dns.EndGetHostEntry,
"google.com",
null
)
その後Task.WaitAll、すべてが完了します。リクエストに応じて、スレッド数ThreadPoolが大幅に増加しています。強制的ThreadPool minThreadsに 500 にすると、ワークロードがかなり速く消費されます。Dnsこれらはすべて、非同期実装でのブロッキングを示しています。
マネージド DNS クライアントに置き換えるDnsと、CPU の仮想アイドリングで 1 つまたは 2 つのスレッドだけで同じワークロードを消費できます。ThreadPool
問題は、この実装が多くのネットワーク API ( 、、 )Dnsの中核をなすものであり、それらすべてがこの問題の影響を受けているように見えることです。サードパーティのライブラリで DNS を解決し、URI のホストとして IP アドレスを使用して HTTP リクエストを作成し、ヘッダーを変更してリクエストを修正すると、.HttpWebRequestWebClientHttpClientHostSystem.Net.Dns
何が起きてる?私は何かを見逃したのでしょうか、それともSystem.Net.Dns実装が本当に悪いのでしょうか?