문제

Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (x64) "이상 이상 버퍼 및 페이지 수명 기대 수명 (PLE) 증상이 나타납니다.

이 서버에서 매분 마다이 문제를 추적합니다 (이 문제를 추적하십시오) :

SELECT @ple = CAST([cntr_value] AS VARCHAR(20))
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Manager%'
AND [counter_name] = 'Page life expectancy'

SELECT @usedBufferPages = CAST(COUNT(*) /128 AS VARCHAR(20)) 
FROM sys.dm_os_buffer_descriptors

DECLARE @StartDate VARCHAR(8) = Convert(VARCHAR(8), GETDATE(), 14)
RAISERROR ('%s. PLE at %s and Used Buffers at %s at %s ', 0, 
            1,@runCountString ,@ple, @usedBufferPages, @StartDate) WITH NOWAIT  
.

이것은 몇 가지 예제입니다.

16. PLE at 858 and Used Buffers at 7290 at 09:51:42 
17. PLE at 918 and Used Buffers at 7342 at 09:52:42 
18. PLE at 978 and Used Buffers at 7408 at 09:53:43 
19. PLE at 1039 and Used Buffers at 7547 at 09:54:43 
20. PLE at 1100 and Used Buffers at 7697 at 09:55:44 
21. PLE at 1160 and Used Buffers at 7901 at 09:56:45 
22. PLE at 1221 and Used Buffers at 7961 at 09:57:46 
23. PLE at 1282 and Used Buffers at 8012 at 09:58:46 
24. PLE at 11 and Used Buffers at 313 at 09:59:46 
25. PLE at 31 and Used Buffers at 966 at 10:00:46 
26. PLE at 90 and Used Buffers at 1580 at 10:01:47 
27. PLE at 151 and Used Buffers at 3072 at 10:02:47 
28. PLE at 211 and Used Buffers at 3152 at 10:03:47 
29. PLE at 271 and Used Buffers at 3729 at 10:04:47  
.

항목 # 24 SQL Server는 1,282 ~ 11 에서 PLE를보고합니다. SQL Server는 사용 된 버퍼가 8,012에서 313 에서 로 이동한다고보고합니다.

처음에는 가난한 실행 쿼리가 불량을 보였습니다. 고정 된 수치 (문제에 영향을 미치지 않았습니다)를 찾았습니다. 그러나 PLE / BUFFER 문제가있는 시간과 상관 관계가있는 문제 쿼리를 찾지 못했습니다. 또한 쿼리가 열악한 경우 버퍼가 해당 쿼리의 데이터로 가득 차있을 것이고 비어 있지 않거나 누락 된 / 오류가 없었습니다.

다음에 가상 컴퓨터 가이 일이 일어 났을 때 메모리가 제한되어 있음을 생각했습니다. 그러나 나는 시스템 관리자에게 물었으며 그는 메모리가 역동적이지 않거나 어떤 식 으로든 공유하지 않는다는 것을 확신합니다. (할당 된 것, 그것은 항상, 항상 얻습니다.) 또한 10 분 마다이 스크립트를 실행하고 PLE가 50 미만을보고 할 때 :

  SELECT * FROM sys.dm_os_sys_memory
.

PLE / BUFFERS가 높고 낮을 때 동일하거나 유사한 값을보고합니다. 완전성을 위해 다음은 위의 # 24의 전후의 값의 예입니다.

total_physical_memory_kb    available_physical_memory_kb    total_page_file_kb  available_page_file_kb  system_cache_kb kernel_paged_pool_kb    kernel_nonpaged_pool_kb   system_high_memory_signal_state   system_low_memory_signal_state   system_memory_state_desc
20970996                    4758672                         24378868            7929404                 4844160         686076                  182752                    1                                 0                                Available physical memory is high
20970996                    4743468                         24378868            7892632                 4845000         686580                  182688                    1                                 0                                Available physical memory is high
.

