2009. 6. 25. 12:48

MemToLeave 메모리체크

서버 오류 메세지.

 WARNING: Failed to reserve contiguous memory of Size= 65536


MemToLeave 의 메모리 량이 부족해서 나타나는 오류 입니다.
시작 옵션에서 -g 를 하고 사이즈를 입력해주시기 바랍니다.




** 참고 자료 입니다.

메모리 영역의 구성
1. Buffer pool : SQL Server의 기본 데이터 저장소
2. MemToLeave : BPool에서 사용하지 않는 SQL Server의 유저 영역 메모리
3. AWE memory : AWE를 활성화 할 경우 사용할 수 있는 BPool의 확장 및 데이터와 인덱스의 케싱을 위해 사용되는 데이터 공간

MemToLeave
기본적으로 MemToLeave 영역은 384MB의 크기를 갖는다. 이중 128MB는 Worker thread stacks 을 위해 예약 되며
, (max worker threads = 255 * 0.5M) 나머지 256MB 는 BPool 외의 공간을 위해 예약된다.
예를 들어 MemToLeave는 OLE DB Provider (Linked Server를 이용하는 경우)및 in process COM object 및 8Kb 이상의 크기를
갖는 서버 코드 등이 사용하게 됩니다. (켄 핸더슨 2003년)
특히 2005 버전 부터는 CTE나 CLR 등이 해당 메모리를 사용하게 됩니다.
MemToLeave Size 조절 : 시작 옵션에서  –g 옵션을 주고 사이즈를 기입 (Ex –g 1024)
*/


With VASummary(Size,Reserved,Free) AS
(SELECT
    Size = VaDump.Size,
    Reserved =  SUM(CASE(CONVERT(INT, VaDump.Base)^0)
    WHEN 0 THEN 0 ELSE 1 END),
    Free = SUM(CASE(CONVERT(INT, VaDump.Base)^0)
    WHEN 0 THEN 1 ELSE 0 END)
FROM
(
    SELECT  CONVERT(VARBINARY, SUM(region_size_in_bytes))
    AS Size, region_allocation_base_address AS Base
    FROM sys.dm_os_virtual_address_dump 
    WHERE region_allocation_base_address <> 0x0
    GROUP BY region_allocation_base_address 
UNION  
    SELECT CONVERT(VARBINARY, region_size_in_bytes), region_allocation_base_address
    FROM sys.dm_os_virtual_address_dump
    WHERE region_allocation_base_address  = 0x0
)
AS VaDump
GROUP BY Size)

SELECT SUM(CONVERT(BIGINT,Size)*Free)/1024 AS [총 Memtoleave] ,CAST(MAX(Size) AS BIGINT)/1024 AS [잔여 Memtoleave] 
FROM VASummary 
--WHERE Free <> 0