Bug:Too many open files
1 排查思路
1.1 查看ulimit数值
以Mac系统为例。
# 执行命令查看ulimit限制
launchctl limit
#第一列为项的名称,第二列为软件限制,第三列为硬件限制
sudo launchctl limit maxfiles 1024 unlimited
#修改完后,open files的限制就到1024了
我将文件描述符修改到1024后,发现文件下载到1024左右程序就会卡死,可以确定和ulimit数没有关系。
1.2 查看程序并发数
1.3 查看文件流是否关闭
# 查看进程号
ps -ef | grep downloader
# 根据进程id查看进程占用的文件句柄
sudo lsof -p 30794
# 查看所有已建立或者listen状态的连接
sudo lsof -i -P | grep -i "listen\|established"
执行上面命令后发现我程序一直占用这Socket没有释放,这个时候就基本可以确定是代码某处打开的文件流没有关闭。
经过review代码,排查发现是在GetS3Object的时候没有对object的Body做close操作。添加上后,问题解决。
object, err := client.GetObject(context.TODO(), &s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(key),
})
defer object.Body.Close()
2 解决
①修改系统ulimit参数值
以Mac系统为例。
# 执行命令查看ulimit限制
launchctl limit
#第一列为项的名称,第二列为软件限制,第三列为硬件限制
sudo launchctl limit maxfiles 1024 unlimited
#修改完后,open files的限制就到1024了
②修改程序并发数
③review代码是否有io流未关闭
=object, err := client.GetObject(context.TODO(), &s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(key),
})
defer object.Body.Close()