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

Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。
龙铳让刃:Varnish的理念是好的,但是Varnish还没有稳定到可以完全替代Squid的程度,现在就抛弃Squid选择Varnish是不明智的。
Varnish介绍
1 Varnish is HTTP accelerator.
2 Varnish stores data in virtual memory and leaves the task of deciding what is stored in memory
and what gets paged out to disk to the operating system
3 The Varnish web site claims that Varnish is ten to twenty times faster than the popular Squid
cache on the same hardware.
4 Varnish is heavily threaded
varnish 总体架构
2.1 总体流程
主进程 fork 子进程,主进程等待子进程的信号,子进程退出后,主进程重新启动子进程
子进程生成若干线程。
Accept 线程:接受请求,将请求挂在 overflow对列上
Work 线程: 多个,从对列上摘除请求,对请求进行处理,直到完成,然后处理下一个
请求
Epoll 线程: 一个请求处理称作一个 sesion,在 sesion 周期内,处理完请求后,会交给
Epoll 处理,监听是否还有事件发生。
Expire 线程:对于缓存的对象,根据过期时间,组织成二叉堆,该线程周期检查该堆的
根,处理过期的文件。
线程之间的关系:
2.1.1 accept 线程
监听端口,接受连接。
接受后组织成 struct ses(session 结构) ,看是否有空闲的工作线程,如果有,将请求给它,
pthread_cond_signal 信号通知它没有空闲线程,如果 overflow过大,则放弃该请求。否则,
将其挂在 overflow 上(需要更多工作线程,发通知)。
继续监听 2.1.2 work 线程
从 overflow队列上摘取请求(struct ses),进入状态机处理,处理结束后,通过 pipe通信,
将 struct ses发送给 epoll 线程。
2.1.3 Epoll 线程,得到传过来的 struct ses,若还没有过期,将 socket 放入 epoll 的事件中,事
件发生时,也会将其放入到 overflow中进行。