通过学习varnish的代码,进行了总结,也组织了培训,
现在将相关的内容传到这里,与大家进行交流。
varnish的很多优秀的思想值得深究和讨论啊
全文参考 http://ncache.googlecode.com/files/varnish.pdf
Varnish介绍
1 Varnish is HTTPaccelerator.
2 Varnish stores data invirtual memoryand leaves the task of deciding what is stored in memory and what gets paged out to disk to theoperating
system
3 The Varnish web site claims that Varnish is ten to twenty times faster than the popularSquid cacheon the same hardware.
4 Varnish is heavilythreaded
varnish总体架构
2.1总体流程
主进程fork子进程,主进程等待子进程的信号,子进程退出后,主进程重新启动子进程
子进程生成若干线程。
Accept线程:接受请求,将请求挂在overflow对列上
Work线程:多个,从对列上摘除请求,对请求进行处理,直到完成,然后处理下一个请求
Epoll线程:一个请求处理称作一个sesion,在sesion周期内,处理完请求后,会交给Epoll处理,监听是否还有事件发生。
Expire线程:对于缓存的对象,根据过期时间,组织成二叉堆,该线程周期检查该堆的根,处理过期的文件。
线程之间的关系:
2.1.1 accept线程
监听端口,接受连接。
接受后
组织成struct ses(session结构),看是否有空闲的工作线程,如果有,将请求给它,pthread_cond_signal信号通知它
没有空闲线程,如果overflow过大,则放弃该请求。
否则,将其挂在overflow上(需要更多工作线程,发通知)。
继续监听
2.1.2 work线程
从overflow队列上摘取请求(struct ses),进入状态机处理,处理结束后,通过pipe通信,将struct ses发送给epoll线程。
2.1.3 Epoll线程,得到传过来的struct ses,若还没有过期,将socket放入epoll的事件中,事件发生时,也会将其放入到overflow中进行。
关于Expire thread,比较独立,下面专门介绍。
2.2 work线程的处理过程
2.2.1请求的处理过程称为session,主要是由work线程处理的。
请求的是通过进入状态转换机进行分步处理,通过Varnish Configuration Language(VCL)进行定制。
request进入状态机后的状态变化
对于每种状态,都可以通过VCL进行配置,丰富功能。
Work线程处理请求的过程是根据VCL的配置而定制的状态机,典型的处理流程如下
1.Receive,请求处理的入口状态(之前还有first等状态),根据VCL判断该请求是Pass(跳过)还是进行Lookup(本地查询)
2.Lookup,在hash表中查找数据,若找到则进入hit状态,否则进入fetch状态。
3.Pass,选择后台,进入fetch状态
4.Fetch,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储
5.Deliver,,将数据发送给客户端,然后进入done
6.Done,处理结束事宜,对于一些请求需要做重新处理则可能重新进行状态转换或交给epoll
2.2.2 Work线程总体工作如下:
接受到请求,按状态机处理,请求结束后,关闭连接或交给Epoll
重新取请求,若没有请求,挂入空闲队列,等待信号唤醒(pthread_cond)
唤醒它有两个途径,除了前面说的accept线程外,还有就是herdtimer线程
如果是accept唤醒的,则继续按照状态机的方式处理请求,如果是herdtimer唤醒的,则自杀
2.3 工作线程的管理
2.3.1 Herd线程
–根据配置生成指定数目的线程(min)
–动态检查线程数目,生成需要的线程
2.3.2 Herdtimer线程
定期检查空闲的线程,对于空闲超过指定时间的线程,通知它可以自杀
工作线程管理的目的是根据请求的数量动态的调整工作线程的数目
2.4 expire线程
对缓存的数据采用二叉堆的方式进行组织,线程检测堆的root,判断是否过期,对过期的数据进行删除或重取,由VCL设置。
对于过期的数据,如果需要重新取,则会调用状态机中的fetch去后台获取,然后更新
Cache 详解
3.1 Hash方式
3.1.1简单hash方式
–单一链表,按key大小排序,通过memcmp比较查找和添加
–缺点:查询效率低
3.1.2 Hash classic
–第一层hash backet(较大的素数)包含锁
–采用CRC32方法,key可配,一般是url + host
–通过链表解决冲突
–优点:查询较快
–值得参考的地方:采用查找和添加分两遍进行
3.2 Storage方式
3.2.1 Malloc
–通过malloc获取内存
–通过free释放
–
–特点:简单
–有什么不好呢?
3.2.2 Mmap file
创建大文件,通过二分法分段映射成1G以内的大块
数据的初始化
A 初始化时,将大文件分段进行mmap,每段大小在1G以内,映射好的段分配到free block数组链表中,数组下标便是页的倍数向下取整,如果块大于数组倒数第二个元素与页的乘积,则将该块连接到数组的最后一个元素的链表中。
B 分配,遍历数组,找到满足要求的空闲块,若是前B-2个没有,则从最后一个中满足要求的大块中切出一块。如果找出的块大于需要的容量,则就对其进行拆分,然后将剩下的插入到空闲块中。
C 回收,对于释放的块,看能否和相邻的块进行合并,如果可以,则合并后再重新插入到合适位置。
3.3数据输出
Object结构表示一个请求对象(文件),通过其store链表指出数据块信息
3.3.1采用writev
–将store链表上的数据组成iov,通过writev输出
3.3.2采用sendfile
–通过循环使用sendfile,将store链表中的数据输出
VCL配置
通过vcl脚本对程序进行定制,主要是对请求的定制处理,如过滤某些请求等,脚本配置生成的函数是嵌套在状态机中的。
默认的配置如下
http://varnish.projects.linpro.no/browser/trunk/varnish-cache/bin/varnishd/default.vcl
purge删除配置如下
http://varnish.projects.linpro.no/wiki/VCLExamplePurging
分析与总结
varnish比较轻便,总共的代码量不大,功能上有待丰富和加强。
1. •利用虚拟内存方式,io性能好
2. •状态机设计巧妙,结构清晰
3. •利用二叉堆管理缓存文件,达到积极删除目的
4. •VCL比较灵活
5. •强大的管理功能,top,stat,admin,list等
6. •是内存缓存,重启数据消失
7. •32位机器上文件大小为2G
讨论
1. 二叉堆方式的插入和删除对于缓存文件较多时,性能是不是影响较大
2. 这么多的线程,分工清晰,如epoll,expire,herd,herdtimer等对性能的影响?
3. Hash中的key保存完整的url和host,信息量是不是太大?优点是:信息全,可重新组成请求用于过期的重取
参考
1http://varnish.projects.linpro.no/
2http://en.wikipedia.org/wiki/Varnish_cache
3http://en.wikipedia.org/wiki/Virtual_memory
4http://en.wikipedia.org/wiki/Squid_cache
分享到:
相关推荐
2. **请求分析**:Varnish分析接收到的请求,包括URL、头部信息等。 3. **哈希计算**:为了确定请求是否命中缓存,Varnish会计算一个哈希值。 4. **查找缓存**:Varnish检查缓存中是否存在相同哈希值的条目。 5. **...
4. **日志分析**:定期分析Varnish和Lighttpd的日志,找出性能瓶颈和优化点。 通过Varnish和Lighttpd的组合,你可以构建一个高效、灵活的Web服务器环境,有效提升网站的性能和用户体验。记住,配置过程中需要根据...
4. 性能调优:学习如何监控和分析Varnish性能,以及调整参数以优化缓存效率。 5. 案例研究:通过实际案例了解Varnish在不同场景下的应用,如电商、新闻网站等。 6. 故障排查:掌握Varnish的日志分析技巧,以便快速...
6. Varnish的性能监控和日志分析:Varnish提供丰富的日志记录功能,可以配合第三方工具(如Logstash和Elasticsearch)进行分析,以便了解缓存命中率、性能瓶颈等关键指标。 7. Varnish和后端服务器交互:Varnish...
对Varnish的分析表明,该软件支持三种缓存模式:malloc模式、file模式和persistent模式。其中,malloc模式为纯内存缓存,无需硬盘IO操作;file模式是将文件映射到内存中,本质与malloc类似,但不支持持久化存储;...
根据提供的文件信息,以下是关于“Varnish测试报告”的详细知识点总结: ...然而,对于Varnish的具体配置、优化策略以及与Web服务器的协同工作等方面,还需要进行更深入的分析和测试,以达到最佳的性能状态。
7. **日志和调试**:利用Varnish的日志功能进行性能分析和问题排查,Varnish提供了一套强大的工具如varnishlog和varnishstat来帮助管理员了解服务器的运行情况。 总之,Varnish对于优化Magento性能至关重要,而正确...
5. **日志和监控**:Varnish 3.0.2提供了详细的日志记录,包括请求、响应时间和缓存命中率等,这些信息对于性能分析和问题排查非常有用。此外,还可以与第三方监控工具集成,如Graphite或Nagios,以便实时监控...
9. **日志和分析**:Varnish提供详细的访问日志,可以与工具如Loggly或New Relic结合,进行性能分析和故障排查。 10. **API支持**:Varnish提供了API接口,允许动态调整缓存策略,如禁用或启用特定缓存条目,或者...
Varnish 3.0.4还支持自定义统计和监控,你可以使用内置的`varnishstat`工具查看性能指标,以及`varnishlog`来跟踪和分析请求日志。此外,Varnish Manager(VMA)是一个图形界面工具,可以方便地远程管理和监控...
此外,新版本可能还提升了日志分析和监控工具,以便管理员能更有效地监控和调试系统。 在实际部署中,Varnish 可以设置在Web服务器如Apache或Nginx之前,作为前端缓存层,将请求分发到适当的服务器,降低了主服务器...
在对Norwegian报纸Verdens Gang的多媒体部门的案例分析中,展示了Squid作为加速器的不足之处,包括性能不佳、稳定性差和高峰处理能力差。这个案例表明,使用客户端缓存进行服务器加速并不是一个理想的解决方案。博文...
3. **研究编译后的C代码**:如果其他方法都无法解决问题,可以通过编译VCL代码生成C代码来深入分析问题所在。 - `varnishd -d -f foo.vcl -C` 以上内容为《Varnish+应用技术指南2》的部分核心知识点,希望能帮助...
4. **监控与日志**:收集系统的运行数据,进行监控分析,以便及时发现并解决问题。 #### 总结 通过以上步骤,我们可以成功搭建一个基于Varnish的CDN推送平台。此平台不仅可以显著提升网站的访问速度,还能有效减轻...
同时,还有用于管理和切割日志的脚本,如`cut_varnish_log.sh`和`varnishlog.sh`,这些脚本可以帮助管理员分析Varnish的行为和性能。 总的来说,Varnish 2.13配置文档详细涵盖了从安装到配置,再到VCL语言变更和...