发一个改进版 dnsmasq,含预编译适用于 ar71xx 的 OpenWrt 包 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
infinet
V2EX    分享创造

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

  •  1
     
  •   infinet
    infinet 2015-02-21 09:49:22 +08:00 25512 次点击
    这是一个创建于 3885 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新年好!

    大家有没有发现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。

    58 条回复    2020-02-27 02:48:51 +08:00
    JackBlack2006
        1
    JackBlack2006  
       2015-02-21 10:09:53 +08:00
    这是个好思路, 可以提交给 dnsmasq 的原作者了吧

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

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

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

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

    预编译包更新到 OpenWrt 15.05 ,同时针对 ar71xx 和 mt7620 平台。联想 Newifi mini ,小米,斐讯等有用 mt7620 平台。
    paradislover
        16
    paradislover  
       2016-02-17 14:04:56 +08:00
    @infinet 赞,给 dnsmasq 2.73 打个补丁
    BetaLe
        17
    BetaLe  
       2016-04-14 15:30:23 +08:00 via Android
    @infinet 楼主能提升下 hosts 文件的性能不
    BetaLe
        18
    BetaLe  
       2016-04-14 15:42:33 +08:00 via Android
    @infinet 我的 dnsmasq 引入 3 个 hosts 列表,包括广告恶意列表大概有 8w 条
    infinet
        19
    infinet  
    OP
       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
        20
    infinet  
    OP
       2016-04-14 21:54:44 +08:00
    800w 是夸张了点,没实测过。 8w 条应该无压力。
    BetaLe
        21
    BetaLe  
       2016-04-15 10:05:59 +08:00 via Android
    @infinet 既然 ipset,add,server 选项都做了优化,希望把 hosts 再顺便做了
    infinet
        22
    infinet  
    OP
       2016-04-15 13:49:12 +08:00
    @BetaLe 什么规则 hosts 能作到而上面介绍的 address 选项作不到?
    BetaLe
        23
    BetaLe  
       2016-04-16 13:03:55 +08:00 via Android
    @infinet 算了,不抬杠了
    reguser12005
        24
    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
        25
    infinet  
    OP
       2016-05-11 17:12:19 +08:00
    @reguser12005 写法没错,你的要求在 hosts 里设置更合适。
    reguser12005
        26
    reguser12005  
       2016-05-11 21:36:26 +08:00
    @infinet 谢谢, 看来还是离不开 hosts, 本来想抛弃 hosts 了
    doc
        27
    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
        28
    infinet  
    OP
       2016-06-04 14:41:14 +08:00
    @doc 好奇 patch 版的测试结果如何?
    crystone
        29
    crystone  
       2016-10-10 08:33:14 +08:00
    很赞啊
    smallthing
        30
    smallthing  
       2016-11-03 11:12:39 +08:00
    @doc 作者也没说快了多少,但 cpu 爆满=做其他事情的空闲少了。这个大家都懂的
    gcell
        31
    gcell  
       2016-11-08 13:07:53 +08:00
    求 2.73 版本!
    Ixs
        32
    Ixs  
       2016-11-26 12:29:46 +08:00
    感谢楼主。极路由上也能使用,完美。
    Jasonkarl
        33
    Jasonkarl  
       2017-02-09 17:09:56 +08:00
    求楼主适配
    LEDE 版本是 2.76 以上,希望针对新版本 dnsmasq 做 patch
    cokebar
        34
    cokebar  
       2017-02-09 17:29:30 +08:00
    LEDE 发正式版后是个适配的好时机
    Jasonkarl
        35
    Jasonkarl  
       2017-02-09 21:26:42 +08:00
    @infinet 求适配 lede 呀
    heiybb
        36
    heiybb  
       2017-02-20 14:07:40 +08:00
    +1
    求适配 LEDE
    infinet
        37
    infinet  
    OP
       2017-02-25 20:16:03 +08:00
    Jasonkarl
        38
    Jasonkarl  
       2017-02-26 01:16:42 +08:00
    @infinet 非常非常感谢。
    Jasonkarl
        39
    Jasonkarl  
       2017-02-28 10:23:14 +08:00
    @infinet LEDE 使用之后, dnsmasq.d 目录下放入两个 conf 文件,一个是国内域名指定 dns ,一个是国外域名指定 dns ,会出现 dns 无法解析,无线无法连接的情况。删除掉 conf 文件后正常。
    infinet
        40
    infinet  
    OP
       2017-02-28 14:24:42 +08:00
    @Jasonkarl 请检查 conf 文件有没有语法或其它错误。
    Jasonkarl
        41
    Jasonkarl  
       2017-02-28 16:13:48 +08:00
    Jasonkarl
        42
    Jasonkarl  
       2017-02-28 16:15:33 +08:00
    另外 2.72 版本貌似正常
    infinet
        43
    infinet  
    OP
       2017-03-01 09:20:30 +08:00
    Jasonkarl
        44
    Jasonkarl  
       2017-03-01 13:37:44 +08:00
    @infinet 我不太懂, 2.77test4 还是恩山的一位朋友帮我才编译进 lede 的,他自己也用了,出现了同样的问题,你修改的 2.72 版本没有这些问题。
    Jasonkarl
        45
    Jasonkarl  
       2017-03-01 21:45:14 +08:00
    @infinet 恩山的朋友给我说了下,我突然大彻大悟了……知道怎么回事了,已经在弄新固件了,看看这个怎么样。
    Jasonkarl
        46
    Jasonkarl  
       2017-03-02 17:16:04 +08:00
    @infinet 62f9c0d47099f46cac941ce0ea103921999d244f 正常使用中……
    infinet
        47
    infinet  
    OP
       2017-03-04 10:24:48 +08:00
    @Jasonkarl 我用类似的配置跑了几天,没能重现你的问题。你是用 github 上最新的 commit 吗?
    Jasonkarl
        48
    Jasonkarl  
       2017-03-04 15:24:21 +08:00
    @infinet 我现在用的是 62f9c0d47099f46cac941ce0ea103921999d244f
    没有出现问题,以前出问题的是 43b63992572a0ebd114534c8e6abe89c58658b54
    f5cdd6ed76e2426f41dc0f43b6d922a0aaa03a92 还没有用过……
    Jasonkarl
        49
    Jasonkarl  
       2017-03-05 12:13:52 +08:00
    f5cdd6ed76e2426f41dc0f43b6d922a0aaa03a92 未出现问题。 不过偶尔卡顿不知道是不是我网络的问题。
    hzqim
        50
    hzqim  
       2017-03-22 21:40:55 +08:00
    谢谢楼主,能否加一个功能?
    加入正则表达式支持,谢谢。
    mattx
        51
    mattx  
       2018-08-28 14:34:41 +08:00
    有个疑问, 现在一般用 ip chnroute 来做 ipset 规则, 然后 iptables 来转发, dnsmasq 这里拦截的规则挺少的, 问下楼主那么多规则一般是什么地方使用.
    NG6
        52
    NG6  
       2018-09-19 21:21:15 +08:00
    @mattx 路由器的 SS 插件,跑大陆白名单的时候路由器压力很大
    mattx
        53
    mattx  
       2018-09-19 22:01:39 +08:00
    @NG6 哦 大陆白名单应该是按照 ip 来分类吧, dns 方面用 chinadns 来解决 cdn 问题, 你意思是 dns 用 dnsmasq 来分类?
    brMu
        54
    brMu  
       2018-12-14 16:07:14 +08:00
    armbian,已经编译安装成功,正常运行,特地来反馈,并表示感谢!
    brMu
        55
    brMu  
       2019-02-27 13:53:38 +08:00
    老哥,all-servers 参数无效,我已经在 github 上反馈了,你能看到吗?
    infinet
        56
    infinet  
    OP
       2019-02-27 21:17:17 +08:00
    写这个只是为了解决超大配置文件的效率问题。all-servers 没时间去研究,抱歉啊。
    reguser12005
        57
    reguser12005  
       2020-02-26 12:24:13 +08:00
    @infinet 您好, 最新版的 dnsmasq 还需要打您的补丁吗?
    infinet
        58
    infinet  
    OP
       2020-02-27 02:48:51 +08:00
    补丁不能用到最新版。大部分要重写。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6028 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 02:17 PVG 10:17 LAX 19:17 JFK 22:17
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86