MS SQL에서 데이터를 저장하는 최소 단위는 page이고 8개의 페이지가 1개의 extent를 이룬다.
여기서 page의 크기는 8KB이므로 1개의 extent는 64KB인데, extent는 디스크 I/O의 최소 단위가 된다.
즉, SQL서버의 세계에서 디스크를 통한 데이터 입출력은 64KB단위라는 것.
이와 관련하여 RAID 컨트롤러의 stripe block size, 파티션 시작 오프셋, 파티션 볼륨의 allocation unit size를 어떻게 셋팅할 것인가하는 문제가 생기는데... Default 설정 값으로는 SQL Server에 최적화되지 않기 때문이다.
일단 파티션 시작 오프셋값을 조정해야하는 이론적 근거는 다음과 같다.
OS의 파티션 시작은 Default로 디스크의 64번째 섹터부터이다.
최초 63섹터까지의 공간은 MBR (Master Boot Record)영역이기 때문인데, 섹터 한개의 사이즈가 512Byte이므로 파티션이 시작하는 64번째 섹터란... 디스크의 처음 32KB의 시작 부분을 의미한다.
따라서 파티션 시작 오프셋의 Default 값은 32KB (64th * 512Byte)가 된다.
그런데 MS와 EMC의 주장(?)에 따르면 SQL서버의 데이터 파일과 로그 파일이 위치한 디스크의 경우 I/O가 64KB단위로 발생하기 때문에, 파티션 시작 오프셋값을 64KB로 일치시키지 않으면 트랙 경계에 데이터가 걸치는 경우가 발생하여 디스크 I/O에 손해가 발생한다는 것이다. (헤드, 트랙, 섹터, 플래터, 스핀들과 같은 HDD와 관련된 용어는 설명을 생략함)
몇 몇 블로그를 보면... 위 권고 사항을 따랐을 때 약 10%의 IOPS 향상이 있다고 하니... 진짜인 것 같기도 ^^;;; 시간날때 테스트해봐야겠다.
암튼... MS와 EMC의 여러 글을 보면 stripe block size, 파티션 시작 오프셋, NTFS allocation unit size 모두 64KB로 설정 하길 권고하고 있다.
대부분 RAID 볼륨을 사용하는데 이 경우 stripe size에 영향을 받는다.
대부분의 구성에 대해 파티션 시작 오프셋 값은 1024가 적당하다.
파티션 시작 오프셋 설정은 아래 대로하면 OK
1. 맞추려는 디스크가 이미 비어 있을(원시 상태) 경우 3단계를 진행합니다. 디스크에 데이터가 들어 있을 경우 진행하기 전에 먼저 디스크를 백업합니다.
여기서 page의 크기는 8KB이므로 1개의 extent는 64KB인데, extent는 디스크 I/O의 최소 단위가 된다.
즉, SQL서버의 세계에서 디스크를 통한 데이터 입출력은 64KB단위라는 것.
이와 관련하여 RAID 컨트롤러의 stripe block size, 파티션 시작 오프셋, 파티션 볼륨의 allocation unit size를 어떻게 셋팅할 것인가하는 문제가 생기는데... Default 설정 값으로는 SQL Server에 최적화되지 않기 때문이다.
일단 파티션 시작 오프셋값을 조정해야하는 이론적 근거는 다음과 같다.
OS의 파티션 시작은 Default로 디스크의 64번째 섹터부터이다.
최초 63섹터까지의 공간은 MBR (Master Boot Record)영역이기 때문인데, 섹터 한개의 사이즈가 512Byte이므로 파티션이 시작하는 64번째 섹터란... 디스크의 처음 32KB의 시작 부분을 의미한다.
따라서 파티션 시작 오프셋의 Default 값은 32KB (64th * 512Byte)가 된다.
그런데 MS와 EMC의 주장(?)에 따르면 SQL서버의 데이터 파일과 로그 파일이 위치한 디스크의 경우 I/O가 64KB단위로 발생하기 때문에, 파티션 시작 오프셋값을 64KB로 일치시키지 않으면 트랙 경계에 데이터가 걸치는 경우가 발생하여 디스크 I/O에 손해가 발생한다는 것이다. (헤드, 트랙, 섹터, 플래터, 스핀들과 같은 HDD와 관련된 용어는 설명을 생략함)
몇 몇 블로그를 보면... 위 권고 사항을 따랐을 때 약 10%의 IOPS 향상이 있다고 하니... 진짜인 것 같기도 ^^;;; 시간날때 테스트해봐야겠다.
대부분의 구성에 대해 파티션 시작 오프셋 값은 1024가 적당하다.
파티션 시작 오프셋 설정은 아래 대로하면 OK
1. 맞추려는 디스크가 이미 비어 있을(원시 상태) 경우 3단계를 진행합니다. 디스크에 데이터가 들어 있을 경우 진행하기 전에 먼저 디스크를 백업합니다.
2. 디스크의 모든 파티션을 삭제합니다.
3. 명령 프롬프트를 열고 Diskpart.exe를 실행합니다.
4. Diskpart 명령 프롬프트에서 List Disk를 입력하고 Enter 키를 누릅니다. 맞추려는 디스크가 목록에 나타나지 않을 경우 디스크가 있는지 확인하고 디스크 관리 스냅인을 사용하여 액세스할 수 있는지 확인합니다.
5. Diskpart 명령 프롬프트에서 Select Disk X를 입력합니다. 여기서 X는 List Disk 명령 출력에 표시되는 디스크 번호를 나타냅니다. Diskpart는 디스크 X가 선택된 디스크임을 나타내는 메시지를 반환해야 합니다.
6. Diskpart 명령 프롬프트에서 Create Partition Primary Align=X를 입력합니다. 여기서 X는 저장소 공급업체의 권장 사항에 따라 32 또는 64이 됩니다. 저장소 공급업체의 구체적인 권장 사항이 없으면 1024를 사용하는 것이 좋습니다.
7. Diskpart 명령 프롬프트에서 Assign Letter=<DriveLetter>를 입력합니다. 예를 들어 디스크에 Z 문자를 할당하려면 Assign Letter=Z를 입력합니다.
8. 드라이브 문자를 지정했으면 exit를 입력하여 Diskpart 유틸리티를 끝냅니다.
9. 파티션을 NTFS 포맷의 파티션으로 포맷하려면 디스크 관리 스냅인 또는 Windows 포맷 명령을 사용합니다.
위 과정 중 2, 3, 4를 실행하고 list partition이라고 타이핑하거나,
msinfo32를 실행하고 Components > Storage > Disks > Partition Starting Offset 항목을 확인하면 된다.
관련 글
http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/prork/pree_exa_oori.mspx?mfr=true
http://www.emc.com/collateral/hardware/technical-documentation/h2370-microsoft-sql-svr-2005-ns-series-iscsi-bp-plan-gde-ldv.pdf
http://support.microsoft.com/kb/929491/en-us
'SQL Server > SQL Server Tip & Tech' 카테고리의 다른 글
윤년 판단하는 함수 (0) | 2008.07.16 |
---|---|
날짜와 복합키를 이룬 IDENTITY 컬럼의 값 순환시키기 (0) | 2008.07.10 |
SQL Server의 procedure cache 크기 (0) | 2008.07.08 |
FOR XML PATH Concatenation을 사용하는 재치있는 방법 (3) | 2008.07.07 |
sp_procedure_params_rowset (2) | 2008.07.07 |