环境:
Tengine/2.2.0 (nginx/1.8.1)
CentOS release 6.3 (Final)
场景: 压测机 -> tengine -> tomcat , 前后端均开启了长连接. 且正常测试过长连接生效无误.压测机压测时也均开启了keep-alive长连接. 压测请求为一个极为简答的请求. 问题: 1.通过ip_hash进行会话保持的时候, 后端(tengine->tomcat)的长连接生效.而且TCP通道得到了复用.因为 ESTABLISHED连接数量稳定, TIME_WAIT 数量很少.. 2.通过session_sticky开启会话保持的时候,后端(tengine->tomcat)的长连接也生效了,但是却没有复用这个TCP通道.每一个请求从现象上看来都重新建立了TCP连接. 因为监控看到 ESTABLISHED 明显增大很多, 同时TIMC_WAIT状态的数量更是巨大,达到几W甚至10W以上,前面的场景只有几百的TIME_WAIT. 开启ip_hash的参数:
upstream srv_backend{
session_sticky cookie=route;
server 1.1.1.1:8080;
server 2.2.2.2:8080;
keepalive 50000;
check interval=5000 rise=3 fall=3 timeout=5000 type=http;
check_http_send "GET /monitor.html HTTP/1.0\r\nConnection: keep-alive\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
开启session_sticky的参数
upstream srv_backend{
ip_hash;
server 1.1.1.1:8080;
server 2.2.2.2:8080;
keepalive 50000;
check interval=5000 rise=3 fall=3 timeout=5000 type=http;
check_http_send "GET /monitor.html HTTP/1.0\r\nConnection: keep-alive\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
我现在不太确定,到底是因为session_sticky模块的问题.还是本身http协议原理上就是这样处理的. 为什么我用ip_hash的时候却没有问题?