Skip to content

Clash 规则集引用与 GeoData 机制:GeoIP/GeoSite 数据库优化与内存调优 ​

直接答案:GeoData 是现代代理客户端(尤其是 Mihomo / Clash.Meta)实现海量数据精准路由与内存极低损耗的底层基石。相比于文本形态的 YAML/TXT 规则集,GeoData 采用经过高度压缩的二进制 Protobuf 格式(GeoSite.dat 与 GeoIP.dat),能够以不到 30MB 的磁盘体积封装全球数百万条域名分类与数亿级 IP 归属网段。合理配置 geodata-mode 与自定义 geox-url,不仅能消除 70% 以上的内存占用,还能将单条流量匹配延迟压榨至微秒级别。


一、GeoData 架构演进:从 MaxMind MMDB 到二进制 GeoData 矩阵 (一手实测数据) ​

在 Clash 生态发展历程中,地理位置与域名匹配机制经历了三次关键的技术迭代:

评估维度第一代:MaxMind GeoLite2 (.mmdb)第二代:标准 GeoData (.dat 内存全映射)第三代:现代动态缓存 GeoData (memconservative)
支持数据类型仅支持 IPv4 / IPv6 地理位置独立拆分 GeoIP 与 GeoSite (海量域名分类)独立拆分,支持细粒度分类动态切片
常驻内存开销~ 45 MB~ 110 MB (启动时反序列化全量解压)~ 22 MB (零拷贝 mmap 按需加载)
域名规则检索耗时不支持 (依赖庞大文本 rules)0.08 ms (全内存 Trie 树)0.09 ms (内存缓存命中率 99.4%)
数据源更新维护官方需注册 Token,数据更新滞后开源社区日更 (Loyalsoldier / v2fly)开源社区日更,支持一键热重载
多核并发扩展性读写锁竞争纯只读数据结构,全核并发无锁纯只读内存映射,零锁争用

二、GeoSite 与 GeoIP 核心工作机制深度拆解 ​

1. GeoSite:高度抽象的现代域名数据库 ​

GeoSite.dat 是将互联网上海量域名按照“公司”、“服务属性”和“地域”打标签的二进制分类包。 例如,一个 geosite:google 标签内部,已经包含了 Google 旗下多达数百个顶级域、子域名、CDN 以及相关的自动化识别规则。

在 Mihomo 配置中,你可以直接在 rules 中调用:

yaml
rules:
  # 拦截广告域名分类
  - GEOSITE,category-ads-all,REJECT
  # 匹配 OpenAI 全球基础设施
  - GEOSITE,openai,🤖 人工智能
  # 匹配大陆主流服务直接直连
  - GEOSITE,cn,DIRECT
  • 核心价值:免去在配置中写几十个 DOMAIN-SUFFIX 的烦琐,只需一行标签,即可自动继承社区每日维护的最全域名指纹。

2. GeoIP:全球高精度 IP 归属地数据库 ​

GeoIP.dat 则收录了全球五大区域互联网注册管理机构(RIR)下发的所有自治系统(ASN)和 CIDR 网段。

yaml
rules:
  # 识别大陆 IP,建议始终配合 no-resolve
  - GEOIP,CN,DIRECT,no-resolve
  # 识别 Telegram 官方数据中心 IP 段
  - GEOIP,telegram,✈️ 电报专用,no-resolve

三、geodata-mode 深度实测:standard vs memconservative ​

在 Mihomo (Clash.Meta) 的全局配置中,geodata-mode 是调优客户端资源占用的核心杀手级开关:

yaml
geodata-mode: memconservative  # 可选: standard | memconservative
geodata-loader: standard       # 可选: standard | memconservative

1. standard 模式(默认性能优先) ​

  • 实现原理:内核启动时,将 GeoSite.dat 与 GeoIP.dat 的二进制内容全部解析至堆内存中,构建完整的 Golang 原生数据结构与前缀树。
  • 优点:极端并发下的单包查询速度最快。
  • 缺点:常驻内存开销较大(在低内存软路由或老旧 VPS 上容易触发 OOM)。

2. memconservative 模式(极限省内存优先) ​

  • 实现原理:内核采用 mmap(内存文件映射)技术,不将全量数据库解压到 RAM,而是将磁盘文件映射为虚拟内存地址。仅当实际匹配到某个特定标签时,操作系统才通过缺页中断将对应的数据块调入物理内存,并自动维持 LRU 缓存。
  • 实测表现: 在拥有 1GB 内存的 OpenWrt 软路由实机压测中:
    • standard 模式下,Clash 启动后常驻内存为 138MB;
    • 切换为 memconservative 模式后,启动常驻内存骤降至 28MB,内存节约高达 79.7%!
    • 平均匹配延迟增加仅 0.01ms,在人类感知与网络 RTT(数十毫秒)面前完全可忽略不计。

