카테고리 없음

cmemthread wait

보미아빠 2014. 5. 26. 20:32

메모리의 과다한 소비로 인해 메모리가 없어 cmemthread 경합이 발생하는 경우

 


-- 전체 메모리 확인
SELECT cast(sum(pages_in_bytes)/1024./1024 as int) sizeMB, MO.TYPE, MC.TYPE
  FROM SYS.DM_OS_MEMORY_OBJECTS MO
  JOIN SYS.DM_OS_MEMORY_CLERKS MC
    ON MO.PAGE_ALLOCATOR_ADDRESS=MC.PAGE_ALLOCATOR_ADDRESS
 GROUP BY MO.TYPE, MC.TYPE
 ORDER BY 1 DESC;

 

 

--MEMOBJ_MSXML 로 인한 메모리 사용량이 많다면, 아래 스크립트를 이용해 삭제 한다.
SELECT *
FROM sys.dm_os_memory_objects
WHERE type = 'MEMOBJ_MSXML';

 

 

-- 강제 삭제
declare @document_id int = 0
while (1=1)
begin
 select top 1 @document_id = document_id from sys.dm_exec_xml_handles(0)
 if @@rowcount = 0 break
 EXEC SP_XML_REMOVEDOCUMENT  @document_id
end

 

-- repro 를 위한 메모리 증가 쿼리

SET NOCOUNT ON
DECLARE @LOOP INT = 1

while (@LOOP <= 100000)
begin
 DECLARE @message VARCHAR(MAX), @xDoc INT, @i INT = 0;
 SET @message = (SELECT 'HellowWorld' '@Attribute1' FOR XML PATH('HelloWorld'));
 PRINT @message;

 EXEC sp_xml_preparedocument @xDoc OUTPUT, @message;
 PRINT @xDoc;
 SET @LOOP = @LOOP + 1
end