인스턴스의 성능을 유지하기 위해 주기적으로 다시 시작해야하는 이유는 무엇입니까?


22

SQL 2005에 프로덕션 DB 서버가 있습니다. 모든 것이 정상적으로 작동하지만 몇 주 후에 성능이 크게 저하됩니다. SQL Server를 다시 시작해야만 성능이 정상으로 돌아옵니다.

일부 배경 :

  • 1200 개 이상의 데이터베이스 (주로 단일 테넌트, 일부 다중 테넌트)를 실행합니다. 멀티 테넌트로만 이사하는 것에 대해 강의하기 전에이 구조를 유지 해야하는 정당한 이유가 있습니다 ...
  • RAM은 16GB입니다. 다시 시작한 후 SQL Server가 15GB 사용량으로 되돌아가는 데 시간이 오래 걸리지 않습니다.
  • Active DB 연결은 약 80 개의 연결로, 프로세스 당 웹 서버 당 하나의 연결 풀이 있다는 점을 고려하면 상당히 건전합니다. 따라서 연결 누수 문제가 없습니다.

피크가 아닌 시간에 여러 가지를 시도했습니다.-DBCC DROPCLEANBUFFERS (CHECKPOINT 포함)를 실행하여 데이터 캐시를 지 웁니다. 효과가 없으며 RAM 사용을 지우지 않습니다.) -FREEPROCCACHE 및 FREESYSTEMCACHE를 실행하여 쿼리 계획 및 저장된 proc 캐시를 지우십시오. 효과가 없습니다.

실제 프로덕션 환경에서는 SQL Server를 다시 시작하는 것이 이상적이지 않습니다. 뭔가 빠졌습니다. 다른 사람이 이것을 겪고 있습니까?

업데이트 : 2012 년 4 월 28 일 여전히이 문제와 싸우고 있습니다. OS와의 경합을 배제하기 위해 SQL Server의 메모리를 10GB로 줄였습니다. 좁히는 데 가까워지고 있지만 다음 단계부터 도움이 필요합니다.

다음은 SQL Server를 다시 시작한 후 페이지 파일이 12.3GB와 12.5GB 사이에 있다는 것을 알았습니다. 며칠 동안 그런 식으로 유지됩니다. 전체 서버 스레드는 850에서 930 사이에서 중단됩니다. 또한 며칠 동안 안정적이고 일관성이 있습니다 (sqlserver는 트래픽에 따라 55에서 85까지 꾸준히 유지됩니다).

그런 다음 "이벤트"가 있습니다. 나는 이벤트가 무엇인지 전혀 모른다. 로그에서 볼 수 없으며, 요일이나 시간에 일관된 것을 볼 수 없지만 갑자기 모든 페이지 파일이 14.1 또는 14.2로 점프합니다. GB와 스레드가 1750에서 1785 사이로 이동합니다.

이런 일이 발생했을 때 성능을 검사하면 900 개가 넘는 스레드가 sqlserver입니다. sp_who2로 이동하여이 스레드가 어디에서 나오는지 확인합니다. 사용 된 80 개 정도의 DB 연결 만 있습니다.

그렇다면 누구든지 SQL 서버에서 나머지 900 개 스레드의 위치와 작업을 찾는 방법을 알고 있습니까?

업데이트 : 2012 년 6 월 1 일 여전히 문제와 싸우고 있습니다. 이 내용을 여전히 읽는 사람이라면 스레드가 점프하는 문제가 해결되었습니다. 이것은 자동화 된 ComVault 백업 소프트웨어로 인한 것입니다. 현재 데이터베이스를 백업하는 대신 더 이상 존재하지 않는 데이터베이스 (이전 데이터베이스 목록을 유지 관리하는 데이터베이스)를 백업하려는 스레드를 작성했습니다.

그러나 문제는 여전히 남아 있으며 매주 다시 시작해야하며 며칠 또는 몇 일이 걸립니다. 랙 스페이스 팀과 협력하여 조명을 비출 수 있는지 확인합니다.


1
철저한 질문에 대한 요점이지만 16GB의 RAM이 1200 데이터베이스에 충분하지 않을 수 있다고 생각 했습니까?
Nick Vaccaro

