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ミリ秒台になった。