Sql server Go数据库客户端终止到SQL Server的连接数超出预期

Sql server Go数据库客户端终止到SQL Server的连接数超出预期,sql-server,go,Sql Server,Go,在调试服务器上的一些其他问题时,我注意到一些关于连接的非常奇怪的行为,我希望能够理解这些行为 我有2台go服务器,其中一台与SQL Server RDS实例对话,另一台与Azure中的托管SQL Server实例对话 我相信这两个后端的工作方式略有不同——RDS有一个单一端口(1433),客户机在该端口上进行身份验证并随后建立连接。Azure SQL似乎在端口1433上进行身份验证,然后将客户端重定向到另一个实际处理连接的服务 在这两种情况下,我都在服务器上运行大量负载。至少500个请求/秒,峰

在调试服务器上的一些其他问题时,我注意到一些关于连接的非常奇怪的行为,我希望能够理解这些行为

我有2台go服务器,其中一台与SQL Server RDS实例对话,另一台与Azure中的托管SQL Server实例对话

我相信这两个后端的工作方式略有不同——RDS有一个单一端口(1433),客户机在该端口上进行身份验证并随后建立连接。Azure SQL似乎在端口1433上进行身份验证,然后将客户端重定向到另一个实际处理连接的服务

在这两种情况下,我都在服务器上运行大量负载。至少500个请求/秒,峰值约为2k个请求/秒。每一个请求都会产生一个Select查询,该查询返回一个带有主键查找的单行,因此到SQL的连接非常短暂。在这两种情况下,每次查询的平均时间都是50-80ms,p95在100-150ms范围内

我试图理解的行为:

我正在使用带有MS-sql实现的go数据库/sql驱动程序(特别是)

我已将最大空闲连接数和最大打开连接数设置为64

我所期望的:64个长期运行的已建立连接,它们偶尔空闲,但很快就会被重用

我所看到的:通常是64个已建立的连接,数量通常下降到50到64之间。这也会导致在任何给定的时间都有200-400个连接处于TIME_WAIT状态

是什么导致了这种行为?这只是go驱动程序懒散地关闭连接的事实?如果是这样,为什么这个数字会降到64以下


我很乐意提供更多的细节

时间和地点的连接是什么?它们肯定是SQL连接吗?它们是在SQL主机上还是在Go应用程序主机上?我指的是Go服务器(服务http请求并使用SQL客户端)和SQL实例(RDS或Azure SQL)之间的连接。他们正在运行应用程序主机。你也检查过了吗?看起来不是您的情况(从使用情况判断),但是如果由于某种原因从空闲池中不均匀地选择连接,这可以解释其中一些连接超时的事实。(对于这样一个精心设计的问题,请注意+1,这是一件非常罕见的事情。)@kostix谢谢!)我没有设置MaxConnLifetime,它(通过查看代码可以看出)默认为0,因此没有超时