too mange open files

查看进程打开的文件句柄

该错误出现的原因,一般是由于linux系统下,一个进程打开了过多的文件而被系统所限制了,那么首先的思路便是查看当前程序的经常的的限制以及共打开了多少文件以及打开了哪些文件,假如当前golang程序的进程号是22761

1
2
3
4
5
6
7
8
9

# 1. 查看限制
cat /proc/22761/limits

# 2. 查看大小
lsof -p 22761 | wc -l

# 3. 查看有哪些
lsof -p 22761 > openfile.log
ESTABLISHED

http transport配置

response.Bodyhttp.Client
1
2
3
4
5
6
7
httpClient := &http.Client{Transport: &http.Transport{
MaxIdleConns: 512,
MaxIdleConnsPerHost: 2,
DisableKeepAlives: false,
MaxConnsPerHost: 512,
IdleConnTimeout: 10 * time.*Second*,
}}
mongo-go-drive

修改最大文件句柄限制

由于上述方案当时没有生效,不得已只能修改最大文件句柄的限制了,修改如下:

1
2
3
4
5
6
# /etc/security/limits.conf
root hard nofile 65535
root soft nofile 65535

# 查看有没有生效
ulimit -n

然而还是没有生效,在重新查看进程的文件句柄限制之后,发现依然是1024

supervisor 的问题

后来经查询,发现可能是因为使用了supervisor作为守护进程,而supervisor在这一块做了手脚,导致被supervisor守护的进程没有生效,修改supervisor的配置如下:

1
2
# /etc/supervisor.conf
minfds=65536 # 限制了supervisor守护的进程的文件句柄限制
supervisorctl reload