爱意满满的作品展示区。
infinet

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

  •  1
     
  •   infinet ·
    infinet · Feb 21, 2015 · 27008 views
    This topic created in 4274 days ago, the information mentioned may be changed or developed.

    新年好!

    大家有没有发现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 replies  •  2020-02-27 02:48:51 +08:00
    JackBlack2006
    JackBlack2006
    Feb 21, 2015
    1
    这是个好思路, 可以提交给 dnsmasq 的原作者了吧

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

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

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

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

    预编译包更新到 OpenWrt 15.05 ,同时针对 ar71xx 和 mt7620 平台。联想 Newifi mini ,小米,斐讯等有用 mt7620 平台。
    paradislover
    paradislover
    Feb 17, 2016
    16
    @infinet 赞,给 dnsmasq 2.73 打个补丁
    BetaLe
    BetaLe
    Apr 14, 2016 via Android
    17
    @infinet 楼主能提升下 hosts 文件的性能不
    BetaLe
    BetaLe
    Apr 14, 2016 via Android
    18
    @infinet 我的 dnsmasq 引入 3 个 hosts 列表,包括广告恶意列表大概有 8w 条
    infinet
    infinet
    OP
    Apr 14, 2016
    19
    @BetaLe 不知道你用 hosts 列表作什么,

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

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

    上面这两种用法这个 patch 都优化了,不管是 8w 还是 800w 速度都同样飞快。
    infinet
    infinet
    OP
    Apr 14, 2016
    20
    800w 是夸张了点,没实测过。 8w 条应该无压力。
    BetaLe
    BetaLe
    Apr 15, 2016 via Android
    21
    @infinet 既然 ipset,add,server 选项都做了优化,希望把 hosts 再顺便做了
    infinet
    infinet
    OP
    Apr 15, 2016
    22
    @BetaLe 什么规则 hosts 能作到而上面介绍的 address 选项作不到?
    BetaLe
    BetaLe
    Apr 16, 2016 via Android
    23
    @infinet 算了,不抬杠了
    reguser12005
    reguser12005
    May 11, 2016
    24
    @infinet 问一下, 这样的 address 写法达不到目的, 应该怎么写?
    举例:
    address=/a.com/0.0.0.0
    这时候, 我 nslookup x.a.com, 得到的也是 0.0.0.0, 但事实上我只想要 a.com 是 0.0.0.0, 是我写法有误吗?
    infinet
    infinet
    OP
    May 11, 2016
    25
    @reguser12005 写法没错,你的要求在 hosts 里设置更合适。
    reguser12005
    reguser12005
    May 11, 2016
    26
    @infinet 谢谢, 看来还是离不开 hosts, 本来想抛弃 hosts 了
    doc
    doc
    Jun 3, 2016
    27
    做了一个测试,用 bind 的 queryperf ,三万多个不重复的域名
    DNS of ISP : 78qps
    不带任何 server 配置的原版 dnsmasq : 69qps
    带三万条 server 的原版 dnsmasq : 67qps
    可见,原版 dnsmasq 并没有慢多少,只是 cpu 占用接近 100%,设备是 openwrt 软路由, VIA nano 1.6G
    infinet
    infinet
    OP
    Jun 4, 2016
    28
    @doc 好奇 patch 版的测试结果如何?
    crystone
    crystone
    Oct 10, 2016
    29
    很赞啊
    smallthing
    smallthing
    Nov 3, 2016
    30
    @doc 作者也没说快了多少,但 cpu 爆满=做其他事情的空闲少了。这个大家都懂的
    gcell
    gcell
    Nov 8, 2016
    31
    求 2.73 版本!
    Ixs
    Ixs
    Nov 26, 2016
    32
    感谢楼主。极路由上也能使用,完美。
    Jasonkarl
    Jasonkarl
    Feb 9, 2017
    33
    求楼主适配
    LEDE 版本是 2.76 以上,希望针对新版本 dnsmasq 做 patch
    cokebar
    cokebar
    Feb 9, 2017
    34
    LEDE 发正式版后是个适配的好时机
    Jasonkarl
    Jasonkarl
    Feb 9, 2017
    35
    @infinet 求适配 lede 呀
    heiybb
    heiybb
    Feb 20, 2017
    36
    +1
    求适配 LEDE
    Jasonkarl
    Jasonkarl
    Feb 26, 2017
    38
    @infinet 非常非常感谢。
    Jasonkarl
    Jasonkarl
    Feb 28, 2017
    39
    @infinet LEDE 使用之后, dnsmasq.d 目录下放入两个 conf 文件,一个是国内域名指定 dns ,一个是国外域名指定 dns ,会出现 dns 无法解析,无线无法连接的情况。删除掉 conf 文件后正常。
    infinet
    infinet
    OP
    Feb 28, 2017
    40
    @Jasonkarl 请检查 conf 文件有没有语法或其它错误。
    Jasonkarl
    Jasonkarl
    Feb 28, 2017
    41
    Jasonkarl
    Jasonkarl
    Feb 28, 2017
    42
    另外 2.72 版本貌似正常
    Jasonkarl
    Jasonkarl
    Mar 1, 2017
    44
    @infinet 我不太懂, 2.77test4 还是恩山的一位朋友帮我才编译进 lede 的,他自己也用了,出现了同样的问题,你修改的 2.72 版本没有这些问题。
    Jasonkarl
    Jasonkarl
    Mar 1, 2017
    45
    @infinet 恩山的朋友给我说了下,我突然大彻大悟了……知道怎么回事了,已经在弄新固件了,看看这个怎么样。
    Jasonkarl
    Jasonkarl
    Mar 2, 2017
    46
    @infinet 62f9c0d47099f46cac941ce0ea103921999d244f 正常使用中……
    infinet
    infinet
    OP
    Mar 4, 2017
    47
    @Jasonkarl 我用类似的配置跑了几天,没能重现你的问题。你是用 github 上最新的 commit 吗?
    Jasonkarl
    Jasonkarl
    Mar 4, 2017
    48
    @infinet 我现在用的是 62f9c0d47099f46cac941ce0ea103921999d244f
    没有出现问题,以前出问题的是 43b63992572a0ebd114534c8e6abe89c58658b54
    f5cdd6ed76e2426f41dc0f43b6d922a0aaa03a92 还没有用过……
    Jasonkarl
    Jasonkarl
    Mar 5, 2017
    49
    f5cdd6ed76e2426f41dc0f43b6d922a0aaa03a92 未出现问题。 不过偶尔卡顿不知道是不是我网络的问题。
    hzqim
    hzqim
    Mar 22, 2017
    50
    谢谢楼主,能否加一个功能?
    加入正则表达式支持,谢谢。
    mattx
    mattx
    Aug 28, 2018
    51
    有个疑问, 现在一般用 ip chnroute 来做 ipset 规则, 然后 iptables 来转发, dnsmasq 这里拦截的规则挺少的, 问下楼主那么多规则一般是什么地方使用.
    NG6
    NG6
    Sep 19, 2018
    52
    @mattx 路由器的 SS 插件,跑大陆白名单的时候路由器压力很大
    mattx
    mattx
    Sep 19, 2018
    53
    @NG6 哦 大陆白名单应该是按照 ip 来分类吧, dns 方面用 chinadns 来解决 cdn 问题, 你意思是 dns 用 dnsmasq 来分类?
    brMu
    brMu
    Dec 14, 2018
    54
    armbian,已经编译安装成功,正常运行,特地来反馈,并表示感谢!
    brMu
    brMu
    Feb 27, 2019
    55
    老哥,all-servers 参数无效,我已经在 github 上反馈了,你能看到吗?
    infinet
    infinet
    OP
    Feb 27, 2019
    56
    写这个只是为了解决超大配置文件的效率问题。all-servers 没时间去研究,抱歉啊。
    reguser12005
    reguser12005
    Feb 26, 2020
    57
    @infinet 您好, 最新版的 dnsmasq 还需要打您的补丁吗?
    infinet
    infinet
    OP
    Feb 27, 2020
    58
    补丁不能用到最新版。大部分要重写。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4692 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 74ms · UTC 09:35 · PVG 17:35 · LAX 01:35 · JFK 04:35
    ♥ Do have faith in what you're doing.