インフラ DNS AdGuard
自宅LANのDNS名前解決を80倍高速化した記録 ── AdGuard Homeの並行リクエスト最適化
光回線を引いており、ルーターやインターネットへの物理pingも5ms程度と極めて良好なのに、「ブラウザで初めて訪れるサイトを開いた瞬間に、1秒ほど微妙に引っかかる」 という現象が気になっていた。
調査を進めると、自宅の広告ブロッカー兼DNSキャッシュサーバーである AdGuard Home の設定に、意外な落とし穴が潜んでいた。
ボトルネックの真因:fastest_addr の罠
AdGuard Home には上流DNSの問い合わせモードがいくつか用意されている。その中に fastest_addr(最速IP選定)という項目がある。
「一番速いIPを選んでくれるなら良いこと尽くめだろう」と思いがちだが、実はこれが元凶だった。
fastest_addrの挙動: 名前解決で返ってきたすべてのIPアドレスに対して、AdGuard自身が ping や TCP接続テストを逐次送信し、一番速かったIPを選んでクライアントに返す。- 問題点: pingに応答しないサーバーや海外ホストの場合、タイムアウト(デフォルト1秒)いっぱいまでクライアントへの応答が完全にブロックされる。
実測したところ、未キャッシュドメインへの問い合わせに 1,020ms(1秒超) もかかっていた。
解決策:parallel(並行リクエスト)と楽観的キャッシュ
以下の通り設定を全面的に見直した。
- 問い合わせモードを
parallelへ変更: 複数の上流DNS(Cloudflare, Google, Quad9)へ同時にクエリを投げ、最初に返ってきた応答を即採用する。 - 上流に国内最速の Cloudflare DoH を追加:
https://cloudflare-dns.com/dns-queryを筆頭に配置。 cache_optimistic: true(楽観的キャッシュ)の有効化: TTLが切れたレコードでも、直前のキャッシュを即座に 0ms で返し、裏で非同期更新する。
[!TIP] 最小TTL(
cache_ttl_min)を300秒(5分)に設定することで、最近のCDNにありがちな「有効期限30秒」の頻繁な問い合わせを抑止できる。
結果:1,020ms から 10ms へ
設定適用後、未キャッシュドメインの問い合わせ時間は 10ms〜15ms(約80倍の高速化) に劇的に改善した。
日々のWebブラウジングはもちろん、ターミナルでの git clone や npm install のキビキビ感が一気に向上し、ネットワークの透明度が格段に上がった。