Varnish

上一篇 / 下一篇  2012-02-03 16:34:11 / 个人分类:others

来自网络

Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸Verdens Gang使用3台Varnish代替了原来的12台Squid,性能比以前更好。

Varnish的作者Poul-Henning Kamp是FreeBSD内核开发者之一,他认为现在的计算机比起1975年已经复杂很多。在1975年时,存储媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了CPU内的L1\L2\L3等cache。因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以。所以这部分的工作应该交给操作系统处理,这就是Varnish cache设计架构[4]。Varnish将所有的HTTP object存于一个单独的大文件中,该文件在工作进程初始化的时候,将其整个映射到内存中。这样Varnish在该块内存中实现一个简单的文件系统,具有分配、释放、修剪、合并内存等功能。

Varnish文件缓存的工作流程:

Varnish与一般服务器软件类似,分为master进程和child进程。其中master进程负责管理,child进程负责cache工作。Master进程读入命令,进行一些初始化,然后fork并监控child进程。Child进程分配若干线程进行工作,主要包括管理线程和worker线程。如图4-2-1-2所示。

主进程fork子进程,主进程等待子进程的信号,子进程退出后,主进程重新启动子进程,子进程生成若干线程:

(1)Accept线程:接受请求,将请求挂在overflow队列上。

(2)Work线程:有多个,负责从overflow队列上摘除请求,对请求进行处理,直到完成,然后处理下一个请求。

(3)Epoll线程:一个请求处理称为一个session,在session周期内,处理完请求后,会交给Epoll处理,监听是否还在事件发生。

(4)Expire线程:对于缓存的object,根据过期时间,组织成二叉堆,该线程周期检查该堆得根,处理过期的文件。对过期的数据进行删除或重取操作。

Varnish分配缓存机制:

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

Varnish释放缓存机制:

Expire线程负责检测缓存中所有object的生存期(TTL)。如果超过了设定的TTL,该object没有被访问,则删除该object,并释放内存。释放的过程会考虑内存的合并等操作。


TAG:

 

评分:0

我来说两句

Open Toolbar