HIRO GEAR
インフラ DNS AdGuard

自宅LANのDNS名前解決を80倍高速化した記録 ── AdGuard Homeの並行リクエスト最適化

自宅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(並行リクエスト)と楽観的キャッシュ

以下の通り設定を全面的に見直した。

  1. 問い合わせモードを parallel へ変更: 複数の上流DNS(Cloudflare, Google, Quad9)へ同時にクエリを投げ、最初に返ってきた応答を即採用する。
  2. 上流に国内最速の Cloudflare DoH を追加: https://cloudflare-dns.com/dns-query を筆頭に配置。
  3. 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 のキビキビ感が一気に向上し、ネットワークの透明度が格段に上がった。