最近两天服务器总是会出现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是编译行语言,所以连接打开后,如果不手动关闭,会一直占用。。
服务器是亚马逊,开发语言: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是编译行语言,所以连接打开后,如果不手动关闭,会一直占用。。
有疑问加站长微信联系(非本文作者)