尽管连接数远低于资源限制

时间:2016-06-15 13:35:15

标签: sql-server azure azure-sql-database

我们有一些Java应用程序通过JDBC使用通用的Azure Sql数据库。每个应用程序都有一个与该数据库的连接池。池中的连接数是有限的,因此来自所有应用程序的连接总数远低于数据库的resource limits

最近我们经常得到这些类型的例外:

  

com.microsoft.sqlserver.jdbc.SQLServerException:资源ID:1   数据库的请求限制是200并且已达到。看到   'http://go.microsoft.com/fwlink/?LinkId=267637'寻求帮助

  • 我们已经使用分析器验证了应用程序不会打开比允许的更多连接。
  • 我们还验证了正确运行的应用程序数量,因此连接数应低于资源限制。
  • 我们注意到的一件奇怪的事情是sp_who显示了大量Login列为空的连接: enter image description here

有关这些错误可能原因的猜测吗?

修改

我们的一个理论与Sql Server的MaxDOP参数有关。

显然,如果此参数大于1,则Sql Server可能会为每个查询使用多个工作线程。我们认为sp_who中没有Login值的那些行对应于其中一个连接使用的其他工作线程。这样,工作线程可能比连接多得多,所以即使连接数量有限,我们也会使所有工作线程都饱和。

EDIT2:

显然Azure Sql的默认Max Parallelism设置为0(无限制),并且只能通过support ticket进行更改。

EDIT3:

还有一个证据。我们在master数据库上执行了SELECT * FROM sys.resource_stat。我们看到max_worker_percent不时达到100%。我们真的在使工作线程饱和。

3 个答案:

答案 0 :(得分:4)

默认行为将在2020年8月更改:

Changing default MAXDOP in Azure SQL Database

为了提高客户工作负载性能并减少不必要的资源利用,Azure SQL数据库中新数据库的默认MAXDOP设置已从先前的默认值0(无限制)更改为8。< / strong>


如何更改现有数据库的MAXDOP?

可以使用数据库范围内的ALTER DATABASE SCOPED CONFIGURATION语句更改MAXDOP。

ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 4;

Azure SQL数据库中查询并行过多的症状是什么?

在Azure SQL数据库中,过度并行的一种常见症状是超出了工作线程数的资源管理限制。发生这种情况时,会引发错误10928,“Resource ID : 1. The request limit for the database is N and has been reached”,其中N代表数据库或弹性池的工作线程限制(但是,请注意,还有其他可能导致此错误的原因)。

答案 1 :(得分:3)

Sql DB支持更改Max DOP设置。您可以通过ALTER DATABASE SCOPED CONFIGURATION T-SQL更改它 https://msdn.microsoft.com/en-us/library/mt629158.aspx

答案 2 :(得分:2)

似乎我们在问题编辑中提到的MaxDop参数方面走在了正确的轨道上。

Sql server有时会使用多个工作线程来执行查询,因此连接数并不总是与执行线程数相对应。在我们的例子中,我们定期执行的查询有时会产生数十个工作线程,使工作线程池饱和(因为它的几个副本会同时运行)

自Azure SQL doesn't support setting this parameter globally以来,我们的解决方案是将OPTION (MAXDOP 1)添加到有问题的查询中,以便其执行更具可预测性(以并行性和速度为代价)。

我们还没有看到&#34;资源限制&#34;从那以后的例外。