varnish是否能稳定、快速的运行,与Linux本身的优化以及varnish自身参数的设置有很大关系,在varnish安装配置完成后,还必须从操作系统和varnish配置参数两个方面对varnish服务器进行性能优化,从而最大程度上发挥varnish的性能。
一、优化linux内核参数
内核参数是用户和系统内核之间交互的一个接口,通过这个接口,用户可以在系统运行的同时动态的更新内核配置,而这些内核参数是通过Linux Proc文件系统存在的,因此,可以通过对Proc文件系统进行调整,达到性能优化的目的。
以下参数是官方给出的一个配置,内容如下:
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:用来指定外部连接的端口范围,默认是32768到61000,这里设置为1024到65536。
net.core.rmem_max:该文件指定了接收套接字缓冲区大小的最大值,单位是字节。
net.core.wmem_max:该文件指定了发送套接字缓冲区大小的最大值,单位是字节。
net.ipv4.tcp_rmem:此参数与net.ipv4.tcp_wmem都是用来优化TCP接收/发送缓冲区,包含三个整数值,分别是: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 WAIT2状态等待B的fin包,然后给B发ack确认包。此参数就是用来设置A进入FIN WAIT2状态等待对方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***。此值不能太小。这里设置为262144。
net.ipv4.tcp_max_syn_backlog:表示SYN队列的长度,预设为1024,这里设置队列长度为262144,以容纳更多等待连接。
net.ipv4.tcp_synack_retries:这个参数用于设置内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_syn_retries:此参数表示在内核放弃建立连接之前发送SYN包的数量。
将以上内容添加到/etc/sysctl.conf文件中,然后执行如下命令,让设置生效:
[root@varnish-server ~]#sysctl -p
二、优化系统资源
假设有这样一种情况,当一台Linux 主机上同时登陆了10个人,在系统资源没有限制的情况下,这10个用户同时打开了500个文档,而假设每个文档的大小有10M,这时系统的内存资源就会受到巨大的挑战。如果没有内存方面的限制,势必造成系统资源利用的混乱,而实际的应用环境要比这种假设复杂的多,这时,ulimit就派上用场了。它是一种简单并且有效的实现资源限制的方式。
ulimit可以限制系统的各个方面,它通过限制shell启动进程所占用的资源,来完成系统资源的合理利用和分配,ulimit支持以下各种类型的限制:所创建的内核文件的大小、内存锁住的大小、常驻内存集的大小、进程数据块的大小、打开文件描述符的数量、Shell进程所能使用的最大虚拟内存、Shell 进程创建文件的大小、分配堆栈的最大大小、单个用户的最大线程数、CPU 时间等。同时,它还支持硬资源和软资源的限制。
ulimit有临时限制和永久限制两种实现方式,它可以限制通过使用其命令行登录的shell会话,并在会话终止时结束限制,而不影响于其它shell会话。对于长期的固定限制,ulimit的命令可以添加到由登录shell的配置文件中,这样就实现了永久限制shell启动进程所占用的资源。
Ulimit使用格式为:ulimit [options] [value]
具体的options 含义以及简单示例如表1所示:
表1
在了解了ulimit的含义和用法以后,接下来就可以针对varnish系统进行相关的设定了,这里的参数设定值如下所示,但是此值不能一概而论,需要根据应用环境的不同,选择适合的值:
ulimit -HSn 131072
ulimit -HSc unlimited
为了保证这个限制永久生效,最好将ulimit设置放到varnish的启动脚本中。
三、Varnish参数优化
通过telnet到varnish的3500管理端口,然后执行“param.show”命令即可看到varnish运行中的所有参数,当然也可以通过这种方式更改相关参数,varnish运行中的参数有很多,这里仅选取对varnish性能影响比较大的几个参数进行介绍,更多介绍请查阅官方文档。
首先看下面四个参数:
thread_pools 4 [pools]
thread_pool_min 50 [threads]
thread_pool_max 5120 [threads]
thread_pool_timeout 10 [seconds]
thread_pools:用来设置线程池的数量,一般认为这个值和系统CPU的数目相同最好,设置过多的pools,varnish的并发处理能力会更强,但是也会消耗更多的CPU和内存。
thread_pool_min:用来设置每个pools的最小threads数,当pools接收到可用的请求后,就会将请求分配给空闲的threads来处理。
thread_pool_max:表示所有pools对应的threads数总和的最大值,此值不能太大,可以设置为系统峰值的90%左右即可,设置过大,会导致进程hung住。
thread_pool_timeout:表示threads的超时过期时间,当threads数大于thread_pool_min设定值时,threads空闲超过thread_pool_timeout设定的时间时,thread就会被释放掉。
另外还有两个参数:
lru_interval 20 [seconds]
listen_depth 1024 [connections]
lru_interval:这是个时间参数,大概意思是说如果有一个对象在内存中超过了此参数设定的时间还没有被重用时,就把这个对象从LRU(Least Recently Used)队列中移除。这其实是缓存系统的一个常用算法,合理的设置这个时间,可以提高系统的运行效率。
listen_depth:这个参数是设置TCP连接队列的长度,设置大一点可以提高并发处理能力。
对于这些优化参数,最好的方式是加到varnish的启动脚本中,通过varnishd的“-p”参数调用即可。