/ 编程

Unbound 性能优化

安装完 unbound 之后,如果没有负载大量 DNS 请求的需求,一般没必要对 unbound 进行特殊的优化配置。如果有这个需求,或者仅仅是无聊以及其他什么原因,就需要改下配置文件了。下面的内容基本上是从官方文档里扒出来的。

  • num-threads 设置为机器的 CPU 核心数

    例如有一个 CPU,8个核,设置 num-threads: 8

  • msg-cache-slabs, rrset-cache-slabs, infra-cache-slabs, key-cache-slabs 设置为跟 num-threads 相近的 2 的 N 次方,数字设置越大,程序中锁的竞争会越少,但是会产生更多的内存碎片

    例如上面 num-threads: 8, 这几个 *-cache-slabs 也设置为 8 即可。

  • outgoing-range 这个选项指定 unbound 可以打开的端口数目,每个线程能打开的文件描述符个数。一般越大性能越好,要设置超过 1024 (系统默认的最大数目),需要在编译 unbound 时使用 libevent,指定 –with-libevent

  • num-queries-per-thread 指定每个线程能够同时处理的最大请求数,超过这个数目的请求会被丢掉。outgoing-range 设置为 8192,num-queries-per-thread 就设置为 4096。即 outgoing-range 设置为 num-queries-per-thread 的两倍

  • so-rcvbuf, so-sndbuf 设置为 0 则使用系统默认的接收/发送缓冲区大小,在负载比较大的服务器上,视网卡等配置而定,可以设置为 4m, 8m 甚至更大,大的 so-rcvbuf 可以有效减少丢包

  • msg-cache-size 消息缓存的大小,rrset-cache-size DNS 记录缓存大小。为了提高性能,适度增大这两项值,把 rrset-cache-size 设置为 msg-cache-size 的两倍。 unbound 的内存占用会大约稳定在配置文件中指定的各项值的总和的 2 到 2.5 倍。

    如果有 8G 内存供 unbound 使用, 把 rrset-cache-size 和 msg-cache-size 分别设置为 2G, 1G 应该比较合适(除了这两个,还有其他内存占用配置,是与 dnssec 相关的,如果使用 dnssec 的话,这里设置的 2G, 1G 需要重新考虑)

以上需要根据硬件配置适当调整。没必要过分追求“最优”,DNS 服务器遇到的场景本就是多种多样,费时费力得到的“最优参数”不一定适用于所有场景。

另外,有一些配置项,不管是什么硬件配置,都会对 unbound 或多或少产生影响

  • logfile 设置为空("")的话,如果 unbound 不是以 damonize 方式启动,日志输出到 stderr,否则就不输出日志。不为空的话,日志输出到指定文件(注意权限问题)。不输出日志比输出日志性能好。
  • log-time-ascii 设置为 yes,在日志中输出的时间是人一眼能认得的时间格式,设置为 no,则使用 Unix时间戳。设置为 no 要比 yes 性能好一些。
  • log-queries 设置为 yes 会记录 unbound 收到的每一条 DNS 请求,每一条都包括来源 IP、域名、请求类型等内容。设置为 no 则不记录,性能比较高。
  • extended-statistics 设置为 yes,在执行 unbound-control stats 时,会得到更详细的 unbound 的请求量等统计信息,同样会使性能降低。

还有与 unbound 功能模块相关的一些配置

如果不需要 dnssec 的功能,可以在 module-config 这一项中删掉 “validator” 以提升性能

如果不使用 ipv6,可以设置 do-ip6 为 no


为了安全,最好把 hide-identity 和 hide-version 都设置为 yes, 隐藏服务器主机名和 unbound 版本号。

修改完配置可以执行 unbound-control reload 重新加载配置文件,注意它同时也会把缓存,统计信息给清了。

参考资料:

https://unbound.net/documentation/unbound.conf.html
https://unbound.net/documentation/howto_optimise.html