Varnish源代码分析的一些总结
2013-03-25 14:12
141 查看
yaoweibin2008@163.com
2008-11-21
看了两个星期Varnish2.0.1的源代码,作一些总结,给那些将要分析其代码的朋友一些方便:
2、Varnish各进程线程的作用
管理进程的行为主要包括:读入命令参数,并做出相应配置;编译VCL配置文件,生成C语言代码以后编译成动态连接库,由子进程载入并使用;产生子进程,并能处理各种子进程的信号;处理通过CLI接口传过来的命令,做出相应决定。
Cache子进程处理所有具体工作,各个线程的任务包括:
命令行接受处理线程(CLI_Run)接受从管理进程通过管道传过来的命令,做出相应决定。其中初始时由管理进程默认产生三个命令(vcl.load、vcl.use、start)来启动后台服务器连接探测线程
和两个接受线程。
放牧线程(wrk_herder_thread)用于产生工作线程池。线程不足时会增加线程池。
放牧超时检查线程(wrk_herdtimer_thread)清理一些工作超时的工作线程。
请求接受线程(vca_acct)接受HTTP初次请求,并叫醒某个工作线程,处理请求。
数据接受线程(vca_main)在发送数据以后,继续可能的再次请求,并把请求交给工作线程。
工作线程(wrk_thread)不断处理请求,进入状态机。如果缓存没有命中,还需要从后台服务取过数据,存入缓存并回复。然后把该连接通过管道转给数据接受线程并睡去。
HTTP对象超时检查线程(exp_timer)检查二叉堆中HTTP超时对象,删除之。
后台服务器连接探测线程(vbp_wrk_poll_backend)针对不同的后台服务器组进行轮询,检查存活与否。
2、CLI接口是程序启动入口,比如后台服务器连接探测线程是由命令vcl.load产生的,
两个接收线程是start命令产生的。
3、 FreeBSD的尾队列是Varnish用到的基本数据结构。特别要注意的是,尾队列成员入口的prev是双重指针,指向上一个成员的next指针。这样做主要为了通用,即使element成员是不同类型也可以组成链表。这与我们一般教科书上的prev操作不一样。
所以其last和prev的宏定义也颇为让人费解:
#define VTAILQ_LAST(head, headname) \
(*(((struct headname *)((head)->vtqh_last))->vtqh_last))
#define VTAILQ_PREV(elm, headname, field) \
(*(((struct headname *)((elm)->field.vtqe_prev))->vtqh_last))
注意尾队列的head和entry结构体的定义是一样的,所以在element类型是一样的时候,VTAILQ_LAST(head,
headname)也等于*(struct type *)head->vtqh_last->vtqe_prev,
相应的VTAILQ_PREV(elm, headname, field)也等于*(struct type *)elm->field.vtqe_prev->vtqe_prev。FreeBSD写成这样诡异的形式据说是为了可以方便得删除不同类型的element。
2、http://phk.freebsd.dk/pubs/
CLI:Command-Line Interface,part of the published Varnish-API,see "cli.h"
CNT:CeNTer
EVB:Event Variable Base
EXP:EXPire
HCL:Hash CLassic
HTC:HTtp Connection
MCF:Main ConFigure
mgt:managment
PAN:PANic
PFD:PoolFD, Poll File Description
SES:SESsion
SMF:Storage Mmaped File
SMS:Storage Mutex Synth
STV:STeVedore
TMO:TiMe Out
VBE:Varnish BackEnd
VBM:Varnish Bit Map
VBP:Varnish Backend Polling
VCA:Varnish Cache Acceptor
VCC:Varnish Configure Compile?
VCL:Varnish Configure Language
VCT:Varnish Character Type
VDI:Varnish DIrector
VEV:Varnish Event Variable
VLU:Varnish Line Up
VPF:Varnish PID File
VSB:Varnish Storage Buffer
VSS:Varnish addreSS?
VSL:Varnish Share-memory Log
VTAILQ:Varnish Tail Queue,
WQ:Work Queue
WRK:WoRKer
WSL:Worker Share-emory Log
http://yaoweibin2008.blog.163.com/blog/static/11031392008102163141550/
2008-11-21
看了两个星期Varnish2.0.1的源代码,作一些总结,给那些将要分析其代码的朋友一些方便:
1、Varnish的总体结构
Varnish主要有两个进程:管理进程和cache子进程。cache子进程又包含命令行接受处理线程(CLI_Run),放牧线程(wrk_herder_thread),放牧超时线程(wrk_herdtimer_thread),请求接受线程(vca_acct),数据接受线程(vca_main),很多工作线程(wrk_thread),HTTP对象超时线程(exp_timer),后台服务器连接探测线程(vbp_wrk_poll_backend)。2、Varnish各进程线程的作用
管理进程的行为主要包括:读入命令参数,并做出相应配置;编译VCL配置文件,生成C语言代码以后编译成动态连接库,由子进程载入并使用;产生子进程,并能处理各种子进程的信号;处理通过CLI接口传过来的命令,做出相应决定。
Cache子进程处理所有具体工作,各个线程的任务包括:
命令行接受处理线程(CLI_Run)接受从管理进程通过管道传过来的命令,做出相应决定。其中初始时由管理进程默认产生三个命令(vcl.load、vcl.use、start)来启动后台服务器连接探测线程
和两个接受线程。
放牧线程(wrk_herder_thread)用于产生工作线程池。线程不足时会增加线程池。
放牧超时检查线程(wrk_herdtimer_thread)清理一些工作超时的工作线程。
请求接受线程(vca_acct)接受HTTP初次请求,并叫醒某个工作线程,处理请求。
数据接受线程(vca_main)在发送数据以后,继续可能的再次请求,并把请求交给工作线程。
工作线程(wrk_thread)不断处理请求,进入状态机。如果缓存没有命中,还需要从后台服务取过数据,存入缓存并回复。然后把该连接通过管道转给数据接受线程并睡去。
HTTP对象超时检查线程(exp_timer)检查二叉堆中HTTP超时对象,删除之。
后台服务器连接探测线程(vbp_wrk_poll_backend)针对不同的后台服务器组进行轮询,检查存活与否。
3、几个碰到难点
1、后台服务器连接探测线程是在“vcl->conf->init_func(cli);”被调用的,但是该函数的定义在源代码中并未出现,都是在VCL的编译文档中出现的。2、CLI接口是程序启动入口,比如后台服务器连接探测线程是由命令vcl.load产生的,
两个接收线程是start命令产生的。
3、 FreeBSD的尾队列是Varnish用到的基本数据结构。特别要注意的是,尾队列成员入口的prev是双重指针,指向上一个成员的next指针。这样做主要为了通用,即使element成员是不同类型也可以组成链表。这与我们一般教科书上的prev操作不一样。
所以其last和prev的宏定义也颇为让人费解:
#define VTAILQ_LAST(head, headname) \
(*(((struct headname *)((head)->vtqh_last))->vtqh_last))
#define VTAILQ_PREV(elm, headname, field) \
(*(((struct headname *)((elm)->field.vtqe_prev))->vtqh_last))
注意尾队列的head和entry结构体的定义是一样的,所以在element类型是一样的时候,VTAILQ_LAST(head,
headname)也等于*(struct type *)head->vtqh_last->vtqe_prev,
相应的VTAILQ_PREV(elm, headname, field)也等于*(struct type *)elm->field.vtqe_prev->vtqe_prev。FreeBSD写成这样诡异的形式据说是为了可以方便得删除不同类型的element。
4、我找到的一些有益参考连接:
1、http://varnish.projects.linpro.no/wiki/VarnishInternals2、http://phk.freebsd.dk/pubs/
5、Varnish源代码中一些特定的缩写字母含义:
BH:Binary HeapCLI:Command-Line Interface,part of the published Varnish-API,see "cli.h"
CNT:CeNTer
EVB:Event Variable Base
EXP:EXPire
HCL:Hash CLassic
HTC:HTtp Connection
MCF:Main ConFigure
mgt:managment
PAN:PANic
PFD:PoolFD, Poll File Description
SES:SESsion
SMF:Storage Mmaped File
SMS:Storage Mutex Synth
STV:STeVedore
TMO:TiMe Out
VBE:Varnish BackEnd
VBM:Varnish Bit Map
VBP:Varnish Backend Polling
VCA:Varnish Cache Acceptor
VCC:Varnish Configure Compile?
VCL:Varnish Configure Language
VCT:Varnish Character Type
VDI:Varnish DIrector
VEV:Varnish Event Variable
VLU:Varnish Line Up
VPF:Varnish PID File
VSB:Varnish Storage Buffer
VSS:Varnish addreSS?
VSL:Varnish Share-memory Log
VTAILQ:Varnish Tail Queue,
WQ:Work Queue
WRK:WoRKer
WSL:Worker Share-emory Log
http://yaoweibin2008.blog.163.com/blog/static/11031392008102163141550/
相关文章推荐
- Deadlock的一些总结(死锁分析及处理)
- 离职了,总结的一些系统分析的经验
- 离职了,总结的一些系统分析的经验
- 总结的一些系统分析的经验
- duwamish7的一些代码分析总结
- JfreeChart使用经验总结(分析了使用中碰到的一些常见问题)
- 离职了,总结的一些系统分析的经验
- Challenge2关于数据分析的图形的一些总结
- 关于ui的一些总结(参考Qt4精彩实例分析)
- 应用matlab进行数据分析的一些总结
- 总结的一些系统分析的经验
- 关于事件总线框架EventBus和otto一些分析总结
- [项目管理]总结的一些系统分析的经验
- 【转】Deadlock的一些总结(死锁分析及处理)
- 【oracle】oracle一些错误号原因分析和总结
- 今天看了ACE 中Proactor实现部分的一些代码,做一些总结和分析
- 对java的Hash方法的一些分析总结
- iOS的一些面试题分析总结(1)
- Java集合框架的知识总结(1) 说明:先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析。 1、综述 所有集合类
- iOS的一些面试题分析总结(0)