Ubuntu の DNS キャッシュ

ネットワークのパフォーマンス測定みたいなことをやっていたら、たびたびドメイン名の解決が遅いことに気がついた。

システムは localhost に問い合わせているのは知っていたので、何が動いているのだろうと調べてみると、dnsmasq というのが走っていた。ネットの設定をいろいろしてくれる NetworkManager というソフトウェアから起動されているらしい。

$ ps ax | grep dns
 2773 ?        S      0:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/var/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.0.1 --conf-file=/var/run/nm-dns-dnsmasq.conf --cache-size=0 --proxy-dnssec --enable-dbus --conf-dir=/etc/NetworkManager/dnsmasq.d

オプションに cache-size=0 とあるので、キャッシュ機能は無効になっているのだろう。

DNSの問い合わせ速度は早いときで50ミリ秒くらいで、直接ルータに問い合わせても50ミリ秒なのでキャッシュが無効だということと矛盾しない。

$ time nslookup www.google.com localhost > /dev/null

real    0m0.052s
user    0m0.008s
sys     0m0.000s
$ time nslookup www.google.com 192.168.0.1 > /dev/null

real    0m0.050s
user    0m0.000s
sys     0m0.012s

さらにルータが参照している、プロバイダのDNSサーバに問い合わせても50ミリ秒なので、ルータ自体もキャッシングは行っていないようだ。

名前引きが要求されるたびに外部サーバに問い合わせていたのでは、トラフィックが盛んな時は数百ミリ秒単位で遅延が生じても不思議はない。ぜひキャッシュを有効にしたい。

https://wiki.archlinux.org/index.php/dnsmasq#NetworkManager によると /etc/NetworkManager/dnsmasq.d に cache-size=1000 という内容のファイルを cache という名前で置けばいいらしい。(わかるかそんなん!)これで 1000 個まで名前を覚えてくれるようになる。

# echo cache-size=1000 > /etc/NetworkManager/dnsmasq.d/cache

とやって、

# service network-manager restart

で設定を反映させると、1回目は変わらないが、

# time nslookup www.google.com > /dev/null

real    0m0.051s
user    0m0.000s
sys     0m0.008s

2回目は、

# time nslookup www.google.com > /dev/null

real    0m0.013s
user    0m0.000s
sys     0m0.008s

キャッシュが効いて10ミリ秒台になった。