只要把这个从github上交叉贴出来就行。
我在go-mysql中使用xorm0.4.3。我们上的是戈朗1.4。
我们已将maxIdleConnetions和maxOpenConnections在xorm中指定如下:
var orm *xorm.Engine
...
orm.SetMaxOpenConns(50)
orm.SetMaxIdleConns(5)我们使用同一个xorm实例来查询Mysql。
但是,我们仍然可以看到TCP Connection Establised状态下的大量连接,这远远超过了我在maxIdleConnetions和maxOpenConnections状态中配置的数字,当我们lsof:-
app 8747 10568 sandeshsharma 16u IPv4 691032 0t0 TCP 127.0.0.1:57337->127.0.0.1:mysql (ESTABLISHED)我们还观察到,即使我们停止了MySQL,连接号仍然是固定的,但处于CLOSED_WAIT状态。如果我们关闭应用程序,那么所有的连接都会消失。
app 8747 10844 sandeshsharma 38u IPv4 505058 0t0 TCP 127.0.0.1:54160->127.0.0.1:mysql (CLOSE_WAIT)但是,在mysql中,它显示的是我在maxIdleConnetions和maxOpenConnections中指定的正确连接数。
有人能解释一下我的这种行为吗?为什么我们要观察这么多TCP连接,即使我们分别将maxIdleConnetions和maxOpenConnections分别指定为5和50呢?
发布于 2016-07-21 09:06:24
首先,走1.4太老了。使用最新的Go 1.6。这个答案是用Go 1.6的知识写的。所以在你的情况下,一些细节可能是不同的。
连接有四种状态:连接、空闲、不使用和关闭。MaxOpenConnections在连接状态、空闲状态、使用状态下限制连接的数量。因此,如果应用程序关闭并快速重新打开连接,则可能发生这种情况。
因为TCP是CLOSED_WAIT服务器端的MySQL状态,所以您的应用程序正在等待来自连接的EOF。我想你的应用程序负载很高,读取EOF和关闭连接的速度很慢。在读取EOF和关闭连接之前,TCP状态将在客户端建立,而不管服务器端的TCP状态如何。
我建议您更新Go和“go驱动程序/mysql”,并将MaxIdleConns设置为MaxOpenConns,以避免重新连接速率过高。相反,您可以使用SetConnMaxLifetime (Go1.6中的新API )在应用程序空闲时关闭连接。
https://stackoverflow.com/questions/38454970
复制相似问题