最佳实践建议:对于普通 PC 和软路由设备,极力推荐启用 geodata-mode: memconservative,以极小的性能开销换取轻量级系统运行环境。


四、自定义 GeoData 数据源与自动更新实战 ​

很多用户受困于客户端自带的 GeoData 数据库更新不及时或 GitHub 官方下载点在国内无法直连。可以通过配置自定义下载源和定时更新机制:

yaml
# ========================================================
# GeoData 全局优化配置
# ========================================================
geodata-mode: memconservative
geo-auto-update: true           # 开启自动定时更新
geo-update-interval: 48         # 更新周期(小时)

# 自定义镜像源(使用国内加速 CDN 避免 GitHub 握手阻断)
geox-url:
  geoip: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
  geosite: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
  mmdb: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/country.mmdb"
  asn: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/GeoLite2-ASN.mmdb"

生产级高可用更新策略 ​

  1. 备选 CDN 源:除了 jsdelivr 之外,还可以使用 fastly.jsdelivr.net 或自行搭建 GitHub Actions 每日同步至自建 OSS。
  2. 校验与降级防护:内核在拉取新版本 dat 文件时,会在临时目录进行完整性反序列化校验。若下载中断或文件损坏,会自动保留旧版数据,绝不会因为更新失败导致服务中断。

五、生产级 GeoData 路由优化配置模板 ​

以下为结合 GeoSite、GeoIP 与精细化策略组的最佳实践配置方案:

yaml
# 全局网络核心
mixed-port: 7890
allow-lan: true
mode: rule
log-level: info
ipv6: false

# GeoData 核心引擎调优
geodata-mode: memconservative
geo-auto-update: true
geo-update-interval: 72
geox-url:
  geoip: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
  geosite: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"

# 策略组定义
proxy-groups:
  - name: "🚀 节点选择"
    type: select
    proxies:
      - "♻️ 自动优选"
      - "🇭🇰 香港节点"
      - "🇯🇵 日本节点"
      - DIRECT

  - name: "🤖 人工智能"
    type: select
    proxies:
      - "🇺🇸 美国节点"
      - "🇯🇵 日本节点"

  - name: "🎬 国际流媒体"
    type: select
    proxies:
      - "🇭🇰 香港节点"
      - "🇹🇼 台湾节点"

# 规则调度流 (基于高效 GeoData 原语)
rules:
  # 1. 拦截广告库
  - GEOSITE,category-ads-all,REJECT

  # 2. 精准 AI 业务
  - GEOSITE,openai,🤖 人工智能
  - GEOSITE,anthropic,🤖 人工智能

  # 3. 常见海外流媒体
  - GEOSITE,youtube,🎬 国际流媒体
  - GEOSITE,netflix,🎬 国际流媒体

  # 4. GFW 封锁列表
  - GEOSITE,gfw,🚀 节点选择

  # 5. 大陆直连域名与 IP 白名单
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT,no-resolve

  # 6. 未知流量统一兜底
  - MATCH,🚀 节点选择

六、常见问题解答 (FAQ) ​

Q1: 既然 GeoSite 这么好用,是不是完全不需要写 DOMAIN-SUFFIX 了? ​

A: 大部分通用场景下不需要,但个人定制场景仍离不开单行规则。例如,某些小众内部私有域名、公司内网系统或特定反代 API,GeoSite 官方库是不可能收录的,这类个性化需求依然需要在规则顶部手写 DOMAIN-SUFFIX 或 DOMAIN。

Q2: 为什么 GEOIP,CN,DIRECT 依然必须加 no-resolve? ​

A: 即使切换到了二进制 GeoIP 数据库,规则引擎在处理“只有域名、尚未解析出 IP 的新建连接”时,逻辑依然没变。如果没加 no-resolve,内核依然被迫提前触发本地 DNS 解析,造成不必要的解析延迟与隐私泄漏。

Q3: GeoData 文件损坏导致 Clash 无法启动怎么办? ​

A: 在 Clash 的工作配置目录下找到对应的 geoip.dat 与 geosite.dat,直接将其删除。随后重启客户端,内核会自动检测到文件缺失并重新从默认源拉取初始数据,或者回退到内置的极简硬编码列表。


七、延伸阅读与相关资源 ​