실제로 대단한 계획을 도울 수는 없지만 MSSQL은 가능한 한 많은 RAM을 소비하도록 설계되었습니다. RAM이 낭비되는 것처럼 실제로 의미가 있습니다. 다시 시작한 직후 15GB로 점프한다는 사실은 실제로 그 자체로는 문제가되지 않습니다. 그러나 @Norla는 16이 당신이하고 싶은 일에 충분하지 않다는 것이 맞을 수 있습니다.

속도가 느려지는 동안 얼마나 많은 SPID가 활성화됩니까? sp_who2를 실행하고 행 수를 지정하십시오.
Nick Vaccaro

확인 중-SQL 서버 작업이 실행 중입니까? 이 문제를 일으키는 원인 중 하나가 있는지 확인하기 위해 하나씩 중지 할 수 있습니까?

의 출력 기능 : sys.dm_os_memory_clerks에서 선택 SUM은 (single_pages_kb + multi_pages_kb) /1024.0 곳 [이름] = 'TokenAndPermUserStore'
마크 스토리 - 스미스

답변:


7

모든 것이 정상이라고 말하고 몇 주 후에 성능이 떨어집니다. (일반적으로 사람들은 성능이 빠르게 또는 특정 시간에 또는 임의의 간격으로 저하된다고 주장합니다. 이는 I / O 성능이 저하되거나 폭풍우 또는 심각한 시간에 실행되는 CPU 사용량이 많은 쿼리 또는 예약 된 작업이 많거나 부족함을 의미 할 수 있습니다 CPU를 많이 사용하는 쿼리 나 디스크 읽기를 유발하는 인덱싱 또는 잘못된 통계.

내 가설은 서버의 다른 응용 프로그램에서 메모리가 누출되고 있다는 것입니다. 나는 바이러스 소프트웨어 (모든 DBA가 선호하는 서버 소프트웨어 악당)와 타사 모니터링 소프트웨어로 이것을 보았습니다. 시간이 지남에 따라 SQL Server의 메모리 사용량을 다시 확인하고 상자에있는 다른 모든 응용 프로그램의 모든 메모리 사용량을 파악했습니다. SQL Server의 메모리 사용에 대한 하드 제한을 설정하고 페이징을 허용하지 않도록 설정 한 경우 페이징 아웃되고 I / O 용량을 소모하는 다른 앱일 수 있습니다.

찾기가 어렵지 않습니다. 서버에 아직 메트릭을 유지하지 않는 경우 Perfmon을 시작하고 30 분 또는 60 분마다 샘플을 가져 오도록합니다. 며칠 후 다른 응용 프로그램 메모리 사용량이 증가하는 것을 볼 수 있습니다.

SQL Server 로그에 "SQL 서버의 중요한 부분이 페이징 아웃되었다"는 오류 메시지가 있습니까? 그것은 또한 큰 단서 일 것입니다.


동의합니다.이 동작은 메모리 누수처럼 들립니다.
Nick Kavadias

+1 메모리 누출. 이 서버에서 페이지 기대 수명이 매우 길다는 것은 의심 스럽지만 페이지 파일이 빠르게 커지는 것은 아닙니다. 참고로, 거의 동일한 문제가 여기에 있습니다 (이것은 AV였습니다) : social.msdn.microsoft.com/Forums/en/sqlsetupandupgrade/thread/…
brian

5

RAM이 16GB 인 단일 SQL Server 인스턴스에서 1200 개의 DB를 실행할 수 있으며 몇 주 동안 원활하게 실행 한 후에 이러한 유형의 문제 만 발생하게 된 것을 축하합니다. 로컬 PASS 챕터에서 좋은 이야기.

이제 문제 해결 : SQL 및 OS 모두 RAM이 16GB입니다. 최대 메모리 설정이 15GB 또는 최대라고 가정합니다. 이로 인해 버퍼 풀이 모든 메모리를 사용하고 OS를 질식시킬 수 있습니다. 버퍼 풀과 캐시를 비우면 차이점이 표시되지 않으며 PLE가 300을 초과합니다. 이것은 메모리 병 목에 대해 증언합니다. 서버의 CPU 및 IO는 어떻게 (사양 / 통계)?

실행 select * from sys.dm_exec_request where session_id>50 and session_id<>@@spid및 표시되는 자원 경합은 무엇입니까 (wait_type, wait_time, last_wait_type, wait_resource).


1200은 그렇게 나쁘지 않습니다! 가장 큰 장애물은 연결 풀 문제를 극복하는 것이 었습니다. 연결 문자열을 master로 설정 한 다음 연결 후 USE [DBName]을 사용하여 해결했습니다. 쿼리 측면에서 session_id> 50 및 session_id <> @@ spid 인 select * from sys.dm_exec_requests를 실행했으며 최대 4-5 요청의 짧은 목록이며 일반적으로 500 ms 이내에 목록을 남깁니다. 그러나 일단 속도가 느려지면 일요일에 다시 시작되었으므로 평소와 같이 허밍이됩니다.
PaulJ

연결 풀링 팁에 대한 @PaulJ 감사합니다. 나는 지금 그것에 대해 약간의 독서를하고 있습니다.
StanleyJohns

5

1200 개의 데이터베이스, OS 및 기타 다른 것들? 예, 서버 자체가 작동하려면 1GB 이상의 램이 필요하다고 생각합니다. 특히 15GB를 SQL Server의 최대 메모리 설정으로 설정하면 스레드에 대해 15GB 이외의 추가 메모리가 여전히 필요 하다는 점을 고려하십시오.

서버에 약간의 호흡 공간을 제공하기 위해 SQL Server를 14GB로 낮추었습니다.

또한 16GB RAM이있는 타사 백업 유틸리티가있는 SQL Server 2008 x64 시스템의 메모리 허용량에 대한 "전문 SQL Server 2008 내부 및 문제 해결"에 나와있는 예는 다음과 같습니다.

  • Windows 용 2GB
  • 작업자 스레드의 경우 1GB
  • MPA 등의 경우 1GB
  • 백업 프로그램의 경우 1GB
  • SQL Server 용 11GB

이 책에서는 보유 할 수있는 최대 스레드 수를 결정하는 방법과 차지할 메모리 양을 계산하는 방법을 보여줍니다. 쓰레드가 얼마나 많은 메모리를 필요로하는지 확인하려면 이것을 실행하십시오 (서버와 일치하도록 서버 유형 변경).

declare @servertype int

set @servertype=1
/*
1: x86 (32-bit)
2: x64 (64-bit)
3: IA64

*/

select max_workers_count *
    (
        case @servertype when 1 then .5
            when 2 then 2
            when 3 then 4
            else .5
        end
    )
from sys.dm_os_sys_info

좋은 물건, 고마워 14GB로 옮겼습니다. SQL Server가 항상 원하는 것을 가져갈 수 있도록 여기에서 새로운 것을 배웠습니다. 이것을 백업하기위한 또 다른 좋은 기사 : sqlservercentral.com/blogs/glennberry/2009/10/29/…
PaulJ

4

데이터베이스 메모리가 모든 데이터베이스에 고르게 분산되어 있으면 각 데이터베이스 (15 * 1024) /1200=12.8에 대해 12.8 Megs 만 있습니다. 더 많은 메모리가 필요합니다.

성능이 저하되는 이유를 조사해야합니다. 잠금, 차단 등이 보입니까? 대기 통계는 어떻게 생겼습니까?


3

DBCC 명령은 메모리를 OS로 다시 릴리스하지 않을 메모리 버퍼 만 지우는 것입니다.

SQL Server가 실제로 메모리를 소비하고 있다는 것을 알고 있습니까? Perfmon 세션을 설정하거나 다시 시작한 후 DMV 정보 수집을 시작하여 SQL Server가 수행하는 작업과 작업을 확인하는 것이 좋습니다. 수집 시간 동안 사용자가 평소보다 더 많은 작업을 수행하는 경우 (예 : 월말 처리 등)에도 유의하십시오. 동일한 서버에서 SSRS, SSIS 또는 SSAS를 실행하고 있습니까?

시스템에 1200 개의 데이터베이스가 있는데 가장 큰 DB는 무엇입니까?


가장 큰 db는 5GB입니다. 그 중 ~ 25 개만 1GB 이상입니다. 대다수는 50 ~ 200MB입니다.
PaulJ

"같은 서버에서 SSRS, SSIS 또는 SSAS를 실행하고 있습니까?" -해당 서비스를 전혀 실행하지 않습니다. 순수한 SQL 상자입니다.
PaulJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.