Varnish源代码分析的一些总结

[email protected]

2008-11-21

看了两个星期Varnish2.0.1的源代码,作一些总结,给那些将要分析其代码的朋友一些方便:

1Varnish的总体结构

Varnish主要有两个进程:管理进程和cache子进程。cache子进程又包含命令行接受处理线程(CLI_Run),放牧线程(wrk_herder_thread),放牧超时线程(wrk_herdtimer_thread),请求接受线程(vca_acct),数据接受线程(vca_main),很多工作线程(wrk_thread),HTTP对象超时线程(exp_timer),后台服务器连接探测线程(vbp_wrk_poll_backend)。

2Varnish各进程线程的作用

管理进程的行为主要包括:读入命令参数,并做出相应配置;编译VCL配置文件,生成C语言代码以后编译成动态连接库,由子进程载入并使用;产生子进程,并能处理各种子进程的信号;处理通过CLI接口传过来的命令,做出相应决定。

Cache子进程处理所有具体工作,各个线程的任务包括:

  • 命令行接受处理线程(CLI_Run)接受从管理进程通过管道传过来的命令,做出相应决定。其中初始时由管理进程默认产生三个命令(vcl.loadvcl.usestart)来启动后台服务器连接探测线程 和两个接受线程。

  • 放牧线程(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的编译文档中出现的。

2CLI接口是程序启动入口,比如后台服务器连接探测线程是由命令vcl.load产生的,

两个接收线程是start命令产生的。

3 FreeBSD的尾队列是Varnish用到的基本数据结构。特别要注意的是,尾队列成员入口的prev是双重指针,指向上一个成员的next指针。这样做主要为了通用,即使element成员是不同类型也可以组成链表。这与我们一般教科书上的prev操作不一样。

所以其lastprev的宏定义也颇为让人费解:

#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))

注意尾队列的headentry结构体的定义是一样的,所以在element类型是一样的时候,VTAILQ_LAST(head, headname)也等于*(struct type *)head->vtqh_last->vtqe_prev, 相应的VTAILQ_PREV(elm, headname, field)也等于*(struct type *)elm->field.vtqe_prev->vtqe_prevFreeBSD写成这样诡异的形式据说是为了可以方便得删除不同类型的element

4、我找到的一些有益参考连接:

1http://varnish.projects.linpro.no/wiki/VarnishInternals

2http://phk.freebsd.dk/pubs/


5Varnish源代码中一些特定的缩写字母含义:

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/

你可能感兴趣的:(Varnish源代码分析的一些总结)