Golang http client 关闭连接 && too many open files

问题

使用Golang去批量下载所需要的数据时,由于http client发起请求并且读取body之后,没有正确设置Transport,并且没有关闭Body,导致机器上面出现大量的CLOSE_WAIT状态的连接。

相关概念

  1. CLOSE_WAIT:被动关闭方会进入的状态,已经收到主动关闭方的FIN,但是还没有发送FIN到主动关闭方。
  2. max_open_files:每个进程都有一个最大文件描述符的限制。

解决办法

  1. 对于CLOSE_WAIT,最关键的是client端没有close连接,没有发送FIN到服务端。所以对于Golang自带的http包,需要这样写:
trans := http.Transport {
    DisableKeepAlives : true
}
client := http.Client {
    transport : &trans
}
res, err := client.Get(url)
if err != nil {
    fmt.Printf("%v.\n", err)
}
//use res.Body
io.Copy()
defer res.Body.Close()

必须手动关闭res.Body,这样才能关闭连接,并且DisableKeepAlives这个也要设置成true才行。

  1. 对于max open files,需要修改 /etc/security/limits.conf这个文件:
* sort nofile 655360
* hard nofile 655360

然后检查 /etc/pam.d/login 这个文件里面是否有下面这行

session required /lib/security/pam_limits.so

保存之后重新登陆shell的话, 就可以看到ulimit 已经生效了,如果不生效则重启下机器即可。

临时使用命令
可以使用

prlimit --pid $PID --nofile=$SOFT:$HARD 

来设置进程的max open files

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章