注册公司需要什么条件吗,百度网站优化 件,wordpress标签里面没文章,谷歌google下载Bug#xff1a;Too many open files 今天在开发某个下载功能时#xff0c;发现文件总是下载到250多个程序就挂掉#xff0c;同时会打崩服务器#xff0c;查看错误日志发现报#xff1a;too many open files. 思路#xff1a;根据错误信息可以知道打开的文件数过多#x…BugToo many open files 今天在开发某个下载功能时发现文件总是下载到250多个程序就挂掉同时会打崩服务器查看错误日志发现报too many open files. 思路根据错误信息可以知道打开的文件数过多立马想到系统自身有一个ulimit限制限制打开的文件数可能是因为自身并发数设置过高且ulimit配置的允许打开文件数数值过低。 1 排查思路
1.1 查看ulimit数值
以Mac系统为例。
# 执行命令查看ulimit限制
launchctl limit
#第一列为项的名称第二列为软件限制第三列为硬件限制如果是ulimit配置太小可以通过下面命令修改 注意如果数值设置的太高会影响系统的稳定性。 sudo launchctl limit maxfiles 1024 unlimited
#修改完后open files的限制就到1024了我将文件描述符修改到1024后发现文件下载到1024左右程序就会卡死可以确定和ulimit数没有关系。
1.2 查看程序并发数 查看是否是程序的并发数设置的太多线程数或协程数如果自身电脑打开的程序或者应用过多且并发数设置的过多会导致某一段时间打开的文件数超过ulimit的限制。 后来查看代码发现协程数为5对于该系统来说并不算高 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
#第一列为项的名称第二列为软件限制第三列为硬件限制如果是ulimit配置太小可以通过下面命令修改 注意如果数值设置的太高会影响系统的稳定性。 sudo launchctl limit maxfiles 1024 unlimited
#修改完后open files的限制就到1024了②修改程序并发数 降低线程或协程数 ③review代码是否有io流未关闭 我的问题是因为在获取S3对象时忘记对object.Body做close操作 object, err : client.GetObject(context.TODO(), s3.GetObjectInput{Bucket: aws.String(bucketName),Key: aws.String(key),
})
defer object.Body.Close()