2012-01-13 2 views
1

시작하려면 - 데이터베이스 액세스를 위해 Linq-To-SQL을 사용하는 2 개의 별도 웹 사이트와 데이터베이스 (IIS 7.5, ASP.NET 및 SQL Server 2008)가 있습니다.웹 사이트의 데이터베이스 사용 제한

때때로 데이터베이스에서 장기간 작동 (10 초 이상)을 트리거해야하는 별도의 관리 웹 사이트가 있습니다. 문제는 이러한 작업으로 인해 sqlserver 프로세스가 100 % CPU에 충돌 한 다음 다른 주요 고객 웹 사이트가 데이터베이스에 즉시 액세스 할 수 없다는 것입니다. 데이터베이스에 액세스하는 데 약간의 지연이 있습니다.

우선 순위가 낮기 때문에 관리 작업이 2 배나 4 배나 nx 배나 오래 지속되면 정상입니다.

IIS에서 AppPool의 CPU 제한 설정을 사용해 보았지만 w3wp.exe 프로세스가 CPU를 많이 사용하지 않으므로 sqlservr.exe가 유용합니다. 미리 제안 해 주셔서 감사합니다.

+0

단 한 가지 - 다음과 같이 응답하지 마십시오. 장기 실행 작업에 SQL을 최적화하거나 데이터베이스/서버를 분리하고 동기화 할 관리 웹 사이트를 가리 킵니다. 나는 이미 그렇게하려고 노력했다. 나는 오히려 "내 쿼리를 실행하지만 최대 30 %의 CPU를 사용하라"라고 말할 수있는 방법을 찾고자합니다. 내 견고성면에서 가장 좋은 해결책이 될 것이기 때문입니다. 또는 연결 문자열에서 최대 CPU 사용량을 설정할 수 있다면 완벽 할 것입니다. – kape123

+0

IIS 리소스를 제한하면 데이터베이스에 어떤 영향을 미칠 것이라고 생각합니까? – Oded

+0

@Oded 나는 "IIS에서 AppPool 사용을 제한 해 봤습니다."라는 대답을 피하기 위해 언급했지만, 분명히 주석에 쓸모없는 질문을 일으킬 수 있다는 것을 잊어 버렸습니다. 미안 내 실수. – kape123

답변

1

SQL 2008에 SQL Server에 내장 된 리소스 관리자를 살펴보고 싶습니다. BOL 링크를 시작해야합니다.

http://msdn.microsoft.com/en-us/library/bb933866(v=SQL.100).aspx

기본적으로, 당신은 당신이 정의하는 리소스 풀 및 워크로드를위한 CPU 및 메모리 사용을 스로틀 수 있습니다. 이 제한은 서버가로드 중일 때만 실행됩니다. 디스크 입출력 사용을 제어 할 수는 없습니다. 관리 데이터베이스의 프로세스가 IO 바운드이고 다른 DB가 드라이브를 공유하는 경우 필연적으로 성능 문제가 나타나고 데이터베이스를 별도의 스핀들로 이동하거나 쿼리를 튜닝해야합니다.

당신이 작업 그룹에 따라 원하는 자원 풀 스로틀되는 정의 사용자 보장합니다 분류 기능의 예 :

/* 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 
+0

링크를 가져 주셔서 감사합니다 ... 이미 그것에 대한 연구를 해본 경험이있는 사람이 특정 DB 풀을 특정 리소스 풀에 할당하는 방법을 알려줄 수 있다면 정말 좋을 것 같습니다. 지금 당장 붙어있는 곳입니다 ... – kape123

+0

또한 리소스 관리자를 사용하면 데이터베이스/응용 프로그램의 성능에 부정적인 영향을 줄 수 있습니까? – kape123

+1

나는 경험이 많지 않지만 찾고있는 것을 "분류 자 기능"이라고합니다. 보이는 것에서 정상적인 UDF 이상은 아니지만, [마스터] db에서 만들어야한다고 생각합니다. – dataGoat

2

당신의 관리자 쿼리 상자에있는 모든 CPU를 소모하는 경우가있다을 거의 확실하게 몇 가지 튜닝 기회 - 가능성이있는 인덱싱 최적화.

리소스 관리자에 대한 투자 시간 대신에 리소스 관리자 구성이 완료 될 때까지 MAXDOP 힌트를 추가하여 단기간 증상 완화를 제공 할 수있는 단일 CPU에 미치는 영향을 간단하게 줄일 수 있습니다. 당신의 관리자 쿼리 :

OPTION (MAXDOP 1); 

네, 조금 더러운 느낌을 수도 있지만 CPU의 나머지 부분은 더 중요한 쿼리에 작동하도록 해제됩니다.

실제 답변은 관리자 쿼리를 조정하는 것입니다. 오랫동안 실행해도 좋다고해서 서버 또는 사용자 경험에 도움이되는 것은 아닙니다. 느린 I/O를 보완하는 높은 CPU를 경험하고있는 경우에는 상자에서 계속 진행되는 다른 쿼리의 영향으로부터 완전히 격리 할 수 ​​없습니다. I/O에는 리소스 관리자에 손잡이가 없습니다. CPU와 메모리 만 제어 할 수 있으며 100 %는 제어 할 수 없습니다.

+0

Thanks 귀하의 답변 Aaron. 그 분류 자 ​​함수를 설정하고 SQL 사용자를 적절한 그룹에 할당 할 수 있었지만 CPU 사용률은 여전히 ​​100 %입니다. 필자가 읽은 바에 따르면 리소스 관리자가 리소스를 놓고 경쟁하지 않는 한 리소스 관리자가 참여하지 않는다는 것을 이해합니다.하지만 필요하지 않습니다. 사용자를 항상 CPU 사용량의 50 %로 제한해야합니다. Workload Group "Degree of Parallelism"을 1 (0 대신)으로 설정하면 도움이됩니까? – kape123

+0

내가 가지고있는 4 개의 코어 머신에 2 개의 완벽한 작품 ...;) 문제가 해결되었습니다! – kape123

+1

아무도 상자를 사용하지 않는 경우에도 CPU를 50 %로 제한해야하는 이유는 무엇입니까? 그것은 쿼리를 조정하는 목표 여야합니다 (아무 쿼리도 상자의 100 %를 차지할 필요가 없습니다).하지만 다른 사람이 필요로하지 않을 때 시스템을 절반으로 유휴 상태로 두는 이유는 무엇입니까? 리소스 관리자 *는 두 번째 사용자가 접속하여 무언가를 시도 할 때 시작됩니다. –

관련 문제