网站相关技术探究keepalive_timeout(转)
网站相关技术探究keepalive设多少:
/proc/$PID/fd/$number
0:标准输入
1:标准输出
2:标准错误
|
Test:
[root@KTQT ~]# ll /proc/12857/fd
total 0
lrwx------ 1 root root 64 Apr 4 17:49 0 -> /dev/null
lrwx------ 1 root root 64 Apr 4 17:49 1 -> /dev/null
lrwx------ 1 root root 64 Apr 4 18:30 18 -> socket:[475691]
lrwx------ 1 root root 64 Apr 4 18:30 19 -> socket:[475692]
l-wx------ 1 root root 64 Apr 4 17:49 2 -> /usr/local/nginx/logs/error.log
lrwx------ 1 root root 64 Apr 4 18:30 20 -> socket:[475694]
lrwx------ 1 root root 64 Apr 4 18:30 21 -> socket:[475695]
lrwx------ 1 root root 64 Apr 4 18:30 22 -> socket:[475698]
lrwx------ 1 root root 64 Apr 4 18:30 23 -> socket:[475699]
lrwx------ 1 root root 64 Apr 4 18:30 24 -> socket:[475701]
lrwx------ 1 root root 64 Apr 4 18:30 25 -> socket:[475702]
lrwx------ 1 root root 64 Apr 4 17:49 3 -> socket:[475689]
l-wx------ 1 root root 64 Apr 4 17:49 4 -> /usr/local/nginx/logs/access.log
l-wx------ 1 root root 64 Apr 4 17:49 5 -> /usr/local/nginx/logs/error.log
lrwx------ 1 root root 64 Apr 4 17:49 6 -> socket:[128687]
lrwx------ 1 root root 64 Apr 4 19:33 7 -> socket:[475690]
|
tail -f /proc/12857/fd/2
2013/04/04 18:06:32 [error] 12861#0: *31 open() "/www/favicon.ico" failed (2: No such file or directory), client: 1.202.193.244, server: www.a.com, request: "GET /favicon.ico HTTP/1.1", host: "*.****.com" |
一个简单的html文件:
tail -f /proc/12857/fd/4
访问测试:
1.202.193.244 - - [04/Apr/2013:18:13:37 +0800] "GET / HTTP/1.1" 200 19 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.2.0.0 Safari/537.17"
1.202.193.244 - - [04/Apr/2013:18:13:37 +0800] "GET /favicon.ico HTTP/1.1" 404 570 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.2.0.0 Safari/537.17"
|
初次访问会产生两个链接:
[root@KTQT ~]# netstat -an|grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 192.168.100.99:80 1.202.193.244:12988 ESTABLISHED
tcp 0 0 192.168.100.99:80 1.202.193.244:12989 ESTABLISHED
|
这个过程大概是20S,多测几次值会很准确。
1.202.193.244 - - [04/Apr/2013:18:13:50 +0800] "-" 400 0 "-" "-" |
这是处理一个链接的时间:即从开始到关闭消耗时间:13:37-13:50=3s,即处理一个html理想状态是3秒。当然同时处理多个算法不可能是*/3,模型不一样。
[root@KTQT ~]# netstat -an|grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 192.168.100.99:80 1.202.193.244:12988 ESTABLISHED
|
此时会断开,是配置文件里的keepalive_timeout所决定的。
[root@KTQT ~]# cat /usr/local/nginx/conf/nginx.conf|grep keep
keepalive_timeout 60; |
[root@KTQT ~]# netstat -an|grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN |
来个完整的,间隔两次都是19s。
1.202.193.244 - - [04/Apr/2013:18:23:51 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.2.0.0 Safari/537.17"
1.202.193.244 - - [04/Apr/2013:18:23:51 +0800] "GET /favicon.ico HTTP/1.1" 404 570 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.2.0.0 Safari/537.17"
1.202.193.244 - - [04/Apr/2013:18:24:10 +0800] "-" 400 0 "-" "-"
1.202.193.244 - - [04/Apr/2013:18:25:01 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.2.0.0 Safari/537.17"
1.202.193.244 - - [04/Apr/2013:18:25:01 +0800] "GET /favicon.ico HTTP/1.1" 404 570 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.2.0.0 Safari/537.17"
1.202.193.244 - - [04/Apr/2013:18:25:20 +0800] "-" 400 0 "-" "-"
|
我们修改keeplive测试一下:
[root@KTQT ~]# cat /usr/local/nginx/conf/nginx.conf |grep keepalive_timeout
keepalive_timeout 20; |
[root@KTQT ~]# kill -hup `cat /usr/local/nginx/nginx.pid`
test:
[root@KTQT ~]# date ; netstat -an |grep :80
Thu Apr 4 18:51:09 CST 2013
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 192.168.100.99:80 1.202.193.244:14759 ESTABLISHED
tcp 0 0 192.168.100.99:80 1.202.193.244:14760 ESTABLISHED
|
[root@KTQT ~]# date ; netstat -an |grep :80
Thu Apr 4 18:51:28 CST 2013
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 192.168.100.99:80 1.202.193.244:14759 ESTABLISHED
|
[root@KTQT ~]# date ; netstat -an |grep :80
Thu Apr 4 18:51:29 CST 2013
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
|
正好是20S。
Keepalive_timewate:是啥?
转载:http://www.perfgeeks.com/?p=673
http keepalive
在http早期 ,每个http请求都要求打开一个tpc
socket连接,并且使用一次之后就断开这个tcp连接。使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会
断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd
服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。但是,keep-alive并不是
免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。所以,正确地设置
keep-alive timeout时间非常重要。
keepalvie timeout
Httpd守护进程,一般都提供了keep-alive
timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个
keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住
keepalive_timeout秒后,才开始关闭这个连接。当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置
keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是
keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http连接。
怎么设置这个值?
性能上面引用已经说了,等待此用户重新链接而保持的一个连接。性能和体验是有一个妥协过程。我们知道一端口最大连接数是在内核参
数"net.ipv4.ip_local_port_range"所定制的,假设我们设置为net.ipv4.ip_local_port_range
1024-65535 即可用本地端口v80 64511*IP数(但我还没见过不同IP重复端口的)可以用"netstat -an|grep :80
|awk '{printf $5"\n"}'|awk -F: '{printf $2"\n"}' |uniq
-dc"来获得。所以我一般计算会用64511/users-此时users所占keepalive_timeout个数。即1000个用户同时访问此静
态页。?*1+?所占keepalive时间=64511。假设1000个用户同时访问,即
64511-(1000*1)-(1000*20)=43511
下一秒再来1000用户即22511再下一秒1511,那下一秒怎么办?即可以处理3秒就完蛋了。或许17秒后可以重新获得20000的连接,可再多支撑
一秒。而且此计算是非常理论的值,上面可以看到一个连接到关闭是要15-20秒左右,之后才是keepalive_timeout时间。
结论:那么设多少?我也不知道,一个结点,超出这个结点性能反而下降,没到这个结点那么会省很多资源消耗。一个良好的算法是,大多数用户重复点击的次数。一般不大可能是60,当然存在那些内容站,看完内容再看下一个内容。但消耗一个比建立链接时间相比较。首页即网站加载时间+可等待时间。
下面两张图,TCP状态,很多人不了解,第一张取自LVS配置说明里的,因为是打印后用笔写过所以不是原版的。,大家将就着看。