Dns.BeginGetHost… métodos de bloqueio
Então eu quero fazer umamuito de consultas DNS.
Eu crio (milhares) de tarefas doBegin/EndGetHostEntry
par assíncrono:
var lookupTask = Task.Factory.FromAsync
( Dns.BeginGetHostEntry,
(Func<IAsyncResult, IPHostEntry>) Dns.EndGetHostEntry,
"google.com",
null
)
entãoTask.WaitAll
para tudo completar. Estou vendo o número deThreadPool
threads aumentam drasticamente em resposta aos meus pedidos. Se eu forçar oThreadPool
minThreads
para 500, a carga de trabalho é consumida consideravelmente mais rapidamente. Tudo isso aponta para o bloqueio noDns
implementação assíncrona.
Se eu substituirDns
com umcliente de DNS gerenciadoPosso consumir a mesma carga de trabalho com apenas 1 ou 2 threads noThreadPool
com cpu virtualmente inativo.
A coisa é, oDns
A implementação é absolutamente fundamental para muitas APIs de rede (HttpWebRequest
, WebClient
, HttpClient
), e todos parecem ser afetados por esta questão. Se eu resolver o DNS com uma biblioteca de terceiros e fizer solicitações HTTP usando o endereço IP como o host no uri, altere oHost
cabeçalho para corrigir o pedido, eu fico empolgado desempenho em comparação com qualquer coisa que envolvaSystem.Net.Dns
.
Oque esta acontecendo aqui? Eu perdi alguma coisa ou é oSystem.Net.Dns
implementação realmente tão ruim assim?