Varnish(官网)是一个基于内存的缓存系统,是一款非常优秀的反向代理服务器软件。但不管你是编译安装还是通过类似yum、apt二进制分发的方式安装的,其默认参数只是针对普通用户设置,过于保守,在繁忙的机器上是不够的。高阶用户需要对这些参数进行调整以提高性能。对Varnish的调整优化,主要是对启动进程参数的优化。
Varnish的安装相对简单,对于Centos 5.x/6.x系统,安装过程如下:
a.下载源码编译
cd /usr/local/src wget -c http://repo.varnish-cache.org/source/varnish-3.0.4.tar.gz tar -zxf varnish-3.0.4.tar.gz cd varnish* ./autogen.sh ./configure --prefix=/usr/local/varnish make make install
/usr/bin/uuidgen > /etc/varnish/secret && chmod 0600 /etc/varnish/secret /usr/bin/install -m 755 ./redhat/varnish.initrc /etc/rc.d/init.d/varnish /usr/bin/install -m 755 ./redhat/varnishncsa.initrc /etc/rc.d/init.d/varnishncsa /usr/bin/install -m 644 ./redhat/varnish.sysconfig /etc/sysconfig/varnish /usr/bin/install -m 755 ./redhat/varnish_reload_vcl /usr/local/varnish/bin/
ln -s /usr/local/varnish/bin/varnish_reload_vcl /usr/bin/ ln -s /usr/local/varnish/bin/varnishncsa /usr/bin/ ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/ ln -s /usr/local/varnish/bin/varnishadm /usr/bin/ ln -s /usr/local/varnish/bin/varnishstat /usr/bin/ ln -s /usr/local/varnish/bin/varnishhist /usr/bin/ ln -s /usr/local/varnish/bin/varnishlog /usr/bin/ ln -s /usr/local/varnish/bin/varnishtop /usr/bin/
chkconfig --add varnish chkconfig varnish on chkconfig --add varnishncsa chkconfig varnishncsa on
b.建立用户varnish
/usr/sbin/groupadd -g 1000 -o -r varnish /usr/sbin/useradd -M -g varnish -o -r -d /dev/null -s /bin/false -c "Varnish-Cache Server" -u 1000 varnish mkdir -p {/etc/varnish,/var/log/varnish,/var/lib/varnish}
现在进行varnish参数的调整,Centos系统的启动参数调整主要是在/etc/sysconfig/varnish这个文件中进行调整,init命令位于/etc/rc.d/init.d/varnish。
A.基础配置
主要需要了解和配置的几个参数:
vi /etc/sysconfig/varnish
VARNISH_VCL_CONF=/etc/varnish/default.vcl #指定默认配置文件的路径
VARNISH_LISTEN_ADDRESS=192.168.11.141 #指定varnish监听的IP,如果为空或0.0.0.0则监听所有的网卡IP
VARNISH_LISTEN_PORT=80 #指定varnish监听的端口,该项不能为空
VARNISH_ADMIN_LISTEN_ADDRESS=192.168.11.141 #varnish telnet admin管理cli监听的IP,如果为空或0.0.0.0则监听所有的网卡IP
VARNISH_ADMIN_LISTEN_PORT=6082 #varnish telnet admin管理cli监听的端口
VARNISH_SECRET_FILE=/etc/varnish/secret #telnet 管理cli时的共享密钥文件,可用uuidgen生成一个
关键配置的地方
VARNISH_MIN_THREADS=50 #启动时的最小工作线程,默认50,该值不应设置太小,保持默认即可。
VARNISH_MAX_THREADS=1000 #启动时的最大工作线程,默认值1000,根据需要进行调整,但也不能太高,通常设置为稳定运行时派生线程浮动20%。
VARNISH_THREAD_TIMEOUT=120 #线程超时时间,默认值120,单位秒,可以根据机器性能进行调整,高并发网站可以相对设置小一些。我自己理解是可以使响应更为灵敏。
指定缓存的存储方式和缓存文件位置
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin #文件保存位置
VARNISH_STORAGE_SIZE=1G #缓存文件大小,单位:k/M/G/T
VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}" #缓存存储方式指定
varnish的缓存存储方式有两种:malloc和file(Mmap),即通过内存进行缓存存储和通过文件系统进行存储。
建议:
a):在机身内存剩余较多(大于装机内存50%)的情况下,优先采取内存进行缓存的存储
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}"
b):机身内存不多或在内存较小的VPS或cloudserver的情况,应当选择通过文件系统进行存储
VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
tip:如果所在的机器IO非常繁忙,可以适当利用/dev/shm进行存储,但当重启时,缓存将会丢失。
VARNISH_STORAGE_FILE=/dev/shm/varnish_storage.bin
VARNISH_TTL=120 #设置默认的ttl值,超过这个值的会被丢弃(当vcl没有配置ttl时)
B.进阶配置
假设你的服务器拥有多颗逻辑处理器,还可以做以下的设置:
/etc/sysconfig/varnish 里面还可以添加自定义的参数,用”-p 参数“的方式添加,如:
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \ -f ${VARNISH_VCL_CONF} \ -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \ -t ${VARNISH_TTL} \ -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \ -u varnish -g varnish \ -S ${VARNISH_SECRET_FILE} \ -s ${VARNISH_STORAGE} \ -p thread_pools=2" #这里为添加项
这里主要是用到的参数
-p thread_pools=8 #系统启动varnish由root用户派生的线程池,理想情况下是一个cpu core配置一个pool,过多的pool对系统无益,适当增加能提高并发数。
-p thread_pool_min=200 #默认值:5,每个线程池最小的线程数量,该值乘于thread_pools的数量能满足日常运行即可。
-p thread_pool_max=4000 #默认值:1000,每个线程池最大线程数量,个人认为该值意义并不是太大,2000~4000都算大,增大该值只会让系统在高并发时派生出更多线程进行处理,之后这些线程变成空闲线程而被回收,处理器将疲于处理线程的派生和回收。如果你发现正常运行下varnish线程数很大,再增大该值也不会让你的系统负载降低,显然检查问题比增大该值更重要。事实上,该值乘于线程池会是个很大的数值,4000x8。。。
-p thread_pool_add_delay=2 #线程派生延迟,默认是20ms,减至2ms可以更快创建线程,特别是在启动时,可有效降低意外重启时队列和请求丢弃的情况发生。
-p listen_depth=4096 #监听tcp队列depth,即连接数,默认值:1024 适当增大该值可提高并发能力,该值还需结合系统systel中net.core.somaxconn的值进行。
-p http_max_hdr=256 #请求头的行数,默认值:64 增大该值可减少400错误的产生。
-p http_req_hdr_len=8192 #客户端发起请求头最大长度,默认值:8192
-p http_resp_hdr_len=8192 #后端响应头最大长度,默认值:8192
-p cli_timeout=25 #cli超时,默认10s,如果varnish负载较大,cli无法及时管理子线程,会造成误杀。增大该值可避免这种情况的发生。
-p session_linger=100 #版本大于2.0.4默认值均为50,增大该值可避免过多的上下文切换,session复用?
-p send_timeout=1200 #默认值:600,单位s,增大该值可避免传输会话过早被关闭,如下载大文件时,客户端还没有下载完,传输会话却已关闭。该值还应结合访客到服务器的网络情况进行调整。
-p lru_interval=30 #默认值:2,单位s,用于更新LRU列表,涉及obj元素的复用。增大该值可以降低将对象移动到LRU(Least Recently Used)队列的频率,理论上会提高整体效率。
如有遗漏,还请网友指出,互相学习为盼。
本文参考了以下文档
https://www.varnish-cache.org/docs/3.0/reference/varnishd.html
https://www.varnish-cache.org/trac/wiki/Performance
http://www.lullabot.com/blog/article/configuring-varnish-high-availability-multiple-web-servers
http://kly.no/posts/2009_10_19__High_end_Varnish_tuning__.html