我在服务器上安装了 dnsmasq,它被大量使用。当给出信号“SIGUSR1”时,我在 /var/log/syslog 中看到了以下 dnsmasq 日志
Jul 16 13:45:50 server1 dnsmasq[427008]: time 1531748750
Jul 16 13:45:50 server1 dnsmasq[427008]: cache size 10000, 18355/597070 cache insertions re-used unexpired cache entries.
Jul 16 13:45:50 server1 dnsmasq[427008]: queries forwarded 1510313, queries answered locally 15347110
Jul 16 13:45:50 server1 dnsmasq[427008]: queries for authoritative zones 0
Jul 16 13:45:50 server1 dnsmasq[427008]: server 100.1.2.3#53: queries sent 242802, retried or failed 0
Jul 16 13:45:50 server1 dnsmasq[427008]: server 100.2.3.4#53: queries sent 1371704, retried or failed 0
我已将缓存大小设置为 10000,这是允许的最大值。使用 dnsmasq 进行请求的应用程序也感觉很慢。如何理解 dnsmasq 日志并知道这些日志是否表示由于缓存大小低而导致的性能问题?
答案1
在回答这个问题之前我应该强调一下,我并不是 dnsmasq 方面的专家,但是结合手册页的日志确实看起来相当清楚:
当它收到 SIGUSR1 时,dnsmasq 会将统计信息写入系统日志。它会写入缓存大小、为了给新名称腾出空间而在缓存过期之前必须从缓存中删除的名称数量以及已插入缓存的名称总数。还会给出缓存命中和未命中的次数以及回答的权威查询数量。对于每个上游服务器,它会给出发送的查询数量以及导致错误的查询数量。在 --no-daemon 模式下或启用完整日志记录 (-q) 时,会完全转储缓存的内容。
因此,给出你的台词:
缓存大小 10000、18355/597070 缓存插入重新使用了未过期的缓存条目。
这一行有点令人困惑,但根据上面的文字,我认为这意味着在到期前必须删除 18355 个条目以腾出空间容纳新条目,而插入的总数为 597070。鉴于这两个数字都远远大于您的缓存,更大的缓存可能会带来一些好处,但是开发人员出于充分的理由将其限制为 10000。即使您可以增加它,它也可能无法很好地扩展,因此如果您确实需要更大的缓存,那么您可能使用了错误的工具。
7 月 16 日 13:45:50 server1 dnsmasq[427008]: 查询已转发 1510313,查询已在本地答复 15347110
您的大多数查询都在本地得到答复(提高了 10 倍),这很好,但是这些数字远远大于缓存利用率。对我来说,这表明您的许多请求由于某种原因无法缓存。
这可能是因为很多记录的 TTL 为零(例如 DHCP 记录通常具有零 TTL)。
另一方面,十分之一的请求必须从远程服务器获取,这可以解释感知到的缓慢。不过,从给出的信息来看,这是不可能的。
此外,即使您的所有查询都是可缓存的,但考虑到在到期前被逐出的条目数量,您似乎已经完全利用了缓存(尽管这取决于工作负载,但“突发”模式可能会导致大量驱逐)。
7 月 16 日 13:45:50 server1 dnsmasq[427008]: 服务器 100.1.2.3#53: 查询已发送 242802,重试或失败 0
7 月 16 日 13:45:50 server1 dnsmasq[427008]: 服务器 100.2.3.4#53: 查询已发送 1371704,重试或失败 0
这些行表明 100.2.3.4 从您的 dnsmasq 服务器收到的请求比 100.1.2.3 多得多。这可能不是问题的原因,但仍然很有趣。
附注:如果这些地址是您实际使用的,并且是 LAN 地址,您可能需要考虑更改它们。100.0.0.0/8 是一个可公开路由的地址块,因此您可能会在某处遇到混淆的路由器,试图将您的 DNS 查询路由到外部。即使您在所有路由器中都设置了静态路由,这仍然是不好的做法,因为您网络上的用户将无法访问该范围内的互联网上的任何内容。