架构师日记——规划Varnish的缓存大小和提高命中率

给Varnish选择多少内存,是个很艰巨的问题,需要考虑以下事情:
1:应用的热门数据集有多大?
对一个门户或者新闻站来说,这个数据集可能就只是首页和它相关内容的大小。这里包括的两部分,一部分是只首页本身的文字图片内容,另一部分是首页会链接到的页面或象(比如图片),这个很容易理解,首页的内容是最可能被点击的,命中率也会很高。
2:产生一个对象的花费有多大?
有时候,如果从后端返回并不太消耗资源,同时你的内存又有限的话,就应该缓存一部分图片,而不是去缓存所有图片。
3:使用varnishstat或其他工具监控n_lru_nuked计数器。
如果你有很多LRU活动的话,那么你的缓存正因空间限制在清除对象,此时你就要考虑增加缓存大小了。
缓存任何对象都会携带保存在实际存储区域之外的开销。所以,即便你指定-s malloc,16G,varnish可能实际使用了两倍。Varnish中每个对象的花销大概是1k。所以,如果在你的缓存中有很多小对象的话,花销是非常大的。

Varnishstat工具显示一个运行的varnished实例的相关统计数据

  • 参数如下:
    -1 只显示一次就退出
    -f 使用逗号分隔字段列表来显示,使用“^”开始排除列表。
    -l 监听有效的列使用-f参数
    -n 指定varnishd实例来读取日志,如果没有指定,则默认使用主机名
    -V 显示版本号,然后退出
    -w delay 刷新间隔时间,默认1s
    -x 显示xml格式
    -j 显示json格式
  • 显示中每列的含义,从左到右:
    1:值
    2:从最后一秒更新以来的每秒的一个平均值,或者一个不能计算的周期
    3:从进程开始到现在每秒的平均值,或者是一个不能计算的周期。
    4:描述
    当使用-1选项,输出列的含义,从左到右:
    1:特征名字
    2:值
    3:从进程开始到现在每秒的平均值,或者是一个不能计算的周期。
    4:描述

Varnish的默认缓存策略是偏向保守的(可以通过配置改变)

  • 它默认只缓存GET请求和HEAD请求,不缓存带有Cookie和认证信息的请求,也不会缓存带有Set-Cookie或者有变化的头信息的响应。
  • Varnish也会检查请求和响应中的Cache-Control头信息,这个头信息中会包含一些选项来控制缓存行为。当Cache-control中Max-age的控制和默认策略冲突时,varnish不会单纯的根据Cache-control信息就改变自己的缓存行为。
    例如:Cache-Control: max-age=n,n为数字,如果varnish收到web服务器的响应中包含max-age,varnish会以此值设定缓存的过期时间(单位:秒),否则varnish将会设置为参数配置的时间,默认为120秒。
  • 提高Varnish命中率的根本方法,就是仔细规划请求和应答,并自定义缓存策略,通过VCL来配置自己想要缓存的内容,并主动设置对象的ttl,尽量不去依赖Http header
  • 当然,如果使用默认策略的话,就需要好好的跟踪和分析Http header了
  • 有一个提高命中率的简单方法,就是尽量加大ttl值,当然要在合理范围
  • 查看日志,分析经常访问后端服务器的url,有一些常用的命令来帮助你:
    比如: varnishtop -i txurl 就可以看到请求后端的url
  • 通过日志辅助分析
    varnish里内置了日志模块,可以在vcl文件最上边引用std库,以便输出日志:
import std;

然后在需要输出日志的地方,使用 std.log 即可。
比如你想跟踪哪些连接没有命中缓存,可以在vcl_miss函数中这样写:

sub vcl_miss {
    std.log("url miss! the url=" + req.url);
    return (fetch);
}

启动varnish 后,通过 varnishlog工具跟踪打印出的日志

varnishlog -I log

你可能感兴趣的:(架构师,Varnish)