시스템의 건강 세션을 확인 했으므로 관련이 없습니다. (모든 것은 가장 흔들리는 모든 것이며, 그들의 시간은 PLE / BUFFERS가 문제를 보여주는 시간과 상관 관계가 없습니다.

이 일이 발생하는 빈도를 추적했거나 패턴을 볼 수 없거나 작업이나 예정된 활동에 연결할 수 없습니다.

여기에 PLE 및 버퍼를 21 시간 이상 보여주는 그래프입니다.

PLE 및 21 시간 이상 버퍼

그래서 나는 곤경에 처해있다. 나는이 문제의 핵심이 Ple이 아닌 버퍼라고 생각합니다. (나는 모든 버퍼가 어떻게 든지나 갔기 때문에 PLE가 낮은 보고서를 얻는 것이 어렵다고 생각한다.)

그러나 나는 이것이 일어날 수있는 어떤 방식 으로든 생각할 수 없다. 또는 다음에 무엇을 해야하는지.

나는이 문제가 일어날 일을 확인하거나 제안하기위한 추가 사항에 대한 조언을 좋아할 것입니다.

의견의 질문에서 업데이트 :

그래서, 서버가 주어진 서버의 메모리는 얼마입니까? VM은 20GB의 메모리가 있습니다.
최대 서버 메모리가 무엇입니까?

name                    value   value_in_use  description
max server memory (MB)  13000   13000         Maximum size of server memory (MB)
min server memory (MB)  0       16            Minimum size of server memory (MB)
.

참고 : 이제이 설정을 읽었으며 이러한 설정이 내 서버에서 잘못된 것 같습니다.

데이터베이스가 얼마나 큰지? 이 서버에서 실행되는 두 개의 트랜잭션 데이터베이스가 있습니다 (나는 서버를 격리하는 프로세스에 있습니다.) 크기는 383GB 및 378GB입니다.

해당 서버에서 다른 응용 프로그램 및 서비스가 실행 중입니까? 이 서버는 내 응용 프로그램의 데이터를 호스팅합니다. 다른 것들은 그것을 때리는 것들이 없습니다. (나는 보고서에 대한 복제 된 운영 데이터 저장소가 있습니다.

VM 기술 VM 도자기는 무엇입니까? 이 VM은 유사한 자원 할당으로 VM을 호스팅하는 호스트에서 실행됩니까? 우리는 우리 회사에서 많은 VM을 가지고 있습니다. 모든 다양한 크기. 이것은 가장 큰 것 중 하나입니다.

시스템 관리자가 그를 믿을 필요없이 메모리 할당에 대해 알려주는 것인지 확인할 수 있습니까? 나는 할 수 없습니다. 나는 그 도구에 액세스 할 수 없다.

(내 경험에서 시스템 관리자는 벅을 통과시키고 앱을 비난 할 것 "이라고 말하면서 아무 것도 할 필요가 없다는 것을 의미합니다. 그 감정을 이해하십시오.

패턴이 확실히 심한 메모리 압력과 같이 보입니다 동의합니다. SQL이 메모리 압력을 느끼고 있음을 증명하는 것을 발견하기를 희망했습니다. 그래서 더 많은 연구를 위해 시스템 관리자에게 다시 보낼 수 있습니다.

대기 시간 통계

WaitType               Wait_S      Resource_S  Signal_S  WaitCount  Percentage   AvgWait_S  AvgRes_S  AvgSig_S 
---------------------- ----------- ----------- --------- ---------- ------------ ---------- --------- ---------
PAGEIOLATCH_SH         16250.10    16219.14    30.96     2171649    29.59        0.0075     0.0075    0.0000   
CXPACKET               14214.03    13238.56    975.47    1187935    25.88        0.0120     0.0111    0.0008   
PAGEIOLATCH_EX         6814.59     6806.21     8.38      638725     12.41        0.0107     0.0107    0.0000   
WRITELOG               5157.42     4873.44     283.98    3588476    9.39         0.0014     0.0014    0.0001   
BACKUPIO               2569.51     2538.12     31.39     1704119    4.68         0.0015     0.0015    0.0000   
LCK_M_IX               2477.15     2477.10     0.05      113        4.51         21.9217    21.9213   0.0004   
ASYNC_IO_COMPLETION    2079.99     2079.66     0.33      836        3.79         2.4880     2.4876    0.0004   
BACKUPBUFFER           1807.75     1759.11     48.64     380189     3.29         0.0048     0.0046    0.0001   
IO_COMPLETION          986.23      985.84      0.39      116112     1.80         0.0085     0.0085    0.0000   
.

도움이 되었습니까?

해결책

OP에서 확인 된

문제는 SQL Server 2012의 버그 때문입니다. SQL Server 2012 SP1 CU4 .또는 안전하게 보낼 것이라고 SQL Server 2012를 적용하는 것이 좋습니다.SP2 CU4로가는 대신.

Microsoft 버그 수정 세부 정보

SQL Server 2012에서는 느린 성능이 느려질 수 있습니다. 확인할 때 SQL Server 성능 모니터 도구, 다음을 볼 수 있습니다.

• SQLServer의 급속한 감소 : 버퍼 관리자 \ 페이지 수명 기대 수명 성능 카운터 값.이 문제가 발생하면 카운터가 있습니다 0. 근처 0.

다른 팁

버퍼 풀은 13GB 및 데이터베이스가 383GB 및 378GB 인 OLTP - 너무 자주 실행되는 작은 트랜잭션으로 분류 된 383GB입니다.

위의 상황은 다음과 같아야하는 경우 :

여기에 이미지 설명을 입력하십시오 > (출처 : Google 사진)

SQL Server가 정보를 저장하는 방법을 이해해야합니다.

SQL Server 메모리 캐시라는 구조에 메모리에 정보를 저장합니다. 캐시의 정보는 데이터, 인덱스 항목, 컴파일 된 프로 시저 계획 및 다양한 다른 유형의 SQL Server 정보가 될 수 있습니다. 정보를 다시 만들지 않도록하려면 메모리 캐시가 오래 유지됩니다. 가능한 한 유용하지 않거나 새로운 정보에 대한 메모리 공간이 필요할 때 캐시에서 일반적으로 캐시에서 제거됩니다. 이전 정보를 제거하는 프로세스를 메모리 스윕이라고합니다. 메모리 스윕은 빈번한 활동이지만 연속적이지 않습니다.

데이터베이스 크기와 부적절한 버퍼 풀의 양으로 인해 경험하는 메모리 기아를 확실히 확실히 사용할 수 있습니다. 참조 - 인스턴스의 이상적인 메모리를 확인하는 방법은 무엇입니까?

기다림 통계 성능 확인 낭비되는 버퍼 풀 메모리에서 발생하는 문제

추천 :

더 많은 메모리를 서버 인스턴스에 추가하고 서로 다른 VM의 두 데이터베이스를 적절한 메모리로 분리하십시오.

여기에 디버그가 거의 없습니다. 메모리를 추가하고, 여러 VM에서 데이터베이스를 논리적으로 분할하거나, 제한된 메모리로 수행 해야하는 셔플 링이 성능 문제와 휘발성 PLE로 이어질 것임을 이해해야합니다.13GB의 메모리에 800GB의 데이터를 맞추려고 노력하는 것은 배낭에서 멀리 떨어지는 것과 같습니다.

실행중인 쿼리에서 자세히 살펴보십시오.메모리 사용량 데이터베이스에서만 데이터베이스가 너무 굵고 사물을 개선하기위한 메트릭이 거칠됩니다.쿼리 (블랙 박스 응용 프로그램)에 영향을 줄 수 없다고 가정하면 메모리 사용에 영향을 미치는 것이 무엇인지 이해 가치가 있습니다.예를 들어, 배치 프로세스는 대규모 테이블의 모든 데이터를 쿼리하여 단일 히트에서 모든 버퍼 공간을 사용할 수 있습니다.

특히 서버의 캐시를 효과적으로 플러시 할 수 있으므로 전체 테이블 스캔을 유발하는 누락 된 인덱스를 찾습니다.

SQL Server에는 실시간으로 모니터링 할 수있는 훌륭한 분석기 도구가 있습니다. 그리고 나는 당신이 그것을 탐구하면 뭔가를 탐험하면 아픈 엄지처럼 튀어 나오게됩니다.

데이터베이스 스키마를 변경하는 것을 제안하지는 않지만 외관을 바라는 것은 지나치게 큰 VARCHAR 필드입니다. 큰 데이터베이스에서 캐시 공간을 정말로 빨아할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 dba.stackexchange
scroll top