出现这个问题是因为服务的文件句柄超出系统限制。当Go服务程序出现这个问题,首先应该看系统设置,然后再看程序本身。

too many open files

accept4
1
2
http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 1s
http: Accept error: accept tcp [::]:443: accept4: too many open files; retrying in 1s

系统设置

首先查看系统

1
ulimit -n
1024
1
ulimit -n 524288
/etc/security/limits.conf

看系统之后还要看你的程序的句柄限制,因为你的程序部署问题,系统设置修改了,但程序的设置还没变。可以使用下面命令行查看程序的限制

1
cat /proc/{your_app_pid}/limits

结果可能类似这样:

设置ulimit

Solft Limit1024supervisor

设置ulimit

注意 这里重启不能用系统自带的,如:

1
/etc/init.d/supervisor restart
Max open files   1024/usr/bin/python2 /usr/bin/supervisord
1
2
3
supervisord
or
/usr/bin/supervisord -c /etc/supervisor/supervisord.conf

更新

如果使用系统的服务重启 supervisor ,则仍然没生效,解决办法:

/etc/systemd/system.confDefaultLimitNOFILE=1048576:2097152DefaultLimitNPROC=262144:524288systemctl daemon-reexecsystemctl restart supervisor.servicecat /proc/[pid]/limits

就是这结果

1
2
3
Max processes             262144               524288               processes 
Max open files            1048576              1048576              files     

程序设置

http.Responseresp.Body.Close()
TransportCloseIdleConnectionsMaxIdleConnsPerHostDisableKeepAlives
CloseIdleConnectionsMaxIdleConnsPerHost

还应该在 http server/client 添加超时机制来避免连接泄漏,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
srv := &http.Server{
    ReadTimeout:  5 * time.Second,
    WriteTimeout: 10 * time.Second,
    IdleTimeout:  120 * time.Second,
    TLSConfig:    tlsConfig,
    Handler:      serveMux,
}

var tr = &http.Transport{
		TLSClientConfig:       &tls.Config{InsecureSkipVerify: true},
		TLSHandshakeTimeout:   5 * time.Second,
		ResponseHeaderTimeout: 10 * time.Second,
		ExpectContinueTimeout: 1 * time.Second,
	}
var httpClient = &http.Client{
		Timeout:   time.Second * 30,
		Transport: tr,
	}

下面的命令可以让你判断是不是连接池中的连接有没有正确关闭:

1
2
3
4
5
6
7
# cat /proc/19213/net/sockstat
sockets: used 109
TCP: inuse 4 orphan 0 tw 14 alloc 9 mem 2
UDP: inuse 5 mem 16
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
TCP inuse

本文网址: https://pylist.com/topic/201.html 转摘请注明来源