smartdns
smartdns copied to clipboard
大缓存+域名预获取,会持续更新缓存里所有的DNS么?
阅读readme得知: 域名预获取功能,将在域名 TTL 即将超时时,再次发送查询请求,并缓存查询结果供后续使用。
请问, 1、如果缓存10万条,开启域名预获取,TTL 10分钟,那10万条缓存都会每10分钟不断的请求更新么?还是怎样判断“频繁访问的网站”? 2、预获取 和 过期缓存 的区别,个人理解是 一个过期前请求,一个过期时请求,本质上都不断请求更新,对CPU压力一样大么? 3、TTL最大最小值,有建议数值么?日常家用。
新手请教,多多见谅!
好问题,我也想知道。
缓存是有热度的,频繁访问的域名会持续保留,相反,访问一次的域名,会很快删除掉。 另外,就是过期缓存,策略是不同的,过期缓存会每半天刷新一次记录,而不会持续刷新。 不访问的域名将在3天后删除。 还有就是缓存刷新频率限制,每2s最多处理16条记录。
对于上述问题:
- 家庭使用,一般域名量在1~2W条,这些经过热度淘汰,保留的也就1000条左右,这些占不了多少资源。
- 预获取是持续更新,消耗的CPU相比过期缓存多很多。过期缓存是TTL超时后,缓存变成冷数据,但不会主动更新,只有客户端请求的时候,才会更新,当前默认使用过期缓存。
- 设置min为600s即可
如果没有特别的功能需求,只是作为主DNS使用的话,直接使用默认值就可以了,设置多个国内外的上游。 也可以在默认配置的基础上增加开启prefetch-domain功能。和开启缓存持久化功能。
缓存是有热度的,频繁访问的域名会持续保留,相反,访问一次的域名,会很快删除掉。 另外,就是过期缓存,策略是不同的,过期缓存会每半天刷新一次记录,而不会持续刷新。 不访问的域名将在3天后删除。 还有就是缓存刷新频率限制,每2s最多处理16条记录。
对于上述问题:
- 家庭使用,一般域名量在1~2W条,这些经过热度淘汰,保留的也就1000条左右,这些占不了多少资源。
- 预获取是持续更新,消耗的CPU相比过期缓存多很多。过期缓存是TTL超时后,缓存变成冷数据,但不会主动更新,只有客户端请求的时候,才会更新,当前默认使用过期缓存。
- 设置min为600s即可
如果没有特别的功能需求,只是作为主DNS使用的话,直接使用默认值就可以了,设置多个国内外的上游。 也可以在默认配置的基础上增加开启prefetch-domain功能。和开启缓存持久化功能。
多谢大佬解惑,我还以为过期缓存一直不刷新,只要缓存不满就一直存着呢。如果开了持久化缓存的话,过期缓存就会一直存着吗?这个持久化针对的就是过期缓存吧,还是说同时也针对普通缓存和域名预取功能?
追加一个问题,最近经常看到smartdns返回的ttl是3的数据,这个3是怎么来的?

