发一个改进版 dnsmasq,含预编译适用于 ar71xx 的 OpenWrt 包

2015-02-21 09:49:22 +08:00
 infinet

新年好!

大家有没有发现dnsmasq配置文件里的ipset,address,server条目一多,路由器CPU使用率就上去了。往路由器/etc/dnsmasq.d/目录下放一个含几百上千条server的配置文件,试试就知道了。

这里介绍的是针对这个问题的改进版。原版dnsmasq处理这几个配置项的方法是遍历链表,一个dns查询可能要多次遍历一个几千上万项的链表,自然需要匹配的域名越多越慢。这个部分现在改成查询hash表,效果很明显:
在一个32M内存/500MHzCPU路由器上用dnsblast作压力测试,原版dnsmasq每秒接受90-100个dns请求时CPU使用率就飙升到近100%, 而改进版这时CPU使用率在20%上下。我估计如果配置文件再大些,可能每秒几十个甚至十几个dns查询就能让原版dnsmasq爆表。

下载在https://github.com/infinet/dnsmasq ,有适用于OpenWrt 12.09和14.07的预编译包。下载后复制到路由器/tmp目录,先opkg remove dnsmasq删除原来的dnsmasq,然后opkg install /tmp/xxxx.ipk,安装前最好备份一下/etc/dnsmasq.conf和/etc/config/dhcp。

24511 次点击
所在节点    分享创造
58 条回复
BetaLe
2016-04-15 10:05:59 +08:00
@infinet 既然 ipset,add,server 选项都做了优化,希望把 hosts 再顺便做了
infinet
2016-04-15 13:49:12 +08:00
@BetaLe 什么规则 hosts 能作到而上面介绍的 address 选项作不到?
BetaLe
2016-04-16 13:03:55 +08:00
@infinet 算了,不抬杠了
reguser12005
2016-05-11 16:04:20 +08:00
@infinet 问一下, 这样的 address 写法达不到目的, 应该怎么写?
举例:
address=/a.com/0.0.0.0
这时候, 我 nslookup x.a.com, 得到的也是 0.0.0.0, 但事实上我只想要 a.com 是 0.0.0.0, 是我写法有误吗?
infinet
2016-05-11 17:12:19 +08:00
@reguser12005 写法没错,你的要求在 hosts 里设置更合适。
reguser12005
2016-05-11 21:36:26 +08:00
@infinet 谢谢, 看来还是离不开 hosts, 本来想抛弃 hosts 了
doc
2016-06-03 14:58:55 +08:00
做了一个测试,用 bind 的 queryperf ,三万多个不重复的域名
DNS of ISP : 78qps
不带任何 server 配置的原版 dnsmasq : 69qps
带三万条 server 的原版 dnsmasq : 67qps
可见,原版 dnsmasq 并没有慢多少,只是 cpu 占用接近 100%,设备是 openwrt 软路由, VIA nano 1.6G
infinet
2016-06-04 14:41:14 +08:00
@doc 好奇 patch 版的测试结果如何?
crystone
2016-10-10 08:33:14 +08:00
很赞啊
smallthing
2016-11-03 11:12:39 +08:00
@doc 作者也没说快了多少,但 cpu 爆满=做其他事情的空闲少了。这个大家都懂的
gcell
2016-11-08 13:07:53 +08:00
求 2.73 版本!
Ixs
2016-11-26 12:29:46 +08:00
感谢楼主。极路由上也能使用,完美。
Jasonkarl
2017-02-09 17:09:56 +08:00
求楼主适配
LEDE 版本是 2.76 以上,希望针对新版本 dnsmasq 做 patch
cokebar
2017-02-09 17:29:30 +08:00
LEDE 发正式版后是个适配的好时机
Jasonkarl
2017-02-09 21:26:42 +08:00
@infinet 求适配 lede 呀
heiybb
2017-02-20 14:07:40 +08:00
+1
求适配 LEDE
infinet
2017-02-25 20:16:03 +08:00
Jasonkarl
2017-02-26 01:16:42 +08:00
@infinet 非常非常感谢。
Jasonkarl
2017-02-28 10:23:14 +08:00
@infinet LEDE 使用之后, dnsmasq.d 目录下放入两个 conf 文件,一个是国内域名指定 dns ,一个是国外域名指定 dns ,会出现 dns 无法解析,无线无法连接的情况。删除掉 conf 文件后正常。
infinet
2017-02-28 14:24:42 +08:00
@Jasonkarl 请检查 conf 文件有没有语法或其它错误。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/172010

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX