首先 - 我有2个独立的网站和一个数据库(IIS 7.5,ASP.NET和SQL Server 2008,使用Linq-To-SQL进行数据库访问)。
我有一个单独的管理网站,有时在使用期间需要触发数据库上的长时间运行操作(超过10秒)。问题是这些操作导致sqlserver进程达到100%CPU然后其他主客户网站无法及时访问数据库 - 访问数据库时存在一些延迟。
我可以使用持续2倍或4倍或更长时间的管理操作,因为它们的优先级较低。
我已尝试在IIS中使用AppPool上的CPU限制设置,但这并没有帮助,因为w3wp.exe进程从不使用太多的CPU ...而是它的sqlservr.exe。提前感谢您的建议!
答案 0 :(得分:2)
如果你的管理查询消耗了所有的CPU,那么几乎肯定会有一些调整机会 - 可能是一些索引优化。
代替投资这些资源的时间,并且在您的资源调控器配置确定之前,您可以通过将MAXDOP提示添加到您的单个CPU来减少对单个CPU的影响,这可能会提供短期症状缓解。管理查询:
OPTION (MAXDOP 1);
是的,它可能会让您觉得有点脏,但其余的CPU将会释放出来处理更重要的查询。
真正的答案是调整您的管理查询。仅仅因为它们长时间运行并不意味着它对您的服务器或用户体验有好处。你永远无法将它们与盒子上发生的其他查询的效果完全隔离,特别是如果你正在经历高CPU来补偿缓慢的I / O. I / O在资源调控器中没有任何旋钮 - 你只能控制CPU和内存,甚至不能控制100%。
答案 1 :(得分:1)
听起来你想要查看SQL Server中内置于SQL Server中的资源调控器.BOL链接可以帮助你入门。
http://msdn.microsoft.com/en-us/library/bb933866(v=SQL.100).aspx
实质上,您可以限制您定义的资源池和工作负载的CPU和内存使用量。这种限制只会在服务器负载时启动。请注意,您无法控制磁盘IO利用率。如果管理数据库中的进程是IO绑定的,而其他数据库共享驱动器,则您将不可避免地看到性能问题,并且将数据库移动到单独的轴或查询调优是必要的。
分类器函数示例,它将确保您定义的用户受到基于工作负载组的所需资源池的限制:
/* Classifier function */
CREATE FUNCTION dbo.rgov_classifier_db ()
RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
DECLARE @rgWorkloadGrp sysname
IF SUSER_SNAME() = 'adminWebsiteDB'
SET @rgWorkloadGrp = 'workloadGroupName'
ELSE
SET @rgWorkloadGrp = 'defaultWorkloadGroupName'
RETURN @rgWorkloadGrp
END;
GO
/* Register the function with Resource Governor and then start Resource Governor. */
ALTER RESOURCE GOVERNOR
WITH (CLASSIFIER_FUNCTION = dbo.rgov_classifier_db);
GO
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO