首页 > ATS 6.2.1中缓存文件过期并不回源校验的“坑”

ATS 6.2.1中缓存文件过期并不回源校验的“坑”

事先说明

标题说是“坑”,并没有说是“bug”,也就是多半是玩的姿势不对。

线上问题

我司(lecloud)目前线上大小文件都是使用的ATS 6.2.1版本,昨天运维反馈有文件超过缓存时间并不回源刷新,截图如下:

现象就是:age超过max-age了,过期了不更新!

另外需要说的一点就是,源站是可以正常回源的。

复现现象并打印调试日志

我复现了上述现象,发现问题的确如此,而且重启ATS之后,问题依旧。

这个问题,最本源的解决途径,就是去分析ATS对该请求的具体执行过程,特别是在判断缓存对象的refreshness这一块儿的判断细节。按照这个思路,我打开records.config中的debug选项,只过滤http.*相关的日志,traffic_line -x让配置生效后, 重新触发请求,得到了该请求完全的处理日志,我已经上传,参见下面的链接

https://download.csdn.net/download/tao_627/10845892

仔细分析该日志,与我最初的想法有些差异。我最初以为,这种情况下ATS回去回源校验,发现源站的内容没有变化,得到源站的304响应,然后还是将缓存中的内容返回给客户端,此时Age值继续增大。但是我仔细分析http请求的处理日志,发现并不是这样,ATS直接查缓存,并且校验缓存中的内容是refresh之后,就直接读取缓存并返回响应给客户端了。

那么这里值得怀疑的地方,就只能锁定在ATS对缓存object的refreshness的处理是否存在问题。

代码定位

从日志中的行号指示,主要定位到如下几个函数

注意这里

日志和代码一一对应上

可以看出,这里对缓存中一个document的freshness_limit的判断非常重要,优先考虑的是Cache-Control: s-maxage, 然后是max-age,如果没有这两个头,就再考虑Expires头,然后是Last-Modified/Date头,使用Last-Modified和Date头计算freshness_limit时,会用到下面的加权因子proxy.config.http.cache.heuristic_lm_factor,默认是0.10

freshness_limit = (date - last_modified) * 0.10

如果上面的http头都没有,直接使用配置值中的最小经验值proxy.config.http.cache.heuristic_min_lifetime

freshness_limit = s->txn_conf->cache_heuristic_min_lifetime

s-maxage与max-age的唯一区别是,s-maxage仅仅应用于共享缓存,而不应用于用户代理的本地缓存等针对单用户的缓存。另外,s-maxage的优先级要高于max-age.

上面的计算过程中,都使用到配置项proxy.config.http.cache.guaranteed_max_lifetime和proxy.config.http.cache.guaranteed_min_lifetime来限定一个缓存object的freshness_limit必须在这两者之间,默认配置情况下,也就是必须在一年以内。

CONFIG proxy.config.http.cache.guaranteed_max_lifetime INT 31536000

 

原因定位

ATS的官网文档

https://docs.trafficserver.apache.org/en/6.2.x/admin-guide/files/records.config.en.html

中有这个配置选项

proxy.config.http.cache.guaranteed_max_lifetime

默认配置是一年,在一年内会按照过期策略进行回源。  如果超过了, 在目前的配置下(恰好我们也是配置的1年)直接响应。在当前情况下,就会导致该资源永不过期。

解决方法

更新records.config文件,在末尾增加一行,将对象缓存时间最大设置为10年,或其它合适的值

CONFIG proxy.config.http.cache.guaranteed_max_lifetime INT 315360000

然后更新配置文件(不需要重启ats)

/usr/local/ats/bin/traffic_line -x

可见,还是我们对ATS 6.2.1的新特性不熟,导致掉进“坑”里了,属于玩的姿势不对。

 

