添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement . We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account
  • 我已经尝试搜索过 Issue ,但没有找到相关问题。
  • 我正在使用最新的 mosdns 版本(或者最新的 commit),问题依旧存在。
  • 我仔细看过 wiki 后仍然无法自行解决该问题。
  • 我非常确定这是 mosdns 核心的问题。(如果是通过第三方衍生软件使用 mosdns 核心,不确定问题源头时,请先向衍生软件开发者提交问题。)
  • mosdns 版本

    v5.1.3

    Openwrt LEDE 当前最新仓库代码+PW最新版本

    Bug 描述和复现步骤

    如题所示,5.1.3如果设置为dnsmasq上游,且启用lazy cache的时候,在main sequence里查询lazy cache,会导致dnsmasq 周期性的CPU浪涌,关掉cache能减缓这种现象。通过openwrt上netdata和htop可以观测到(htop就不贴了)

    使用的配置文件

    log:
      level: error
      file: "/mnt/sdc1/mosdns/mosdns.log"
    # API 入口设置
    api:
      http: "0.0.0.0:9091"
    include: []
    plugins:
      # 国内域名
      - tag: geosite_cn
        type: domain_set
        args:
          files:
            - "/var/mosdns/geosite_cn.txt"
      # 国内ip
      - tag: geoip_cn
        type: ip_set
        args:
          files:
            - "/var/mosdns/geoip_cn.txt"
      # Google CN
      - tag: geosite_google_cn
        type: domain_set
        args:
          files:
            - "/var/mosdns/geosite_google-cn.txt"	
      # 国外域名
      - tag: geosite_no_cn
        type: domain_set
        args:
          files:
            - "/var/mosdns/geosite_geolocation-!cn.txt"
      # 白名单 加入的域名始终允许使用 “本地 DNS” 进行解析
      - tag: whitelist
        type: domain_set
        args:
          files:
            - "/etc/mosdns/rule/whitelist.txt"
      # 黑名单 加入的域名将屏蔽 DNS 解析
      - tag: blocklist
        type: domain_set
        args:
          files:
            - "/etc/mosdns/rule/blocklist.txt"
      # 灰名单 加入的域名始终使用 “远程 DNS” 进行解析
      - tag: greylist
        type: domain_set
        args:
          files:
            - "/etc/mosdns/rule/greylist.txt"
      # DDNS域名 加入的域名始终使用 “本地 DNS” 进行解析,并且修改 TTL 为 5 秒,解析结果不进行缓存
      - tag: ddnslist
        type: domain_set
        args:
          files:
            - "/etc/mosdns/rule/ddnslist.txt"
      # 自定义 Hosts 重写
      - tag: hosts
        type: hosts
        args:
          files:
            - "/etc/mosdns/rule/hosts.txt"
      # 重定向请求的域名
      - tag: redirect
        type: redirect
        args:
          files:
            - "/etc/mosdns/rule/redirect.txt"
      # PTR 黑名单 加入的域名将阻止 PTR 请求
      - tag: local_ptr
        type: domain_set
        args:
          files:
            - "/etc/mosdns/rule/local-ptr.txt"
      # 屏蔽失效/威胁 URL
      - tag: sp_low
        type: domain_set
        args:
          files:
            - "/usr/share/mosdns/sp_low.tdata"
      - tag: lazy_cache
        type: cache
        args:
          size: 20000
          lazy_cache_ttl: 86400
          dump_file: "/etc/mosdns/cache.dump"
          dump_interval: 600
      # 转发至本地服务器
      - tag: forward_local
        type: forward
        args:
          upstreams:
            - addr: https://doh.pub/dns-query
              bootstrap: 223.5.5.5
      # 转发至远程服务器
      - tag: forward_remote
        type: forward
        args:
          upstreams:
            - addr: https://1.1.1.1/dns-query
              enable_pipeline: false
      # 修改ttl(默认0 不修改ttl)
      - tag: modify_ttl
        type: sequence
        args:
          - exec: ttl 0-0
      # 修改 ddns 域名 ttl(默认 5秒)
      - tag: modify_ddns_ttl
        type: sequence
        args:
          - exec: ttl 5-5
      # 国内解析
      - tag: local_sequence
        type: sequence
        args:
          - exec: $forward_local
      # 国外解析
      - tag: remote_sequence
        type: sequence
        args:
          - exec: prefer_ipv4
          - exec: $forward_remote
      # 有响应则修改 TTL 并终止返回
      - tag: has_resp_sequence
        type: sequence
        args:
          - matches: qname $ddnslist
            exec: $modify_ddns_ttl
          - matches: "!qname $ddnslist"
            exec: $modify_ttl
          - matches: has_resp
            exec: accept
      # fallback 用本地服务器 sequence
      # 返回非国内 ip 则 drop_resp
      - tag: query_is_local_ip
        type: sequence
        args:
          - exec: $local_sequence
          - matches: "!resp_ip $geoip_cn"
            exec: drop_resp
      # fallback 用远程服务器 sequence
      - tag: query_is_remote
        type: sequence
        args:
          - exec: $remote_sequence
      # fallback 用远程服务器 sequence
      - tag: fallback
        type: fallback
        args:
          primary: query_is_remote
          secondary: query_is_remote
          threshold: 500
          always_standby: true
      # 查询 DDNS 域名
      - tag: query_is_ddns_domain
        type: sequence
        args:
          - matches: qname $ddnslist
            exec: $local_sequence
       #查询国内Google域名
      - tag: query_is_google_cn_domain
        type: sequence
        args:
          - matches: qname $geosite_google_cn
            exec: $remote_sequence
      # 查询国内域名
      - tag: query_is_local_domain
        type: sequence
        args:
          - matches: qname $geosite_cn
            exec: $local_sequence
      # 查询国外域名
      - tag: query_is_no_local_domain
        type: sequence
        args:
          - matches: qname $geosite_no_cn
            exec: $remote_sequence
      # 查询白名单
      - tag: query_is_whitelist_domain
        type: sequence
        args:
          - matches: qname $whitelist
            exec: $local_sequence
      # 查询灰名单
      - tag: query_is_greylist_domain
        type: sequence
        args:
          - matches: qname $greylist
            exec: $remote_sequence
      # 拒绝名单
      - tag: query_is_reject_domain
        type: sequence
        args:
          - matches: qname $blocklist
            exec: reject 3
          - matches: qname $sp_low
            exec: reject 3
          - matches:
            - qtype 12
            - qname $local_ptr
            exec: reject 3
          - matches: qtype 65
            exec: reject 3
      # 主要的运行逻辑插件
      # sequence 插件中调用的插件 tag 必须在 sequence 前定义,
      # 否则 sequence 找不到对应插件。
      - tag: main_sequence
        type: sequence
        args:
          - exec: $hosts
          - exec: jump has_resp_sequence
          # 非 “拒绝名单” 或 “DDNS域名” 则启用缓存
          - matches:
            - "!qname $ddnslist"
            - "!qname $blocklist"
            - "!qname $sp_low"
            - "!qname $local_ptr"
            #exec: $lazy_cache
            exec: $redirect
          - exec: jump has_resp_sequence
          - exec: $query_is_ddns_domain
          - exec: jump has_resp_sequence
          - exec: $query_is_whitelist_domain
          - exec: jump has_resp_sequence
          - exec: $query_is_reject_domain
          - exec: jump has_resp_sequence
          - exec: $query_is_greylist_domain
          - exec: jump has_resp_sequence
          - exec: $query_is_google_cn_domain
          - exec: jump has_resp_sequence
          - exec: $query_is_local_domain
          - exec: jump has_resp_sequence
          - exec: $query_is_no_local_domain
          - exec: jump has_resp_sequence
          - exec: $fallback
      # 启动 udp 服务器。
      - tag: udp_server
        type: udp_server
        args:
          entry: main_sequence
          listen: ":5335"
      # 启动 tcp 服务器。
      - tag: tcp_server
        type: tcp_server
        args:
          entry: main_sequence
          listen: ":5335"

    mosdns 的 log 记录

    日志设置成error最高级别,减少因为日志IO带来的问题判断干扰
    2023-08-09T14:33:41.781Z	INFO	unpacking entry	{"tag": "cn", "length": 11543, "file": "/var/mosdns/geoip_cn.txt"}
    2023-08-09T14:33:41.887Z	INFO	unpacking entry	{"tag": "cn", "length": 66054, "file": "/var/mosdns/geosite_cn.txt"}
    2023-08-09T14:33:41.890Z	INFO	unpacking entry	{"tag": "geolocation-!cn", "length": 19212, "file": "/var/mosdns/geosite_geolocation-!cn.txt"}
    2023-08-09T14:33:41.997Z	INFO	unpacking entry	{"tag": "google-cn", "length": 159, "file": "/var/mosdns/geosite_google-cn.txt"}

    lazy cache 是实验性功能,毕竟破坏了 dns 协议 ttl 的功能,不兼容是正常的。如果出问题建议直接关掉。

    你的 mosdns 似乎是修改版。原版的 mosdns 应该不会打印上述 log。“unpacking entry”

    我感觉是cache本身的性能问题(或者是go的问题?),导致dnsmasq后端被阻塞,所以会有delta peak效应,暂时的workaround就是关掉mosdns的cache用dnsmasq端的cache。另外,是用的原版啊,我看了lede仓库的make file是用的这里的啊

    我感觉是cache本身的性能问题(或者是go的问题?),导致dnsmasq后端被阻塞,所以会有delta peak效应,暂时的workaround就是关掉mosdns的cache用dnsmasq端的cache。另外,是用的原版啊,我看了lede仓库的make file是用的这里的啊

    阻塞不占 cpu,如果是 dnsmasq cpu 占用高,最可能的就是 mosdns 并发了大量请求打在了 dnsmasq 上。开 debug 日志可以看到 lazy cache 有没有往上游 dnsmasq 发送请求。

    另外,我搜了源代码,mosdns 真不会打印 “unpacking entry” 然后报告载入了的列表有多少条。这功能我之前想加的但是鸽了。

    搜到了。这是 v2dat 的日志。