为什么希望把短连接改成长连接(persistent connection)?
纯理论分析
优点1. 对于每个请求,减少三次握手。2. 对于服务器,将会减少建立连接导致的开销。包括内核进程分配TCB、建立连接时产生软中断、 内核进程与用户进程切换时的时间开销。 3. 因为tcp segments的减少,减轻了网络的负担。4. 更关键的是,减少响应时间。
缺点1. 服务器(或代理服务器)需要维护连接队列,这将导致内存开销增大。 2. 其它,还没想到
HTTP是基于TCP的应用层协议,一个完整的HTTP事务中,服务器和客户端是这么交互的。
三次握手结束时,客户端与服务器约定好TCP窗口大小,服务器的窗口最小值默认为4096字节。 在server与client都处于连接态时,client向server发送request, server处理结束时, server向client发送response。 长连接与短连接的最大区别就在于,在保持连接的过程中减少了三次握手以及四次分手的时间和系统开销 。
应用分析
1. api接口返回的数据平均大小?取2.80上100000条连续的nginx访问日志进行分析,返回的 http response 的大小分布是(以4k做为分隔):
size < 4000 95233 95.2%4000 <= size < 8000 636 0.6%size >= 8000 4018 4.0%
max : 277909min : 0cnt : 100000sum : 3059716avg : 30 bytes/request
2. 十、二十、三十分钟内,api 的会话数,平均每会话发起的请求数?取10.20的api日志进行分析。 (这个时候api的日活跃用户为15w,周报活为60w)会话= userid:deviceid
时间 会话数 总请求数 requests/session 10分钟 10:00 ~ 10:10 42677 1005937 23.5 20分钟 10:00 ~ 10:20 72048 1913270 26.5 30分钟 10:00 ~ 10:30 98959 2715227 27.4
3. 从应用的情况来看,适宜将长连接的时间保持在10分钟,且每连接处理请求上限为50。
测试情况简述
1. 测试工具:短连接 apache bench;长连接 autobench;2. 测试过程简述:客户端(apache-bench or autobench)向服务器发起n个静态页面请求。记录从第一个请求和最后一个请求的响应时间t1及t2, 记录服务器平均每秒处理的请求数。 同时通过cacti记录t1和t2间系统的状况。 3. 测试数据
concurrent 测试类型 last time(s) request count rps cpu(max) system loads
(1minute,max)系统TCP状态 300 短连接 168.783 1,200,000 7109.74 user: 7.4
sys: 14.59
soft-iraq: 18.15
sum: 40.874.64 长连接 240 640,000 2666.67 user:2.88
sys:4.48
soft-iraq:3.66
sum:11.241.5 ESTABISHED 0
ACTIVE 16021200 短连接 144.791 1,200,000 8287.8 user: 8.76
sys:15.11
soft-iraq:19.56
sum:44.055.88 ESTABISHED 184
ACTIVE 12812长连接 267 1,469,631 5504 user: 7.23
sys:9.37
soft-iraq:9.39
sum:26.525.15 ESTABISHED 1202
ACTIVE 62082400 短连接 171.292 1,200,000 7005.58 user: 8.79
sys:13.19
soft-iraq:16.95
sum:39.754.53 ESTABISHED 519
ACTIVE 21378长连接 326 2244470 6884.88 user:7.06
sys:8.90
soft-iraq:8.75
sum:25.224.93 ESTABISHED 1671
ACTIVE 4634
从测试的情况来看,采用长连接时,系统的CPU相对来说处于较低的水平;而系统的吞吐率, 在并发连接数在1000以上时,才会明显一些;系统消耗的内存, 在百兆级别的范围内波动,在cacti上并不明显, 因而没有统计数据。
4. 后续跟进:因为测试工具、测试环境的限制,比较难模拟高并发情况,将和客户端协商将短连接换成长连接, 并打开其中一台 api 服务器的nginx长连接开关,观察表现。
参考资料:1. 短连接改成长连接之后tps 的提升2. http persistent latency3. lvs 源地址散列调度 http://blog.csdn.net/ixidof/article/details/ 6673634 5. tcp/ip http://www.faqs.org/rfcs/rfc1180.html 6. autobench(not ab!!!) http://www.xenoclast.org/autobench/