SQL Server 2005 :이 쿼리를 실행하기에 시스템 메모리가 부족합니다


13

꽤 오랫동안 (년간) 안정적으로 실행 된 SQL Server 중 하나에서 최근에 메모리 오류가 충분하지 않습니다. 응용 프로그램 이벤트 로그에는 다음이 표시됩니다.

이벤트 ID : 701

설명 :이 쿼리를 실행하기에 시스템 메모리가 부족합니다.

이 서버를 관리하는 팀은 sysadmin 업무를 두 배로하는 개발자로 구성되어 있습니다. 그러나 우리의 주요 전문 지식은 개발입니다. 그러나 우리는이 문제를 해결하는 방법에 손실이 있습니다. 우리는 포럼을 꼼꼼히 조사해 왔으며 그와 일치하는 것을 찾지 못했습니다.

다음은 문제 해결에 도움이되는 몇 가지 세부 정보입니다.

  • 최소 서버 메모리는 0으로 설정되어 있습니다.
  • 최대 서버 메모리는 2000으로 설정되어 있습니다.
  • 총 실제 메모리는 3,325.85MB입니다 (sysinfo에서).
  • 총 가상 메모리는 7.10GB입니다 (sysinfo에서).
  • 우리는 메모리를 할당하기 위해 AWE를 사용하지 않았지만 이제는 그것이 다른지 확인해야합니다.
  • 이 오류는 쿼리를 실행하지 않고 트랜잭션 로그를 백업하는 작업에서 발생했습니다.
  • 많은 연결된 서버가 있습니다. 다른 쪽의 RDBMS 유형은 SQL Server (2005 및 2000), Oracle 10g 및 OSI PI 시스템입니다.
  • 이 시점에서 간헐적입니다. 우리는 시간이나 사건을 오류와 연관시킬 수 없습니다.
  • 물론 재부팅하면 잠시 동안 사라지는 것처럼 보이며 이는 오류 메시지의 특성으로 인해 의미가 있습니다.
  • 이 서버는 데이터베이스 서버뿐만 아니라 응용 프로그램 서버 (2 개의 Windows 서비스) 및 웹 서버로 3 배가됩니다.

편집하다:

우리는 SP3에 있습니다. 우리가 찾은 대부분의 게시물은 SP1 이전의 게시물이므로 적용되지 않습니다.

SELECT  SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

보고

9.00.4035.00 SP3 스탠다드 에디션


이 오류에 대한 추가 세부 사항이있을 수 있으므로 SQL Server 오류 로그를 검토 할 수 있습니다.
John Sansom

답변:


4

-g startup 매개 변수를 사용하는 것이 좋습니다. 그것은 대부분의 사람들에게 효과가 있고 아마도 당신에게도 효과가있을 것입니다. 내 유일한 관심사는 근본적인 문제가 해결되지 않을 수 있다는 것입니다. 예를 들어 연결된 서버로 인해 메모리 누수가 발생하고 MTL이 512Mb로 증가하면 메모리 문제 간격이 더 길어 집니까? 나는 그것에 대한 답을 모르지만 perfmon이 좋은 출발이 될 수 있다는 점에서 UndertheFold에 동의하는 경향이 있습니다.


7

"이 쿼리를 실행하기에 시스템 메모리가 부족합니다." 오류 메시지 VAS (Virtual Address Space)는 사용할 수없고 일반적인 의미로는 메모리가 아니라 SQL Server 프로세스 공간 내에서 사용됩니다.

이 서버에서 3GB로만 실행 중이고 SQL Server에 최대 2GB가 할당되어 있으면 OS 및 더 중요한 것은 상자에서 1GB 미만의 게임을 할 수 있음을 의미합니다. 그것은 많은 메모리가 아닙니다.

이 문제가 실제로 메모리 누수로 인해 발생한 경우 사용중인 SQL Server 프로세스 공간 (memToLeave) 외부의 VAS입니다.

-g startup 매개 변수를 사용하여 memToLeave 부분에 더 많은 메모리를 할당하는 것이 좋습니다.

자세한 내용은 다음 기사를 참조하십시오.

http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/

SQL Server의 최대 메모리 설정을 줄이고 싶을 수도 있지만 마지막 수단 으로이 작업을 수행합니다.


좋은 기사입니다. 작성해 주셔서 감사합니다! SQL 로그에 여러 AppDomain이 언로드됩니다. CLR 저장 프로시 저는 2 개 뿐이며 기본적으로 웹 서비스와 데이터를주고받습니다. 이 2 개의 CLR 저장 프로 시저가 기본적으로 너무 많은 VAS를 사용하고있는 것이 이상해 보입니다.
Aaron Daniels

천만에요. 아시다시피 memToLeave의 기본 할당은 256MB입니다. 이것은 특히 서버에서 사용 가능한 모든 메모리를 사용하는 경우 AppDomain, 모든 CLR / 관리 코드, 연결된 서버 쿼리, SSIS 등을위한 작은 샌드 박스입니다. -g startup 매개 변수를 사용하여 512MB로 두 배로 늘리는 것이 좋습니다.
John Sansom

1

포럼 스레드에 따르면 연결된 서버 드라이버의 메모리 누수와 관련이있을 수 있습니다 .

다음은 Microsoft가 우리에게 말한 것입니다.

링크 된 서버를 사용하여 명시 적으로 fox pro 드라이버를 사용하여 데이터를 처리하면 시간이 지남에 따라 메모리 누수가 발생합니다.


0

이 서버는 데이터베이스 서버뿐만 아니라 응용 프로그램 서버 (2 개의 Windows 서비스) 및 웹 서버로 3 배가됩니다.

최소 메모리를 설정합니다. 이러한 다른 프로세스가 SQL의 "스털링"메모리 일 수 있습니다.

perfmon을 사용하여 카운터 로그를 실행하여이를 확인하거나 실제 문제가 무엇인지 식별하기위한 추가 정보를 제공 할 수 있습니다.


0

이 블로그에서 가져온 참조!

이 문제를 해결하기위한 다른 대안이 있습니다.

먼저, "최소 서버 메모리"및 "최대 서버 메모리"에 대한 SQL Server 설정을 확인하십시오. 두 값에서 아주 작은 차이를 발견 한 경우 "최대 서버 메모리"를 늘리십시오.

둘째, 메모리 사용 정보가 포함 된 장기 실행 쿼리를 찾았으며이 쿼리가 유휴 상태 인 경우이 프로세스를 확인하고 종료하십시오. 데이터베이스 성능 최적화는 메모리 사용에있어 중요한 것입니다.

셋째, 적절한 색인을 생성하지 않으면 DISK I / O가 증가하고 메모리에 직접 영향을 미치기 때문에 장기 실행 쿼리에 대한 인덱스 사용량을 알 수 있습니다.

넷째, 가상 메모리 페이징 파일의 크기를 확인하고이 파일의 크기를 늘리십시오.

다섯째, “쿼리 당 최소 메모리”의 크기를 확인하십시오. 실제로는 기본적으로 1024KB이지만 드문 경우이지만이 매개 변수의 크기를 줄일 수 있습니다. 실제로 이것은 권장되지 않지만 시도해 볼 수 있습니다.

여섯째, 이 DBCC 명령을 실행하려고하면 서버의 전반적인 성능에 영향을 줄 수 있으므로 권장하지 않습니다. 그러나 당신은 이것을 시도 할 수 있습니다.

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