注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老和山小和尚

敬天爱人

 
 
 

日志

 
 
 
 

Varnish源代码分析的一些总结  

2008-11-21 18:31:41|  分类: 其他服务软件 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

yaoweibin2008@163.com

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


  评论这张
 
阅读(2924)| 评论(4)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018