2.6 Varnish优化
Varnish是否能稳定、快速地运行,与Linux本身的优化及Varnish自身参数的设置有很大关系。在安装配置完Varnish后,还必须从操作系统和Varnish配置参数两个方面对Varnish服务器进行性能优化,从而最大限度地发挥Varnish的性能优势。
2.6.1 优化Linux内核参数
内核参数是用户和系统内核之间交互的一个接口,通过这个接口,用户可以在系统运行的同时动态更新内核配置,而这些内核参数是通过Linux Proc文件系统存在的。因此,可以通过调整Proc文件系统达到优化Linux性能的目的。
以下参数是官方给出的一个配置:
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 30
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
上面每个参数的含义如下:
net.ipv4.ip_local_port_range:用来指定外部连接的端口范围,默认是32 768到61 000,这里设置为1024到65 536。
net.core.rmem_max:指定接收套接字缓冲区大小的最大值,单位是字节。
net.core.wmem_max:指定发送套接字缓冲区大小的最大值,单位是字节。
net.ipv4.tcp_rmem:此参数与net.ipv4.tcp_wmem都是用来优化TCP接收/发送缓冲区的,包含3个整数值,分别是min、default、max。
对于tcp_rmem,min表示为TCP socket预留的用于接收缓存的最小内存数量,default表示为TCP socket预留的用于接收缓存的默认的内存值,max表示用于TCP socket接收缓存的内存最大值。
对于tcp_wmem,min表示为TCP socket预留的用于发送缓存的内存最小值,default表示为TCP socket预留的用于发送缓存的默认的内存值,max表示用于TCP socket发送缓存的内存最大值。
net.ipv4.tcp_fin_timeout:此参数用于减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。此参数值为整数,单位为秒。
例如,在一个tcp会话过程中,在会话结束时,A首先向B发送一个fin包,在获得B的ack确认包后,A就进入FIN-WAIT-2状态等待B的fin包,然后给B发ack确认包。net.ipv4.tcp_fin_timeout参数用来设置A进入FIN-WAIT-2状态等待对方fin包的超时时间。如果时间到了仍未收到对方的fin包就主动释放该会话。
net.core.netdev_max_backlog:该参数表示当在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数量。
net.ipv4.tcp_syncookie:表示是否打开SYN Cookie。tcp_syncookies是一个开关,该参数的功能有助于保护服务器免受SyncFlood攻击。默认值为0,这里设置为1。
net.ipv4.tcp_max_orphans:表示系统中最多有多少TCP套接字不被关联到任何一个用户文件句柄上。如果超过这里设置的数字,连接就会复位并输出警告信息。这个限制仅仅是为了防止简单的DoS攻击。此值不能太小。这里设置为262 144。
net.ipv4.tcp_max_syn_backlog:表示SYN队列的长度,预设为1024,这里设置队列长度为262 144,以容纳更多的等待连接。
net.ipv4.tcp_synack_retries:这个参数用于设置内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_syn_retries:此参数表示在内核放弃建立连接之前发送SYN包的数量。
将以上内容添加到/etc/sysctl.conf文件中,然后执行如下命令,使设置生效。
[root@varnish-server ~]#sysctl -p
2.6.2 优化系统资源
假设有这样一种情况,一台Linux 主机上同时登录了10个用户,在没有限制系统资源的情况下,这10个用户同时打开了500个文档,而每个文档的大小为10MB,这时系统的内存资源就会受到巨大的挑战。如果没有内存方面的限制,势必造成系统资源利用的混乱。而实际的应用环境要比这种假设复杂得多。这时,ulimit就派上用场了。ulimit是一种简单并且有效的实现资源限制的方式。
ulimit可以限制系统的各个方面,它通过限制shell启动进程所占用的资源,来完成对系统资源的合理利用和分配。ulimit支持对以下内容进行限制:所创建的内核文件的大小、内存锁住的大小、常驻内存集的大小、进程数据块的大小、打开文件描述符的数量、shell进程所能使用的最大虚拟内存、shell 进程创建文件的大小、分配堆栈的最大值、单个用户的最大线程数和CPU 时间等。同时,它还支持对硬资源和软资源的限制。
ulimit有临时限制和永久限制两种实现方式。临时限制可以限制通过命令行登录的shell会话,并在会话终止时结束限制,而不影响与其他shell会话。对于永久限制,ulimit命令可以将ulimit命令添加到有登录shell的配置文件中,这样就实现了对shell启动进程所占用的资源的永久限制。
ulimit使用格式如下:
ulimit [options] [value]
options 中可设置的选项的含义以及简单示例如表2-7所示。
在了解了ulimit的含义和用法以后,接下来就可以针对Varnish系统进行相关的设定。这里的参数设定值如下(此值不能一概而论,需要根据应用环境的不同,选择适合的值)。
ulimit -HSn 131072
ulimit -HSc unlimited
为了保证这个限制永久生效,最好将ulimit设置放到Varnish的启动脚本中。
2.6.3 优化Varnish参数
telnet到Varnish的3500管理端口,然后执行param.show命令即可看到Varnish运行中的所有参数。当然也可以通过这种方式更改相关参数,由于Varnish运行中用到的参数有很多,因此这里仅选取对Varnish性能影响比较大的几个参数进行介绍,更多介绍请查阅varnish官方文档。
首先查看以下4个参数:
thread_pools 4 [pools]
thread_pool_min 50 [threads]
thread_pool_max 5120 [threads]
thread_pool_timeout 10 [seconds]
thread_pools:用来设置线程池的数量。一般认为这个值和系统CPU的数目相同最好。设置多一些的pool,Varnish的并发处理能力会更强,但是也会消耗更多的CPU和内存。
thread_pool_min:用来设置每个pool的最小thread数。pool接收到可用的请求后,就会将请求分配给空闲的thread来处理。
thread_pool_max:表示所有pool对应的thread数总和的最大值。此值不能太大,设置为系统峰值的90%左右即可,设置过大会导致进程被挂起。
thread_pool_timeout:表示thread的超时过期时间。当thread数大于thread_pool_min设定值时,如果thread空闲超过thread_pool_timeout设定的时间,thread就会被释放掉。
Varnish运行中还有以下两个参数:
lru_interval 20 [seconds]
listen_depth 1024 [connections]
lru_interval:这是个时间参数,表示在内存中如果某一个对象超过了此参数设定的时间后还没有被重用时,就把这个对象从LRU(Least Recently Used)队列中移除。这是缓存系统的一个常用算法。合理地设置这个时间,可以提高系统的运行效率。
listen_depth:这个参数用于设置TCP连接队列的长度,将其设置得大一些可以提高并发处理的能力。
对于这些优化参数,最好的方式是将它们加到Varnish的启动脚本中,然后通过varnishd的“-p”参数调用即可。