V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
infinet
V2EX  ›  分享创造

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

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

    新年好!

    大家有没有发现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   ·   我们的愿景   ·   实用小工具   ·   2427 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:00 · PVG 00:00 · LAX 09:00 · JFK 12:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.