更多相关:

  • (给DotNet加星标,提升.Net技能)转自:HueiFengcnblogs.com/yyfh/p/12361255.html前言本章将介绍客户端缓存将介绍浏览器缓存和服务端缓存,使用浏览器缓存将减少对web服务器的请求次数,同时可以提升性能,避免重复的运算浪费。ASP.NET Core对于HTTP缓存分为两种:客户端(浏览器缓...

  • 将追加的主题 内存常驻副本(resident alternates)缓存对象刷新(object refresh) 缓存一致性(Cache Consistency) ATS缓存是完全一致性的,除非你不小心踢掉电源,让ATS突然关机。如果要禁用硬盘驱动器自身的缓存,你需要使用下面的命令 hdparm -W0 缓存系统会校验可用...

  • ATS名词术语 副本(alternate) 缓存对象(cache object)的一种变体,最初创建该术语是为了处理HTTP协议中的VARY机制(RFC2616#sec14.44),现在多用于其它的目的。一个对象的所有副本必须以某种方式等价,也就是说,它们是同一个流的等价形式,最常用的一个例子就是,一个流既有普通版本也有压缩版本。...

  • 该博文翻译自参考文献[1] parent.config parent.config文件识别用在缓存分级中的父代理,用这个文件去执行下面的配置: 搭建父分级缓存,兼容多父级缓存和父级缓存故障转移配置指定的URL请求避开父代理缓存 仅当父缓存选项开启后,ATS才能使用parent.config文件。 当你修改parent.conf...

  • 我的博客上已经有很多这样的ats安装实录了,这次的笔记有些不一样,因为它是ATS目前最新的LTS版本6.2.1的安装,写出来更多的是整理自己的思路,因为很多东西搞过不整理,过一段时间就完全忘记掉了。 安装环境: 在rMBP 15.4上上面安装了VMware Fushion 专业版8.5.1,操作系统是MacOS Sierra 10...

  • 2011年我曾有机会精心研究了ATS Cache Module部分的大部分源码,也绘制了一些蹩脚的图片,但是对比专家和大牛的作品还相去甚远,下面的图片摘自Fall Summit 2014中的ATS committer Alan M. Carroll的ppt,仅作研读ATS源码时作参考和对照,更是对高手极致境界的尊崇和反思。...

  • 转载自https://blog.zymlinux.net/index.php/archives/129 首先申明本人是个实实在在的菜鸟,现在也只是搭建起来ats玩玩简单的,写本文只是为了给完全的小白一个参考而已。 本人刚开始接触ats的时候,从ats安装到配置也遇到了很多基本的问题,在查阅资料解决不了的时候基本都是豪哥耐心...

  • 转载自 https://blog.zymlinux.net/index.php/archives/540 ATS插件开发需要提前了解ATS的插件的一些设计思想,以及系统提供的一些不同方向。我们将会介绍ATS的基础开发知识,以利于后续的插件开发课程讲解。 ATS的SDK文档,是了解ATS的核心设计、接口设计的很重要资料,甚至是老...

  • ue4商城资源 Car Configurator Template 汽车配置器模板 ue4商城资源 Car Configurator Template 汽车配置器模板 Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Car Configurator Template 4...

  • 一直在尝试一些写代码方便,阅读代码也很方便的工具,因为使用的是Mac,所以阅读源码上面sourceInsight就没办法用了。 从vscode – sublime – clion 想要可配置性强一点,软件轻一点,也能提供足够的便捷操作,不论是写代码还是快速索引源码,都希望在检索上面节省足够的时间。 vscode 和 sublime...

  • 每日杂事缠身,让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具,每次熟悉源码都需要先在windows端改好,拖到linux端,再编译。出现问题,还得重新回到windows端,这个过程太耗费时间。 vim作为唯一能够和windos 下的source insight一争高低的linux端的源码阅读器,只要将它短时间内合理利用...

  • 使用ubuntu(18.04) 作为软路由器连接互联网 背景: 最近要用ubuntu机器作为中继路由,需要配置一下,但是内网外网网上找了一圈,五花八门的,照着做没有一个靠谱的,遇到的问题也没有任何说明,遂写一篇教程以记录一下 功能说明: 简单来说,就是用其他机器的网络上互联网, 比如可以用其他机器的wifi上网等等场景 示意...

  • Spring-Boot 攻略 day01 spring-boot 一. 基本配置加运行 1. 导入配置文件(pom.xml 文件中) org.springframework.bootspring-boot-starter-parent