Skip to content

缓存 ​

查询会先后经过两层缓存:mosproxy 的入口缓存和 Unbound 的递归缓存。九成的查询在第一层就返回了。

mosproxy:入口缓存 ​

设置值含义
mem_size64MB内存缓存上限
maximum_ttl3600缓存条目的 TTL 上限(秒)
prefetch_threshold0.25剩余 TTL 不到 1/4 时,命中会触发后台刷新
optimistic_ttl默认 7 天,可在面板调整过期之后还允许先回旧答案、后台刷新的时长

乐观缓存:过期的条目不会让设备等递归,而是先把旧答案回给设备,同时在后台刷新。热门域名因此几乎从不让设备等待。

带 ECS 的答案按「省份 + 运营商」分片缓存,见 ECS 就近调度。

Unbound:递归缓存 ​

设置值含义
msg-cache-size / rrset-cache-size128MB / 256MB报文与记录缓存
cache-min-ttl300,可在面板调整(0–300)强制最小 TTL
cache-max-ttl86400TTL 上限
prefetchyes热门记录在过期前预取
serve-expiredyes递归失败或太慢时回过期答案
serve-expired-ttl默认 7 天,可在面板调整过期答案最多还能用多久
serve-expired-client-timeout100 ms递归 100 ms 内没回来就先回过期答案
aggressive-nsecyes用 DNSSEC 的 NSEC 记录直接合成「不存在」

为什么最小 TTL 的上限压得这么低 ​

强制最小 TTL 会一并抬高 CDN 那些几十秒的短 TTL,而 CDN 正是靠短 TTL 做故障转移和就近调度的。抬得越高,命中率越高,调度精度越差。所以面板只允许 0–300 秒。

在面板里调整 ​

面板「设置 → 缓存与数据」里有两个下拉框,选完立即生效:

  • 过期后继续使用(乐观缓存):同时修改 Unbound 的 serve-expired-ttl(立即生效)和 mosproxy 的 optimistic_ttl(重启 mosproxy 后生效),两者保持成对。上限 30 天。
  • 最短缓存(最小 TTL):修改 Unbound 的 cache-min-ttl,立即生效。

两者都会同步写回配置文件,重启后不丢。重新运行 install.sh 时,安装脚本会保留这几项调过的值,不会被模板默认值覆盖。

自检的「Unbound 运行配置与模板一致」会跳过这两项:它们归面板管。

清缓存 ​

同一张卡片里的「清缓存」可以清掉某个域名及其子域,留空则全部清空。Unbound 和 mosproxy 两层一起清:

bash
unbound-control flush_zone example.com                       # Unbound
curl 'http://127.0.0.1:8888/ctl/flush?domain=example.com'    # mosproxy,不带 domain 清全部

mosproxy 的 /ctl/flush 从 fork 的 v0.2.1 开始才有;更早的版本只能清掉 Unbound,面板会在结果里注明。

被清掉的名字接下来都要重新走完整递归,短时间内延迟会明显升高。全部清空要慎用。

只有两台机器:一台国内,一台香港。