解决golang http连接池的一天

解决golang http连接池的一天

场景。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,加大上述两个参数

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