1、压测问题
用户端下单流程”场景,5倍压力,tcp_time_wait打满6000
2 、方案1【配置长连接】
出现大量TIME_WAIT的情况:
- keepalive_requests设置比较小,高并发下超过此值后
nginx会强制关闭和客户端保持的keepalive长连接; - keepalive设置的比较小(空闲数太小),导致高并发下nginx
会频繁出现连接数震荡(超过该值会关闭连接),不停的关闭、开启和
后端server保持的keepalive长连接;
http {
// 全局配置
// 长连接响应timeout
keepalive_timeout 60s;
// 与Client连接的"一个长连接"送达的最大请求数(默认是100)
// 当送达的请求数超过该值后,该连接就会被关闭。
keepalive_requests 8192;
upstream servers {
server 127.0.0.1:7985 ;
server 127.0.0.1:7986 ;
// 如果空闲的keepalive连接大于该值,最近使用最少的连接将会被关闭。
// 连接到上游服务器的最大空闲keepalive长连接数
keepalive 200;
}
server {
listen 8080;
www.lonk.com 127.0.0.1;
location / {
proxy_pass http://servers;
// 长链接:使用1.1版本。
proxy_http_version 1.1;
// 允许重新定义或追加字段到传递给代理服务器的请求头信息
proxy_set_header Connection "";
// 请求数与超时时间
keepalive_requests 2000;
keepalive_timeout 120s;
}
}
}
2、方案2【Linux的Net配置】
tcp链接在经过四次握手结束连接后并不会立即释放,而是处于timewait状态,
会等待一段时间,以防止客户端后续的数据未被接收。
1. 调整tcp链接结束后等待时间:
#timewait 的数量,默认是 180000。
net.ipv4.tcp_max_tw_buckets = 6000
# 启用 timewait 快速回收。
net.ipv4.tcp_tw_recycle = 1
#开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接。
net.ipv4.tcp_tw_reuse = 1
尽量不要改动:
https://coolshell.cn/articles/11564.html
4、Jmeter压测验证结果
- 补充
Elapsed time :从发送请求到收到最后的响应时间,所花费的时间。不包括渲染请求所花费的时间,同时也不包括处理客户端脚本所花费的时间。Sample time = Load time = Response time。
Latency:从发送请求到收到第一个响应,所花费的时间。网上还有种说法,就是响应信息越大,差别越大。
Connect Time:建立连接所花费的时间。包括SSL三次握手的时间。值的注意的latency没有减去建立连接花费的时间,当出现链接超时等错误,这个会等于链接超时时间