基于Varnish 3.0.4的网站静态加速

Varnish 的一些特点:


(1)、是基于内存缓存,重启后数据将消失;

(2)、利用虚拟内存方式,I/O 性能好;

(3)、支持设置 0~60 秒内的精确缓存时间;

(4)、VCL 配置管理比较灵活;

(5)、32位机器上缓存文件大小为最大2G;

(6)、具有强大的管理功能,例如 top、stat、admin、list 等;

(7)、状态机设计巧妙,结构清晰;

(8)、利用二叉堆管理缓存文件,达到积极删除目的。

Varnish 的 Storage 方式可分为两种:

1)、Malloc 通过 malloc 获取内存;

2)、Mmap file 创建大文件,通过二分法分段映射成 1G 以内的大块。

以 Mmap file 的缓存方式启动 I/O 也会形成瓶颈,原因主要是 Varnish 缓存的数据先会刷到磁盘上,然后在一次性读到内存中,这在访问量大的时候同时也会对 I/O 造成很大的压力。Malloc 缓存方式虽然对 I/O 没有压力,因所有缓存数据都写到内存中。

Malloc 方式启动:

/usr/local/varnish/sbin/varnishd -u nobody -g nogroup -f /usr/local/varnish/etc/varnish.vcl -s malloc,4G -w 50,51200,120 -a 192.168.10:80 -T 127.0.0.1:8080

 


Mmap file 方式启动:

/usr/local/varnish/sbin/varnishd -u nobody -g nogroup -f /usr/local/varnish/etc/varnish.vcl -s file,/data/varnish/varnish_storage.bin,4G -w 50,51200,120 -a 192.168.10:80 -T 127.0.0.1:8080

-----------------------------------------------------------------------------------------------------------------------------------------------

Varnish 进程的工作模式:

Varnish 启动或有2个进程 master(management) 进程和 child(worker) 进程。master 读入存储配置命令,进行初始化,然后 fork,监控 child。child 则分配线程进行 cache 工作,child 还会做管理线程和生成很多 worker 线程。

 


child 进程主线程初始化过程中,将存储大文件整个加载到内存中,如果该文件超出系统的虚拟内存,则会减少原来配置 mmap 大小,然后继续加载,这时候创建并初始化空闲存储结构体,放在存储管理的 struct 中,等待分配。

 

 

接着 Varnish 某个负责接受新 http 连接的线程开始等待用户,如果有新的 http 连接,但是这个线程只负责接收,然后唤醒等待线程池中的 work 线程,进行请求处理。

 


worker 线程读入 uri 后,将会查找已有的 object,命中直接返回,没有命中,则会从后端服务器中取出来,放到缓存中。如果缓存已满,会根据 LRU 算法,释放旧的 object。对于释放缓存,有一个超时线程会检测缓存中所有 object 的生命周期,如果缓存过期 (ttl),则删除,释放相应的存储内存。

------------------------------------------------------------

-----------------------------------------------------------------------------------

Varnish 的优点:

(1)、Varnish 的稳定性很高,两者在完成相同负荷的工作时,Squid 服务器发生故障的几率要高于 Varnish,因为使用Squid 要经常重启;

(2)、Varnish 访问速度更快,Varnish 采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取,而 Squid 是从硬盘读取,因而 Varnish 在访问速度方面会更快;

(3)、Varnish 可以支持更多的并发连接,因为 Varnish 的 TCP 连接释放要比 Squid 快。因而在高并发连接情况下可以支持更多 TCP 连接;

(4)、Varnish 可以通过管理端口,使用正则表达式批量的清除部分缓存,而 Squid 是做不到的;

(5)、Squid 属于是单进程使用单核 CPU,但 Varnish 是通过 fork 形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。

 


与传统的 Squid 相比,Varnish 也有缺点:

1)、Varnish 进程一旦 Hang、Crash 或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力;

2)、在 Varnish 使用中,如果单个 url 的请求通过 HA/F5(负载均衡)、每次请求不同的 Varnish 服务器中,被请求Varnish 服务器都会被穿透到后端,而且同样的请求会在多台服务器上缓存,也会造成 Varnish 的缓存的资源浪费,也会造成性能下降。

 


解决方案:

1)、综上所述在访问量很大的情况下推荐使用 Varnish 的内存缓存方式启动,而且后面需要跟多台 Squid 服务器。主要为了防止前面的 Varnish 服务被重启的情况下,前期肯定会有很多的穿透,这样 Squid 可以担当第二层 CACHE,而且也弥补了 Varnish 缓存在内存中重启都会释放的问题;

2)、这样的问题可以在负载均衡上做 url 哈希,让单个 url 请求固定请求到一台 Varnish 服务器上,可以解决该问题。

 


注:以上内容是在借鉴别人总结的基础上,做了一些精简、修正,并加入了一些自己的总结。

 


-----------------------------------------------------------------------------------------------------------------------------------------------

系统环境:SUSE Linux Enterprise Server 10 SP1 (x86_64)

硬件配置:8G内存、8核CPU

 

 


1、编译安装

ftp://invisible-island.net/ncurses/ncurses-5.9.tar.gz

# tar xvzf ncurses-5.9.tar.gz


# ./configure --prefix=/usr/local

# make LAGS=-fPIC

# make LAGS=-fPIC install

 


http://downloads.sourceforge.net/project/pcre/pcre/8.32/pcre-8.32.tar.gz

# tar xvzf  pcre-8.32.tar.gz


# cd pcre-8.32

# ./configure --prefix=/usr/local

# make

# make install

 


ftp://ftp.gnu.org/gnu/readline/readline-6.2.tar.gz

# tar xvzf readline-6.2.tar.gz


# ./configure --prefix=/usr/local

# make

# make install

 


http://repo.varnish-cache.org/source/varnish-3.0.4.tar.gz

# tar xvzf varnish-3.0.4.tar.gz


# ./configure --prefix=/usr/local/varnish

# make

# make install

相关推荐