2008-11-21
看了两个星期Varnish2.0.1的源代码,作一些总结,给那些将要分析其代码的朋友一些方便:
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)针对不同的后台服务器组进行轮询,检查存活与否。
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。
1、http://varnish.projects.linpro.no/wiki/VarnishInternals
2、http://phk.freebsd.dk/pubs/
BH:Binary Heap
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/