前端之家收集整理的这篇文章主要介绍了
go 服务器出现too many open files的错误,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近两天服务器总是会出现too many open files的
错误。真的很是头疼。在本地开发环境中,也用了压力测试,发现问题不存在。但是为什么服务器会出现这种
错误,有些闹不明白。本来想用ulimit更改一下打开
文件的描述符。但这样子觉得并不
解决问题。好吧,那就查一下更本的原因。 服务器是亚马逊,开发语言:golang,
数据库:mongo,
MysqL。缓存:redis。 测试脚本:写了一个golang的并发请求脚本。大概同时请求100.ulimit限制到50.发现
错误立刻呈现。发现在程序的进程下打开了大量的socket连接。所以当时就认为是mongo的连接
错误。决定mongo的连接使用单例模式。不过后来发现,这些socket是会降下去的。也就是说,连接用完了,就
关闭了。但是服务器的socket连接已经明显超过了ulimit的默认限制。项目也刚刚上线,也没有这么大的
用户群。所以问题肯定不是处在了mongo的连接
错误上。那是redis,
MysqL?后经过测试,也并不是这些连接的
错误。 整的真是很晕啊。最后想起来了,可以看一下服务器的socket的连接是哪些请求。经过查看,发现是80端口。一个网站的。。搞了一天,方向错了。。。突然想起来了,最近
添加的一个
小功能,需要使用外网的api。在go打开连接后,好像没有
关闭请求。
加上关闭请求后,问题
解决。socket上去,然后会
自动下来。 总结:以后要及时
关闭这些请求连接。go与
PHP不一样。
PHP在执行完成后,即使你不
关闭请求,在解析完成后,所以变量,都会
自动释放。go是编译行语言,所以连接打开后,如果不手动
关闭,会一直占用。。