千万个美丽的未来,抵不上一个温暖的现在,每一个真实的现在,都是我们曾经幻想的未来!
Jun
11
查看TCP的连接状态值:
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
vi /etc/sysctl.conf
添加如下行:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_tw_buckets = 3000
# sysctl -p 使其生效
备注:
根据TCP协议,主动发起关闭的一方,会进入TIME_WAIT状态,持续2*MSL(Max Segment Lifetime),缺省为240秒,在这个post中简洁的介绍了为什么需要这个状态。
值得一说的是,对于基于TCP的HTTP协议,关闭TCP连接的是Server端,这样,Server端会进入TIME_WAIT状态,可想而知, 对于访问量大的Web Server,会存在大量的TIME_WAIT状态,假如server一秒钟接收1000个请求,那么就会积压240*1000=240,000个 TIME_WAIT的记录,维护这些状态给Server带来负担。当然现代操作系统都会用快速的查找算法来管理这些TIME_WAIT,所以对于新的 TCP连接请求,判断是否hit中一个TIME_WAIT不会太费时间,但是有这么多状态要维护总是不好。
HTTP协议1.1版规定default行为是Keep-Alive,也就是会重用TCP连接传输多个request/response,一个主要原因就是发现了这个问题。
TCP TIME_WAIT套接字数量非常大,服务器很容易被拖死。通过修改Linux内核参数,可以减少Squid服务器的TIME_WAIT套接字数量。
# vi /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
说明:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_synack_retries = 3 表示SYN从式的次数。默认是5次,3分钟。
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改 为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参 数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
执行以下命令使配置生效:
# /sbin/sysctl -p
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
vi /etc/sysctl.conf
添加如下行:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_tw_buckets = 3000
# sysctl -p 使其生效
备注:
根据TCP协议,主动发起关闭的一方,会进入TIME_WAIT状态,持续2*MSL(Max Segment Lifetime),缺省为240秒,在这个post中简洁的介绍了为什么需要这个状态。
值得一说的是,对于基于TCP的HTTP协议,关闭TCP连接的是Server端,这样,Server端会进入TIME_WAIT状态,可想而知, 对于访问量大的Web Server,会存在大量的TIME_WAIT状态,假如server一秒钟接收1000个请求,那么就会积压240*1000=240,000个 TIME_WAIT的记录,维护这些状态给Server带来负担。当然现代操作系统都会用快速的查找算法来管理这些TIME_WAIT,所以对于新的 TCP连接请求,判断是否hit中一个TIME_WAIT不会太费时间,但是有这么多状态要维护总是不好。
HTTP协议1.1版规定default行为是Keep-Alive,也就是会重用TCP连接传输多个request/response,一个主要原因就是发现了这个问题。
TCP TIME_WAIT套接字数量非常大,服务器很容易被拖死。通过修改Linux内核参数,可以减少Squid服务器的TIME_WAIT套接字数量。
# vi /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
说明:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_synack_retries = 3 表示SYN从式的次数。默认是5次,3分钟。
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改 为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参 数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
执行以下命令使配置生效:
# /sbin/sysctl -p
Sep
3
一.文件系统调节
1.硬盘不要使用RAID
2.使用性能好的FS(例如: ReiserFS)
在fstab里面添加noatime,async项,提高文件系统的性能.
二. aufs存储机制
编辑squid-2.6.STABLE13/src/fs/aufs/store_asyncufs.h
#define ASYNC_WRITE 0 (把0修改为:1)
pthread_create(), SMP优越. (线程制)
编辑squid-2.6.STABLE13/include/autoconf.h
define DEFAULT_FD_SETSIZE 1024{1024修改为:65536}
diskd存储机制
通过消息队列和共享内存来实现进程间通信
使用Diskd存储机制而对 kernel.msgmnb等的调整
kernel.msgmnb = 16384
每个消息队列的最大字节限制
kernel.msgmni = 16 (此值可以根据需要增大)
整个系统的最大数量的消息队列, Squid对每个Cache_dir 使用两个队列, 假如你有2个磁盘,那就有2个队列.
kernel.msgmax = 8192
每个消息的最大size.
[root@jackbillow~]# sysctl -a |grep msgmnb
kernel.msgmnb = 16384
[root@jackbillow ~]# sysctl -a |grep msgmni
kernel.msgmni = 16
[root@jackbillow ~]# sysctl -a |grep msgmax
kernel.msgmax = 8192
[root@jackbillow ~]# sysctl -a |grep shmall
kernel.shmall = 2097152
[root@jackbillow ~]# sysctl -a |grep shmmni
kernel.shmmni = 4096
[root@jackbillow~]# sysctl -a |grep shmmax
kernel.shmmax = 2147483648
1.硬盘不要使用RAID
2.使用性能好的FS(例如: ReiserFS)
在fstab里面添加noatime,async项,提高文件系统的性能.
二. aufs存储机制
编辑squid-2.6.STABLE13/src/fs/aufs/store_asyncufs.h
#define ASYNC_WRITE 0 (把0修改为:1)
pthread_create(), SMP优越. (线程制)
编辑squid-2.6.STABLE13/include/autoconf.h
define DEFAULT_FD_SETSIZE 1024{1024修改为:65536}
diskd存储机制
通过消息队列和共享内存来实现进程间通信
使用Diskd存储机制而对 kernel.msgmnb等的调整
kernel.msgmnb = 16384
每个消息队列的最大字节限制
kernel.msgmni = 16 (此值可以根据需要增大)
整个系统的最大数量的消息队列, Squid对每个Cache_dir 使用两个队列, 假如你有2个磁盘,那就有2个队列.
kernel.msgmax = 8192
每个消息的最大size.
引用
[root@jackbillow~]# sysctl -a |grep msgmnb
kernel.msgmnb = 16384
[root@jackbillow ~]# sysctl -a |grep msgmni
kernel.msgmni = 16
[root@jackbillow ~]# sysctl -a |grep msgmax
kernel.msgmax = 8192
[root@jackbillow ~]# sysctl -a |grep shmall
kernel.shmall = 2097152
[root@jackbillow ~]# sysctl -a |grep shmmni
kernel.shmmni = 4096
[root@jackbillow~]# sysctl -a |grep shmmax
kernel.shmmax = 2147483648
May
20
Squid是一个缓存Internet数据的高性能代理服务器软件。当一个用户想要访问一个网页或下载一个文件时,会首先向Squid发出访问请求,由Squid代替其进行网页或文件下载,Squid在把该网页或文件传给用户的同时会在本机保留一个缓存备份。当别的用户访问同样的网页时,Squid会把保存的网页备份立即传给用户,使用户觉得速度相当快,同时也降低了后端数据来源Web服务器的压力。Squid可以代理HTTP、FTP、GOPHER、SSL和WAIS协议,暂不能代理POP3、NNTP等协议。Squid可以工作在很多操作系统中,如AIX、Digital、Unix、FreeBSD、HP-UX、Irix、Linux、NetBSD、Nextstep、SCO、Solaris、OS/2等。
目前Squid已经在新浪、搜狐、网易、腾讯等各大门户网站广泛使用,成为必不可少的服务器软件之一。
《Squid中文权威手册》由Squid创始人 Duane Wessels 所著的英文版《Squid: The Definitive Guide》翻译而来,其译者曾在新浪、网易工作过。
在线版:http://blog.s135.com/book/squid/ (便于阅读与查询)
PDF版:http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=1998985 (排版规范,可下载后打印出来看)
目前Squid已经在新浪、搜狐、网易、腾讯等各大门户网站广泛使用,成为必不可少的服务器软件之一。
《Squid中文权威手册》由Squid创始人 Duane Wessels 所著的英文版《Squid: The Definitive Guide》翻译而来,其译者曾在新浪、网易工作过。
在线版:http://blog.s135.com/book/squid/ (便于阅读与查询)
PDF版:http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=1998985 (排版规范,可下载后打印出来看)
May
17
[文章作者:张宴 本文版本:v1.0 最后修改:2007.08.02 转载请注明出处:http://blog.s135.com]
Squid web缓存加速软件目前已经是新浪、搜狐、网易等各大网站广泛应用。Squid会在设置的缓存目录下建立多个目录,每一个目录下又建立多个目录,然后才在最里层的目录中存放缓存文件(object)。squid会根据用户请求网页的URL进行哈希,生成缓存文件,存放在某一个目录中。squid启动之后,将在内存中建立一个哈希表,记录硬盘中缓存文件配置的情形。
对于类似http://you.video.sina.com.cn/index.html之类的网页,squid只会生成一个缓存文件。可以用squid附带的squidclient工具清除:
squidclient -m PURGE -p 80 "http://you.video.sina.com.cn/index.html"
而对于带有参数的网页,例如新浪播客的Flash播放器http://vhead.blog.sina.com.cn/player/outer_player.swf?auto=0&vid=4469852&uid=1278987704,因“?”后面的参数不同,导致URL也不同,squid会生成多个缓存文件,哈希分散存放在不同的目录。如果修改了这个outer_player.swf文件,要更新squid缓存就要去清除不同目录下及内存中的很多个缓存文件,十分麻烦,于是我编写了一个Linux下的shell脚本,去完成这件麻烦的事:
脚本文件名:clear_squid_cache.sh(8月2日修正了UC网友“城市中的寂寞”反馈的BUG)
注意:请赋予clear_squid_cache.sh可执行权限(命令:chmod +x ./clear_squid_cache.sh)。请确保脚本所在目录可写。
设置:
squidcache_path= 表示squid缓存目录的路径
squidclient_path= 表示squidclient程序所在的路径,默认为squid安装目录下的bin/squidclient
用法:
1、清除所有Flash缓存(扩展名.swf):
./clear_squid_cache.sh swf
2、清除URL中包含sina.com.cn的所有缓存:
./clear_squid_cache.sh sina.com.cn
3、清除文件名为zhangyan.jpg的所有缓存:
./clear_squid_cache.sh zhangyan.jpg
效率:
经测试,在DELL 2950上清除26000个缓存文件用时2分钟左右。平均每秒可清除缓存文件177个。
Squid web缓存加速软件目前已经是新浪、搜狐、网易等各大网站广泛应用。Squid会在设置的缓存目录下建立多个目录,每一个目录下又建立多个目录,然后才在最里层的目录中存放缓存文件(object)。squid会根据用户请求网页的URL进行哈希,生成缓存文件,存放在某一个目录中。squid启动之后,将在内存中建立一个哈希表,记录硬盘中缓存文件配置的情形。
对于类似http://you.video.sina.com.cn/index.html之类的网页,squid只会生成一个缓存文件。可以用squid附带的squidclient工具清除:
squidclient -m PURGE -p 80 "http://you.video.sina.com.cn/index.html"
而对于带有参数的网页,例如新浪播客的Flash播放器http://vhead.blog.sina.com.cn/player/outer_player.swf?auto=0&vid=4469852&uid=1278987704,因“?”后面的参数不同,导致URL也不同,squid会生成多个缓存文件,哈希分散存放在不同的目录。如果修改了这个outer_player.swf文件,要更新squid缓存就要去清除不同目录下及内存中的很多个缓存文件,十分麻烦,于是我编写了一个Linux下的shell脚本,去完成这件麻烦的事:
脚本文件名:clear_squid_cache.sh(8月2日修正了UC网友“城市中的寂寞”反馈的BUG)
引用
#!/bin/sh
squidcache_path="/data1/squid/var/cache"
squidclient_path="/usr/local/squid/bin/squidclient"
grep -a -r $1 $squidcache_path/* | strings | grep "http:" | awk -F'http:' '{print "http:"$2;}' > cache_list.txt
for url in `cat cache_list.txt`; do
$squidclient_path -m PURGE -p 80 $url
done
squidcache_path="/data1/squid/var/cache"
squidclient_path="/usr/local/squid/bin/squidclient"
grep -a -r $1 $squidcache_path/* | strings | grep "http:" | awk -F'http:' '{print "http:"$2;}' > cache_list.txt
for url in `cat cache_list.txt`; do
$squidclient_path -m PURGE -p 80 $url
done
注意:请赋予clear_squid_cache.sh可执行权限(命令:chmod +x ./clear_squid_cache.sh)。请确保脚本所在目录可写。
设置:
squidcache_path= 表示squid缓存目录的路径
squidclient_path= 表示squidclient程序所在的路径,默认为squid安装目录下的bin/squidclient
用法:
1、清除所有Flash缓存(扩展名.swf):
./clear_squid_cache.sh swf
2、清除URL中包含sina.com.cn的所有缓存:
./clear_squid_cache.sh sina.com.cn
3、清除文件名为zhangyan.jpg的所有缓存:
./clear_squid_cache.sh zhangyan.jpg
效率:
经测试,在DELL 2950上清除26000个缓存文件用时2分钟左右。平均每秒可清除缓存文件177个。