发一个改进版 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。

24490 次点击
所在节点    分享创造
58 条回复
JackBlack2006
2015-02-21 10:09:53 +08:00
这是个好思路, 可以提交给 dnsmasq 的原作者了吧

顺路 @aa65535
cj1324
2015-02-21 10:12:04 +08:00
点赞
infinet
2015-02-21 11:09:20 +08:00
@JackBlack2006 已经提交dnsmasq邮件列表,不过估计一时半会儿不会被接受,关键还是这方面的需求不强,毕竟全世界象咱们这样常规使用超大dnsmasq配置文件的地方不多。
JackBlack2006
2015-02-21 11:28:38 +08:00
@infinet 其实对于搞 X86 软路由的人来说, 超大 dnsmasq 配置文件不是问题,

把 dnsmasq 装在 X86 本机上也不是问题...
JackBlack2006
2015-02-21 11:34:30 +08:00
不好意思跑题了, 见谅
kelso
2015-02-21 21:40:37 +08:00
感谢!点赞!
aa65535
2015-02-21 22:27:01 +08:00
Good job!
这个算性能优化,将 patch 说明清楚的话,作者是没理由不会接受的。
infinet
2015-02-22 09:19:01 +08:00
@aa65535 原作者有些纠结,一方面这部分代码历史悠久且"scary"(作者原话),当初那里想的到有人会加载成百上千行server/address之类的配置项,确有改动的必要;另一方面dnsmasq里用类似链表遍历的地方不少,改了这个部分,其它部分需不需要改?这些代码虽然效率不高,但都久经考验,都改的话,出了新bug找谁说理去,再说工作量还很大。

补充一下,本改进版优化了以下几个配置项:
--server, --local, --address, --rebind-domain-ok, --ipset
LazyZhu
2015-02-22 15:12:34 +08:00
看来下个版本是没希望整合了这个了,其实提交ipset支持补丁的作者也提过类似tree的加速方式。http://git.zx2c4.com/domain-lookup-tree/tree/README.md
infinet
2015-02-23 10:23:16 +08:00
@LazyZhu 是啊,对多数地方来说现在的dnsmasq就够用了。ipset作者的设想看过了,基本上也是遍历,只不过是从遍历完整域名改为分级遍历com/org/net, 然后qq/google/v2ex/...。感觉他们设计的时候想象的应用场景是几条或者十几条ipset/server之类的配置项。
infinet
2015-03-23 11:04:09 +08:00
dnsmasq增加了一个新语法:
用 "--address=/malware.com/" 来屏蔽恶意网站。

本补丁现也加入此配置项。
rwzsycwan
2015-03-25 21:50:04 +08:00
@infinet "--address=/malware.com/" 怎么愉快地使用??
rwzsycwan
2015-03-25 22:15:43 +08:00
@infinet 好吧 我明白了 吧以前的--address=/malware.com/0.0.0.0 后面的0.0.0.0去掉就可以了
Samloya
2015-04-22 17:04:17 +08:00
@infinet 这是基于aa65535 openwrt-dist 提供的 dnsmasq 上面的再优化版本么?
infinet
2016-01-29 19:58:01 +08:00
@Samloya 不是,这个是从上游 dnsmasq 2.72 改的。

预编译包更新到 OpenWrt 15.05 ,同时针对 ar71xx 和 mt7620 平台。联想 Newifi mini ,小米,斐讯等有用 mt7620 平台。
paradislover
2016-02-17 14:04:56 +08:00
@infinet 赞,给 dnsmasq 2.73 打个补丁
BetaLe
2016-04-14 15:30:23 +08:00
@infinet 楼主能提升下 hosts 文件的性能不
BetaLe
2016-04-14 15:42:33 +08:00
@infinet 我的 dnsmasq 引入 3 个 hosts 列表,包括广告恶意列表大概有 8w 条
infinet
2016-04-14 21:34:43 +08:00
@BetaLe 不知道你用 hosts 列表作什么,

如果是用 host 指定 ip ,那么在配置文件里用 address=/example.com/1.2.3.4 , 效果是一样的;

如果是反恶意网站,在配置文件里用 address=/malware.com/ , 就会把 malware.com 解析为 NXDOMAIN ,起到过滤的效果。

上面这两种用法这个 patch 都优化了,不管是 8w 还是 800w 速度都同样飞快。
infinet
2016-04-14 21:54:44 +08:00
800w 是夸张了点,没实测过。 8w 条应该无压力。

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

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

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

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

© 2021 V2EX