Итак, я хочу сделать много DNS-запросов.
Я создаю (тысяч )Задач из Begin/EndGetHostEntry
асинхронной пары:
var lookupTask = Task.Factory.FromAsync
( Dns.BeginGetHostEntry,
(Func) Dns.EndGetHostEntry,
"google.com",
null
)
затем Task.WaitAll
для завершения всего. Я вижу, что количество потоков ThreadPool
резко увеличивается в ответ на мои запросы. Если я заставлюThreadPool
minThreads
до 500 рабочая нагрузка потребляется значительно быстрее. Все это указывает на блокировку в Dns
асинхронной реализации.
Если я заменю Dns
управляемым DNS-клиентом , я смогу потреблять ту же рабочую нагрузку только с 1 или 2 потоками в ThreadPool
с практически бездействующим процессором.
Дело в том, что реализация Dns
абсолютно необходима для многих сетевых API (HttpWebRequest
., WebClient
,HttpClient
), и все они, кажется, затронуты этой проблемой. Если я разрешаю DNS с помощью сторонней библиотеки и делаю HTTP-запросы, используя IP-адрес в качестве хоста в uri, а затем изменяю заголовок Host
, чтобы исправить запрос, я получаю невероятную производительность по сравнению со всем, что связано с System.Net.Dns
.
Что тут происходит? Я что-то пропустил или реализация System.Net.Dns
действительно так плоха?