出于分析目的,我想对大量 IP 执行反向 DNS 查找。“大”的意思,每小时至少有几万。我正在寻找提高处理速度的方法,即降低每批的处理时间。
将Dns.GetHostEntry的异步版本包装到可等待的任务中已经有很大帮助(与顺序请求相比),从而导致了 appox 的吞吐量。100-200 IP/秒:
static async Task DoReverseDnsLookups()
{
// in reality, thousands of IPs
var ips = new[] { "173.194.121.9", "173.252.110.27", "98.138.253.109" };
var hosts = new Dictionary<string, string>();
var tasks =
ips.Select(
ip =>
Task.Factory.FromAsync(Dns.BeginGetHostEntry,
(Func<IAsyncResult, IPHostEntry>) Dns.EndGetHostEntry,
ip, null)
.ContinueWith(t =>
hosts[ip] = ((t.Exception == null) && (t.Result != null))
? t.Result.HostName : null));
var start = DateTime.UtcNow;
await Task.WhenAll(tasks);
var end = DateTime.UtcNow;
Console.WriteLine("Resolved {0} IPs in {1}, that's {2}/sec.",
ips.Count(), end - start,
ips.Count() / (end - start).TotalSeconds);
}
任何想法如何进一步提高处理速度?
例如,有没有办法将一批 IP 发送到 DNS 服务器?
顺便说一句,我假设在幕后,异步方法使用了I/O 完成端口- 如果我错了,请纠正我。