场景。golang client,golang server, nginx转发 等等
1.原先问题。服务器有大量的timewait
第一步,发现nginx的proxy_pass反向代理,并不会保持链接,而是新建一个链接,研究发现。需要加一个upstream 模块,里面添加一个keepalive的参数, proxypass 不再写定上游服务器,而是对应upstream的名字,再重写一些http header,使得tcp链接保持活跃长期使用
第二步,golang 自身的http server,默认是开启keepalive且没有超时,基于这个做下面的步骤
第三步,golang 的 http client默认的tran对于长链有一个特殊参数。
var hc = http.Client{}
func init() {
var defaultTransportPointer = http.DefaultTransport.(*http.Transport)
// 复制默认的 Transport,以便修改而不影响原始的 DefaultTransport
customTransport := *defaultTransportPointer
// 现在可以安全地修改 customTransport 的字段了
customTransport.MaxIdleConns = 3100 # 这里是最大的空闲链接
customTransport.MaxIdleConnsPerHost = 3100 # 这里是每个host最大的空闲链接
customTransport.IdleConnTimeout = 1800 * time.Second
hc.Timeout = 30 * time.Second
hc.Transport = &customTransport
}
默认的maxIdleConnsPerHost=2,虽然http request使用了coonpool策略,但由于只有2最大conn,所以当并发大量请求时,就会产生大量的conn,造成大量的timewait,所以要重新设置tran,加大上述两个参数