Chinaunix首页 | 论坛 | 博客
  • 博客访问: 172687
  • 博文数量: 20
  • 博客积分: 542
  • 博客等级: 中士
  • 技术积分: 240
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 09:44
文章分类

全部博文(20)

文章存档

2012年(3)

2011年(17)

分类: LINUX

2011-08-18 14:36:15

一般服务器软件类似,分为mastermanagement)进程和childworker,主要做cache的工作)进程。master进程读入命 令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。针对文件缓存 部分,master读入存储配置(-s file[,path[,size[,granularity]]] ),调用合适的存储类型,然后创建/读入相应大小的缓存大文件(根据其man文档,为避免文件出现存储分片[2]影响读写性能,作者建议用dd(1)命令 预先创建大文件)。接着,master初始化管理该存储空间的结构体。这些变量都是全局变量,在fork以后会被child进程所继承(包括文件描述 符)。
child进程主线程初始化过程中,将前面打开的存储大文件整个mmap到内存中(如果超出系统的虚拟内存,mmap失败,进程会减少原来的配置mmap大小,然后继续mmap),此时创建并初始化空闲存储结构体,挂到存储管理结构体,以待分配。

接着,真正的工作开始,Varnish的某个负责接受新HTTP连接的线程开始等待用户(具体过程可参见[3]),如果有新的HTTP连接过来, 它总负责接收,然后叫醒某个等待中的线程,并把具体的处理过程交给它。Worker线程读入HTTP请求的URI,查找已有的object,如果命中则直 接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。

分配缓存的过程是这样的:它根据所读到object的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个object的大小变为最接近其 大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲 存储块,挂到管理结构体上。如果缓存已满,就根据LRU[4]机制,把最旧的object释放掉。

释放缓存的过程是这样的:有一个超时线程,检测缓存中所有object的生存期,如果超初设定的TTLTime To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,如果前面或后面的空闲内存和该 释放内存是连续的,就将它们合并成更大一块内存。整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的object都考虑是在内存中,如果系 统内存不足,系统会自动将其换到swap空间,而不需要varnish程序去控制。

阅读(2638) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~