RAM 증가, 성능 저하


9

설정:

  • Windows Server 2008 R2
  • SQL Server 2008 R2 SP1
  • 240GB RAM
  • TempDB는 자동 증가없이 8x16GB 데이터 파일입니다 (총 128GB)
  • 물리적 / 독립형 서버

이 서버는 ETL 처리에 사용됩니다. 우리는이 서버에 더 많은 RAM을 설치하여 총 240GB RAM을 설치했습니다. SQL Server 서비스는 유일하게 실행되는 것입니다.

BIOS, OpenManage 및 Windows에서 메모리가 올바르게 표시됩니다.

최소 / 최대 70 / 100GB 메모리를 사용하도록 SQL Server를 구성하면 아무런 문제가 없습니다. 그러나 120 / 150GB로 늘리면 ETL 프로세스 중 하나를 실행할 때 다음 오류가 발생합니다.

'PRIMARY'파일 그룹이 가득 차서 'tempdb'데이터베이스에서 '<임시 시스템 오브젝트 : 422234507706368>'오브젝트에 공간을 할당 할 수 없습니다. 불필요한 파일을 삭제하거나 파일 그룹에서 객체를 삭제하거나 파일 그룹에 파일을 추가하거나 파일 그룹의 기존 파일에 대해 자동 증가를 설정하여 디스크 공간을 만드십시오. (메시지 1105, 상태 2, 프로 시저 알 수 없음, 라인 1)

메모리 구성을 변경하기 전에이 문제가 발생하지 않았습니다. 원래 70 / 100GB로 다시 구성한 후에는이 오류가 발생하지 않습니다.

내가 시도한 것 :

  1. TempDB 데이터 파일을 자동 증가로 설정하십시오. 디스크 용량에 도달하고 실패 할 때까지 파일이 자동으로 증가합니다.
  2. TempDB 데이터 파일을 더 추가하십시오. 표시된 것과 같은 오류입니다.
  3. TempDB 크기를 8x32GB로 늘리십시오 (총 256GB).

이 문제의 원인이 무엇인지 잘 모르겠습니다.


2
NUMA 노드에서 메모리 균형이 유지됩니까? 프로세서는 어떻습니까? SQL Server 로그에 시작하는 동안 사용중인 CPU 수가 표시됩니까?
Aaron Bertrand

1
ETL 프로세스에 무엇을 사용하고 있습니까? SSIS 또는 유사한 도구? SQL Server 외부의 도구 인 경우 SQL Server 인스턴스와 동일한 서버에서 도구를 실행하고 있습니까?
Mike Fal

1
SQL Server가 너무 많이 사용하고 있기 때문에 ETL 프로세스가 작업을 수행하기에 충분한 메모리를 확보 할 수없는 경우 @Mike가 좋은 지적입니다. 작업을 tempdb로 푸시해야 할 수도 있습니다.
Aaron Bertrand

1
다음은 tempdb의 사용을 모니터링하는 좋은 스타터는 다음과 같습니다 msdn.microsoft.com/en-us/library/ms176029(v=SQL.105).aspx . 이것은 당신에게 무슨 일이 일어나고 있는지에 대한 아이디어를 줄 것입니다.
토마스 스트링거

2
TempDB가 실제로 확장되고있을 때 실제로 실행중인 항목에 대한 분석을 수행 했습니까? 간단한 sp_who2 / sp_whoisactive? 더 잘 관리 할 수는 있지만 말하기 어려운 트랜잭션을 오래 실행 한 것처럼 들립니다. 개인적으로, 나는 메모리 변경에 붙어 있지 않지만 먼저 코드를보고 그것이 제대로 실행되고 있는지 확인하십시오.
Mike Fal

답변:


3

도와 주셔서 감사합니다.

일부 실행 계획을 따르고 나면 사용 가능한 RAM 양에 따라 다르게 처리되는 JOIN이있는 것으로 나타났습니다. RAM이 적 으면 해시로 평가합니다. RAM이 많을수록 일련의 병합 조인을 사용합니다.

그래서 기본적으로 잘못 작성된 T-SQL로 바뀌 었습니다. 현재 리팩토링 중입니다.


4
해시 조인에는 메모리 부여가 필요하지만 병합에는 필요하지 않으므로 직관적이지 않습니다. 병합 조인을 지원하기위한 추가 정렬 작업이 있습니까?
Martin Smith

1

이것은 질문에 대한 답변이 아니며 주석에 게시하고 싶지 않은 일부 코드입니다. NUMA 노드에서 스케줄러와 메모리의 균형을 확인하고 온라인으로 노드가 보이지 않는지 확인하려면 다음을 수행하십시오.

SELECT 
  parent_node_id, 
  [status],
  AVG(current_tasks_count) AS avg_tasks_count, 
  AVG(load_factor) AS avg_load_factor,
  scheduler_count = COUNT(*)
FROM sys.dm_os_schedulers
GROUP BY parent_node_id, [status];

SELECT 
  memory_node_id, 
  name, 
  SUM(single_pages_kb + multi_pages_kb) AS memory_kb
FROM sys.dm_os_memory_clerks
GROUP BY memory_node_id, name;

SQL Server 2012에서는 더 이상 별도의 단일 페이지 할당 기와 다중 페이지 할당자가 없기 때문에 마지막 SUM이어야합니다 SUM(pages_kb).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.