解决Python中1亿条A记录的最快方法

时间:2010-09-13 16:56:52

标签: python dns performance

我有一个包含1亿个域名的列表,例如www.microsoft.com,并希望将该IP号码解析为www.microsoft.com

使用Python adns运行本地pdns服务器并查询localhost?

2 个答案:

答案 0 :(得分:1)

我可能会使用Twisted DNS libray从Google's Public DNS(ip地址:8.8.8.8)进行DNS解析。它需要一些试验和错误,但我猜你可以同时至少有几百个未完成的查询。 Google的DNS基础架构旨在处理巨大的负载,Twisted非常适合处理数千个同步的异步操作。

答案 1 :(得分:0)

实际上,我最近不得不解决这个特定问题。我发现的所有公共服务器都非常有限,并且以大约 2000 qps(每秒查询数)的速度回答。 2000 qps 对于数百万个 FQDN 来说显然太低了。

我最终配置了一个递归解析器以在合理的时间内完成此操作。使用您选择的递归解析器。下面我举一个使用unbound的例子。

使用未绑定

unbound 应该是大多数现代发行版的一部分,也可以在他们的 their page 中找到。使用以下配置,针对 12 线程服务器进行了优化,而没有完全杀死它,我能够达到 2 000 qps 以上,峰值约为 100 000 qps。

# /etc/unbound/unbound.conf
server:
        verbosity: 1
        num-threads: 10
        outgoing-range: 32768
        msg-cache-size: 400m
        msg-cache-slabs: 8
        num-queries-per-thread: 8192
        unknown-server-time-limit: 150
        rrset-cache-size: 400m
        rrset-cache-slabs: 8
        infra-cache-slabs: 8
        infra-cache-numhosts: 1000000
        trust-anchor-file: /etc/unbound/trusted-key.key
        key-cache-size: 400m
        key-cache-slabs: 8
        neg-cache-size: 100m

测试递归解析器

在您配置了您选择的递归解析器之后,可能值得对其进行测试。 This dns-stresstester works well for me. 您可以尝试以下操作:

go get github.com/MickaelBergem/dnsstresss
cd ~/go/bin
./dnsstresss -random -concurrency 400 google.com.

这给了我:

dnsstresss - dns stress tool

Testing resolver: 127.0.0.1:53.
Target domains: [google.com.].

Started 400 threads.
Requests sent: 110445r/s        Replies received: 110445r/s (mean=3ms / max=70ms)
Requests sent: 113971r/s        Replies received: 113971r/s (mean=3ms / max=108ms)
Requests sent:  93589r/s        Replies received:  93589r/s (mean=4ms / max=111ms)
Requests sent:  93986r/s        Replies received:  93986r/s (mean=4ms / max=202ms)
Requests sent: 102510r/s        Replies received: 102510r/s (mean=4ms / max=75ms)