缓存持久化不区分热缓存,和过期缓存,都是原状态保存。 TTL=3是过期缓存的处理过程:
当缓存过期后,变成冷数据,此时若客户端请求,就会立即将缓存的数据返回给客户端,并将ttl设置为3,同时,smartdns会发送查询请求到上游服务器,查询最新的记录。3s后,客户端会重新查询DNS,使用最新的DNS结果。 这样在查询时延和结果刷新上相对最佳。
3s的值可以用serve-expired-reply-ttl修改。
过期缓存机制,是查询优化的一个合理的机制。目前smartdns默认开启此机制。
缓存持久化不区分热缓存,和过期缓存,都是原状态保存。
TTL=3是过期缓存的处理过程:
当缓存过期后,变成冷数据,此时若客户端请求,就会立即将缓存的数据返回给客户端,并将ttl设置为3,同时,smartdns会发送查询请求到上游服务器,查询最新的记录。3s后,客户端会重新查询DNS,使用最新的DNS结果。
这样在查询时延和结果刷新上相对最佳。
3s的值可以用serve-expired-reply-ttl修改。
过期缓存机制,是查询优化的一个合理的机制。目前smartdns默认开启此机制。
我之前在adh把ttl设置成1,直接导致b站登陆验证码无法刷新,应该是浏览器拿到ip的时候,ttl就到期了,接着请求接着到期,死循环了,smartdns设置成3是为了避免这种问题么。另外后期server-group应该会合并到主分支吧。
验证没有问题,就会合入。
过期缓存已经RFC标准化了,大部分情况应该没有问题的。参考RFC设置就可以。
具体可以看 https://datatracker.ietf.org/doc/html/rfc8767#section-3 section-3~5
缓存持久化不区分热缓存,和过期缓存,都是原状态保存。
TTL=3是过期缓存的处理过程:
当缓存过期后,变成冷数据,此时若客户端请求,就会立即将缓存的数据返回给客户端,并将ttl设置为3,同时,smartdns会发送查询请求到上游服务器,查询最新的记录。3s后,客户端会重新查询DNS,使用最新的DNS结果。
这样在查询时延和结果刷新上相对最佳。
3s的值可以用serve-expired-reply-ttl修改。
过期缓存机制,是查询优化的一个合理的机制。目前smartdns默认开启此机制。
首页的serve-expired-reply-ttl的默认值写的是5,另外ttl默认是600的话,假如在生存期内服务端ip发生了变化,浏览器在用过期的且失效的ip连接超时后,会再重新发送dns请求吗?还是说一定要等浏览器里面缓存结果的ttl过期后再请求呢?
这种情况概率很低,大部分域名IP地址都是不变化的,即使变化,也会留出一天的时间。
即使真的遇到了,3s后,就会有新地址,客户端点击下刷新就可以了。
缓存是有热度的,频繁访问的域名会持续保留,相反,访问一次的域名,会很快删除掉。 另外,就是过期缓存,策略是不同的,过期缓存会每半天刷新一次记录,而不会持续刷新。 不访问的域名将在3天后删除。 还有就是缓存刷新频率限制,每2s最多处理16条记录。
对于上述问题:
- 家庭使用,一般域名量在1~2W条,这些经过热度淘汰,保留的也就1000条左右,这些占不了多少资源。
- 预获取是持续更新,消耗的CPU相比过期缓存多很多。过期缓存是TTL超时后,缓存变成冷数据,但不会主动更新,只有客户端请求的时候,才会更新,当前默认使用过期缓存。
- 设置min为600s即可
如果没有特别的功能需求,只是作为主DNS使用的话,直接使用默认值就可以了,设置多个国内外的上游。 也可以在默认配置的基础上增加开启prefetch-domain功能。和开启缓存持久化功能。
非常感谢您的详细回复!没想到我的问题被如此 迅速 和 认真地回复了,越来越喜欢smartDNS了!
追问: 开启【缓存持久化】目的是什么? 您说的“原状态保存”,我看路径在【/tmp/smartdns.cache】里,也会因为【缓存的热度】而迭代更新这个文件内容么?
按您的回复,我理解家庭场景: cache-size 10240 rr-ttl-min 600(按您建议) rr-ttl-max 3600(这数值可以不……?) prefetch-domain no serve-expired yes serve-expired-ttl 0(这里设置为0,也可以做到?——过期缓存会每半天刷新一次记录,不访问的域名将在3天后删除) serve-expired-reply-ttl 3(这个您解释很清楚——3s后,客户端会重新查询DNS,使用最新的DNS结果)
我的配置,供参考
cache-size 12288 cache-file /mnt/sda1/smartdns/smartdns.cache cache-persist yes rr-ttl-min 600 prefetch-domain yes serve-expired yes serve-expired-ttl 345600 serve-expired-prefetch-time 43200 force-qtype-SOA 65 dnsmasq-lease-file /var/lib/misc/dnsmasq.leases
上游,配置运营商,114,清华,1.1.1.1 8.8.8.8 家里有switch,配置了2个HK和韩国的DNS。
我的配置,供参考
cache-size 12288
cache-file /mnt/sda1/smartdns/smartdns.cache
cache-persist yes
rr-ttl-min 600
prefetch-domain yes
serve-expired yes
serve-expired-ttl 345600
serve-expired-prefetch-time 43200
force-qtype-SOA 65
dnsmasq-lease-file /var/lib/misc/dnsmasq.leases
上游,配置运营商,114,清华,1.1.1.1 8.8.8.8
家里有switch,配置了2个HK和韩国的DNS。
过期缓存为什么要设置过期时间呢,一直存着不好么。
内存大的设备,可以一直存。我的配置是在路由器里面,内存有限。
我的配置,供参考
cache-size 12288 cache-file /mnt/sda1/smartdns/smartdns.cache cache-persist yes rr-ttl-min 600 prefetch-domain yes serve-expired yes serve-expired-ttl 345600 serve-expired-prefetch-time 43200 force-qtype-SOA 65 dnsmasq-lease-file /var/lib/misc/dnsmasq.leases
上游,配置运营商,114,清华,1.1.1.1 8.8.8.8 家里有switch,配置了2个HK和韩国的DNS。
您的配置里: 【serve-expired-prefetch-time 43200】这行代表什么? 【rr-ttl-max】有设置么?
这种情况概率很低,大部分域名IP地址都是不变化的,即使变化,也会留出一天的时间。
即使真的遇到了,3s后,就会有新地址,客户端点击下刷新就可以了。
我自己有个域名,和家里的宽带绑定了,自己部署了一些服务,用的npm,所以域名一般是: subdomain1.mydomain.com:xxxx subdomain2.mydomain.com:xxxx subdomain3.mydomain.com:xxxx 有10多个子域名,其实在smartdns看来就是10多个域名吧。 TTL600,开了过期缓存、域名预取、永久缓存,4天前重启的路由,昨天刷新了好多次也无法获取新的IP,后来我把tmp里面的永久缓存文件删除了,重启了一下smartdns,又等了一会才可以。
以我的理解,TTL本身也算是一种缓存吧,浏览器和windows层面存在TTL生存期的域名IP,浏览器是否还会向路由查询dns呢?我做ap的路由ax3600,每8秒向api.miwifi.com发送一次dns请求,不管TTL是多少。我的缓存和TTL到底如何设置才是合理的呢?目前我把TTL给改成10秒了。
我自己有个域名,和家里的宽带绑定了,自己部署了一些服务,用的npm,所以域名一般是: subdomain1.mydomain.com:xxxx subdomain2.mydomain.com:xxxx subdomain3.mydomain.com:xxxx 有10多个子域名,其实在smartdns看来就是10多个域名吧。 TTL600,开了过期缓存、域名预取、永久缓存,4天前重启的路由,昨天刷新了好多次也无法获取新的IP,后来我把tmp里面的永久缓存文件删除了,重启了一下smartdns,又等了一会才可以。
以我的理解,TTL本身也算是一种缓存吧,浏览器和windows层面存在TTL生存期的域名IP,浏览器是否还会向路由查询dns呢?我做ap的路由ax3600,每8秒向api.miwifi.com发送一次dns请求,不管TTL是多少。我的缓存和TTL到底如何设置才是合理的呢?目前我把TTL给改成10秒了。
这种动态域名的情况需要考虑到域名根服务器(比如我的域名dns在dnspod,设置上最小ttl为120),建议本地smartdns不大于这个值即可
另外要考虑上游,比如移动自身的dns服务器,可能会缓存很久,导致即使重新获取也是旧的
即使真的遇到了,3s后,就会有新地址,客户端点击下刷新就可以了。
serve-expired-reply-ttl可以设置为0吗?ttl为0的请求只能用来连接,不会被缓存,这样理解对吗?
serve-expired-reply-ttl可以设置为0吗?ttl为0的请求只能用来连接,不会被缓存,这样理解对吗?
serve-expired-reply-ttl 意义为 在缓存中的数据ttl减小到0后,这个数据向客户端提供时的ttl。可以设为0(旧版一直是0)由于一些系统收到ttl=0的数据会丢弃。后来改默认为5
@pymumu @PikuZheng 请教: 【serve-expired-prefetch-time 43200】这行代表什么? 【rr-ttl-max】有设置的建议么?
我目前开了预缓存,没有开过期缓存。 听pumumu大大说,过期缓存 是更合理的方案?
https://github.com/PikuZheng/smartdns/commit/cbc8c5912520cab4018ced0c79fc09b515d6f780
我的理解(不一定对),serve-expired-prefetch-time 指 过期缓存服务功能 开启时,间隔多长时间去预获取一次。当没有开启过期缓存服务时该参数不起作用。
rr-ttl-max 指当上游返回的域名ttl大于这个值时,将其减小为这个值。由于腾讯云建议一些ip不经常变动的域名ttl值设置为3600,我建议此值设置为3600。
缓存是有热度的,频繁访问的域名会持续保留,相反,访问一次的域名,会很快删除掉。 另外,就是过期缓存,策略是不同的,过期缓存会每半天刷新一次记录,而不会持续刷新。 不访问的域名将在3天后删除。 还有就是缓存刷新频率限制,每2s最多处理16条记录。
对于上述问题:
- 家庭使用,一般域名量在1~2W条,这些经过热度淘汰,保留的也就1000条左右,这些占不了多少资源。
- 预获取是持续更新,消耗的CPU相比过期缓存多很多。过期缓存是TTL超时后,缓存变成冷数据,但不会主动更新,只有客户端请求的时候,才会更新,当前默认使用过期缓存。
- 设置min为600s即可
如果没有特别的功能需求,只是作为主DNS使用的话,直接使用默认值就可以了,设置多个国内外的上游。 也可以在默认配置的基础上增加开启prefetch-domain功能。和开启缓存持久化功能。
想了一下,我存储空间足够,只追求体验,真的需求是:只要访问过一次的域名,就直接缓存下来,永远不删除,热度可以用于控制后台刷新缓存的频率,目前我把persistent cache的路径设置到了root,这样重启也不会丢失;另外我把返回客户端的TTL全部改成了3,来应对119.29.29.29这种公共dns的缓存也没有更新的情况,比如我自己的ddns域名,但是效果跟我想得不太一样,windows上nslookup需要4次才能获取到最新的IP,之前的3次都是旧的,chrome的表现就更差,不知道它连接一次IP的超时是多久,重新刷新是否做dns查询,dns缓存是怎么控制的,总之要刷新多次等待很久才能正常连接。
或者加个永不删除缓存的开关?
另外我把返回客户端的TTL全部改成了3,来应对119.29.29.29这种公共dns的缓存也没有更新的情况 ----> 但是上游到smartdns的ttl并没有变?所以一直在从缓存中向客户端提供旧的
smartdns不是后台自动更新缓存么?至少在第1次访问的时候返回旧的ip,同时向上游请求一次新ip,同时更新缓存,第2次访问的时候smartdns不就返回新ip了么。
smartdns不是后台自动更新缓存么?至少在第1次访问的时候返回旧的ip,同时向上游请求一次新ip,同时更新缓存,第2次访问的时候smartdns不就返回新ip了么。
但是上游并没有更新(我的域名在dnspod最小只能设ttl为120
smartdns不是后台自动更新缓存么?至少在第1次访问的时候返回旧的ip,同时向上游请求一次新ip,同时更新缓存,第2次访问的时候smartdns不就返回新ip了么。
但是上游并没有更新(我的域名在dnspod最小只能设ttl为120
我说的是另外一种情况,我域名在dnspod买的,更新是10分钟,前提是dnspod域名解析设置本身已经被ddns更新了。smartdns上游设置为223.5.5.5,因为自己的域名访问频率特别低,223.5.5.5的dns缓存ip可能是主路由多次重启前的ip,第1次请求的时候,223.5.5.5返回的就是那个多次重启前的旧ip,第2次向223.5.5.5请求的时候就是新的ip了。
我说的是另外一种情况,我域名在dnspod买的,更新是10分钟,前提是dnspod域名解析设置本身已经被ddns更新了。smartdns上游设置为223.5.5.5,因为自己的域名访问频率特别低,223.5.5.5的dns缓存ip可能是主路由多次重启前的ip,第1次请求的时候,223.5.5.5返回的就是那个多次重启前的旧ip,第2次向223.5.5.5请求的时候就是新的ip了。
你域名在dnspod设的ttl是多少?10分钟?那么dnspod更新后的10分钟内,223.5.5.5并不会向dnspod发起查询,而是直接将旧的缓存发给用户。 在这种情况下,无论smartdns如何配置,都无法及时获取到正确的记录
就是10分钟。10分钟之后甚至1天后,223.5.5.5也不会主动向dnspod查询。主流服务之所以没有这个问题,是因为访问频率高,只有第一个访问这个域名的人会遇到问题。
就是10分钟。10分钟之后甚至1天后,223.5.5.5也不会主动向dnspod查询。主流服务之所以没有这个问题,是因为访问频率高,只有第一个访问这个域名的人会遇到问题。
是的这方面alidns体验很差,还有污染问题。我已经弃用了。119.29.29.29作为上游的话,基本上几秒钟就更新好了
设置:serve-expired-prefetch-time 43200,域名地址在43200s会强制刷新。 如果内网访问自己DDNS域名的话,建议用address设置成内网地址。如
address /my.ddns.com/192.168.1.1
address /my.ddns.com/#6
多谢,幸好不折腾的时候也不重启路由,域名正确解析之后,再访问就没什么问题了;内网服务搞得有点多还经常变动,就不经常改address了 已经把serve-expired-prefetch-time 7200,2小时自动刷新一次,上游dns全搞了119.29.29.29,下发客户端的ttl搞成3,等家人不用网的时候重启一下主路由看看效果。其实自己的ddns是小事,这样设置是不是可以提升一些冷门网站的访问体验?比如搜索技术资料的时候经常有一些技术爱好者的个人博客,有可能是自己家里搞的,和ddns的情况很像。