http://technet.microsoft.com/en-us/library/cc966425.aspx This paper explains how batches are cached and reused in SQL Server 2005, and suggests best practices on maximizing reuse of cached plans. It also explains scenarios in which batches are recompiled, and gives best practices for reducing or eliminating unnecessary recompilations. 본 문서에서는 SQL 2005 서버에서 배치들이 어떻게 캐쉬 되고 재 사용되는 지를 설명합니다, 그리고 캐쉬된 플랜들의 재사용을 최대화 하는데 최상의 예를 제시합니다. 이 문서는 또한 배치들이 리컴파일 되는 예를 통해서 불필요한 리컴파일을 줄이고 제거하는 최상의 예를 전달합니다. |
TPC-E 는 2007년 2월에 소개된 OLTP (일반 RDB) 을 위한 성능 측정 자료 입니다. 자세한 내용은 아래 자료를 참고하시기 바랍니다. |
원문 : http://blogs.msdn.com/ntdebugging/archive/2009/12/11/pool-fragmentation.aspx 안녕하세요. 제 이름은 스태판입니다. 저는 Microsoft의 Global Escalation Service Team에서 Escalation engineer로 근무하고 있습니다. 오늘은 제가 최근에 경험했던 풀 메모리의 단편화에 대해서 이야기 하겠습니다. 자 덤프파일을 보도록 하겠습니다. !poolused /t5 2 명령어를 통해 nonpaged pool 사용량이 많은 유저들을 확인해 보았습니다. !vm 의 결과는 101MB 의 사용을 표기 하고 있으나 !poolused 는 65MB 의 사용이 확인 됩니다. 이는 바로 풀 메모리 단편화를 의미합니다. 조사 결과 저는 많은 풀 페이지들이 아래와 같은 패턴으로 구성되어 있음을 확인하였습니다. 페이지 fa808000 은 0x18 = 24 byte 크기 입니다. fa808000 과 fa808a38의 모든 페이지들은 freed 되어 이고, 다른 목적을 위하여 재사용 될 것입니다. 위의 페이지에서는 4096 Bytes 중 24 Bytes 만 사용 중입니다. 이런 상황은 fa550000 과 f8feb000 에서도 동일하게 나타나고 있습니다. 자 우리의 질문은 왜 이런 일들이 일어나고 어떻게 하면 이런 상황을 미연에 방지 할 수 있는가? 입니다. 이 덤프에서 저는 많은 MmCm 의 Pool 메모리 사용 현황을 확인 하였습니다. 다음은 일반적으로 단편화가 발생 하기 위한 상황 입니다. 1) 드라이버가 0xF18 크기의 풀 블럭을 요구합니다. 위의 3개의 풀 모두 Free 된 공간의 총합은 충분히 0xF18 크기 이상이 됩니다. 하지만 전체 페이지 4K는 3개로 분활 되어 있고, 이중 이 Free 된 공간은 꼭대기와 밑쪽에 위치하고 있습니다. 그리고 둘 모두 0xF18 크기를 할당 할 만큼 크지 못합니다. 이와 같은 이슈를 피하기 위해서는 0xF18 사이즈의 요청 대신에 전체 풀을 커버할 수 있는 4K 사이즈의 메모리를 요청하는 것이 좋습니다. 물론 할당된 페이지의 약간의 잔여 공간을 활용하지 못하긴 합니다. 하지만 그 대신에 위와 같은 단편화 현상은 방지 할 수 있습니다. 참고로 MSDN에서는 드라이버의 MmCm ( MmAllocateContiguousMemory ) 이용은 충분히 길게 사용하도록 권고 하고 있습니다. 라이브 디버깅을 할 때, 여러분은 연속적으로 할당 되고 해제 된 MmCm을 볼 것 입니다. 참고 링크 |
* 아직은 많이 부족하기 때문에 제가 자신이 생길 때 까지 본 글은 제 블로그에 대한 링크만 허용합니다. 드디어 돌고 돌아 커널에 대한 설명을 시작합니다. 아직도 절반을 못 왔군요…ㅜㅜ Privilege Level 윈도상에서 동작하는 모든 실행 코드들은 Privilege Level 을 할당 받습니다. 이 Privilege Level 이란 컴퓨터의 안정성을 위하여 임의로 설계 해 놓은 권한으로써 0레벨이 가장 높은 권한에 해당합니다. 실제로 CPU가 메모리를 참조하는 단위인 세그먼트에는 이 권한을 명시해 놓은 DPL flag가 있습니다. 그래서 어떤 메모리를 참조하게 되면 우선은 DPL을 검사한 다음 PDE 및 PTE의 User/Supervisor bit를 검사하게 됩니다. 앞에서 설명한 것과 같이 0 레벨은 가장 권한이 높습니다. 이는 가장 신뢰를 할 수 있다는 의미로써, OS Kernel의 실행 영역이며, 레벨 3은 가장 신뢰가 낮은 영역으로 이 영역에서 동작하는 Application의 문제로 인한 영향의 정도를 줄일 수 있습니다. 이와 같은 신뢰성 확보를 위해 3레벨에서는 실행 가능한 명령어를 제한 하고 있습니다. |
* 아직은 많이 부족하기 때문에 제가 자신이 생길 때 까지 본 글은 제 블로그에 대한 링크만 허용합니다. 쓰래드의 상태 변화 윈도우에서 실행 되는 쓰래드들은 실제로 위의 8가지 상태 중 한 가지의 상태가 됩니다. 스레드의 우선 순위 Windows 의 스레드 스케줄링은 스레드 우선 순위와 라운드 로빈 방식을 조한한 형태 입니다. 위 그림과 같이 실시간 처리가 필요한 스레드의 경우 우선 순위를 높게 주고, 다소 느린 처리가 가능한 경우에는 우선 순위를 낮게 준 후 동일 우선 순위 사이에서는 큐의 가장 앞에 있는 스레드를 처리하게 됩니다. 스레드가 CPU를 점유하는 시간 간격을 앞서 설명한 것처럼 퀀텀이라고 합니다. Windows 2000 이후의 OS에서는 퀀텀 부스팅이 가능 합니다. 이는 퀀텀 시간을 늘려 주는 것으로 예를 들어 활성 윈도우에서 실행 되는 스레드의 경우 해당 스레드의 퀀텀 부스팅을 통해서 유저 엑션에 대한 응답속도를 높이고 있습니다. 스레드는 퀀텀 기간 동안 CPU를 점유하게 됩니다. 하지만 아래와 같은 경우 스레드의 실행은 잠시 멈추게 됩니다. 1. 자발적으로 세마포 및 뮤텍스 와 같은 객체를 획득하기 위해 대기하는 경우 (WaitForSingleObject 등 ) : 대기 상태로 전환 위의 그림과 같이 스레드의 우선 순위는 0 ~ 31 까지의 32단계의 값을 갖습니다. 이 중 16이상의 값을 갖는 스레드를 실시간 수준으로 15이하 1이상의 스레드를 가변 수준이라 부릅니다. 우선 순위가 1 ~ 15인 경우 스레드는 처음 프로세스의 우선 순위에 준한 기본 우선 순위를 갖으나, 시스템에 의해 우선 순위가 올라갈 수 있습니다. 예를 들어 실행 준비가 끝난 스레드가 일정 시간 동안 실행 기회를 얻지 못한 경우 Window는 일시적으로 해당 스레드의 우선 순위를 높여 줍니다. 하지만 16이상인 경우에는 고정된 일정한 우선 순위값을 갖게 됩니다. 우선 수위 수준 우선 순위가 올라가는 경우 동기화 Windows에서 제공하는 동기화 방법은 아래와 같습니다.
|
이전에는 메모리 영역의 구분이네 뭐네 복잡하게 이야기 했는데… 그저… 사용할 수 있는 명령어의 한계가 없다 = 커널 그리고 한계가 있다 = 유저 모드… 물론 Windows의 경우 가상 메모리 주소의 영역이 분리되어 있는 것은 맞다. 이러한 Priviledged Level 이 높은 명령어를 실행 하는 방법은 3가지가 있다. 정상적인 상태에서 커널에 일을 시키는 방법은 바로 위의 3가지 이고, 이는 높은 권한이 필요한 명령어를 수행 할때 필요한 것이라고 하겠다. |