MSSQL 성능 향상 – TEMPDB in memory

Memory MSSQL  => NoSQL?!

오랜 운영에 따른 데이터베이스 대형화, 그리고 웹의 대화형 서비스에 따른 잦은 업데이트, SNS의 특성에 의한 읽기와 쓰기도 많이 발생하다 보니 데이터베이스의 읽기, 쓰기 속도가 매우 중요하게 되었고, 근래 들어 SNS의 개인의 웹 참여도가 높아지면서 데이터베이스의 병목병목현상으로부터 어떻게 SQL의 성능을 끓어 올릴 수 있을지 대한 이슈가 상당히 중요해 졌다. RDB(관계형 데이터베이스)는 무결성과 정합성을 제공하는데, 서비스에서 이러한 무결성과 정합성을 필요로 하지 않는 데이터도 상당수 존재하여, 클라우드 환경에서는 RDB는 적합하지 않다라는 많은 전문가들도 얘기하였다. 결과 이를 개선하기 위하여 데이터를 분산하여 처리하는 기술 No(Not-only)SQL이 나오게 되었는데, 이는 말 그대로 SQL만으로 구성하지 않는다는 의미이다. 즉 SQL의 특성인 무결성과 정합성은 보장하지 못하지만, 확장성과 높은 성능, 그리고 높은 가용성을 위해 사용되는 모든 시스템을 NoSQL이라 한다. NoSQL 자체가 기존 데이터베이스의 부족 부분을 보완해야 하는 기능을 구현하다 보니, 하드웨어적인 부분을 이용한 속도 개선이 많다. 대표적으로 Memcached(http://memcached.org)와 같은 오픈 소스 솔루션을 이용해 메모리에 데이터를 저장해 두었다가 바로 표시해주는 역할을 분리하는 작업을 통해 데이터베이스에 직접 접근해야 하는 처리를 줄일 수 있는 부하 분산 시스템이라 할 수 있다.

이외에도 NoSQL 관련 지식을 얻고자 한다면 아래 사이트를 방문해 보기 바란다.

http://nosql-database.org/

실상 이러한 이슈는 SQL뿐만이 아니라, 시스템 전역에서 나타난다고 할 수 있다. 하지만 유독 SQL이 이슈화 되는 이유는 대다수 중요 데이터 처리를 데이터베이스가 맡아 처리하다 보니, 자연스럽게 일반적인 다른 서비스보다 먼저 눈에 띄었을 뿐 NoSQL의 원리는 여러 서비스에 적용할 수 있다. 그리고 이 책에서 다루는 건 여러 전문가가 얘기하는 NoSQL과는 거리가 있을 수도 있다. NoSQL 관련 홈페이지를 보면 이미 몇 가지 정형화된 솔루션들이 많이 거론되고, 해당 기술 분야로 확대되어, 더 많은 연구 개발을 진행되고 있다. 따라서 NoSQL 부분을 배우고자 한다면 앞서 홈페이지에서 더 많은 지식을 습득할 수 있을 것이다. 단지 이 책에서는 NoSQL이라기 보다는 성능이라는 이슈에 대해 진행해 보았다고 할 수 있으니, 시스템이라는 성능이라는 관점과 같이 생각해 주었으면 하는 바램이다(이번 장 추가 내용인 SqlCacheDependency이 NoSQL에 가깝다). 그럼 Memory를 이용한 MSSQL 성능 향상(NoSQL)을 위해 MSSQL을 램 드라이브 생성을 위해 실습 준비를 하자.

실습 준비

Vsuite Ramdisk: http://goo.gl/et2LP, 기능 제한이 있는 무료 버전으로, 윈도우 2003까지 램 디스크는 최대 4GB로 제한하였다. 이 외에는 이용하는 데 큰 불편은 없다. 그리고 현재 Standard와 Professional 버전은 개발을 중단한 상태로, 테스트를 위해 이 버전을 사용해도 무방하다.

MSSQL 2008 express
http://goo.gl/y998M MSSQL 무료 버전으로 그래픽 관리 도구가 포함되어 있다.

다운로드 페이지에서 무료 버전를 선택해 설치하면 메모리를 가상 메모리로 사용할 수 있다(유료버전에서는 자동 백업 기능이 추가 된다). 그리고 메모리를 디스크로 사용하는 만큼 데이터 유실의 위험은 존재한다. 따라서 주요 데이터는 아래 위치에서 사용하지 않기를 권장한다.

[그림 1] 메모리를 디스크처럼 사용할 수 있다

MSSQL 2008 Express 사이트에 관련 필수 구성요소인 .NET framework 3.5, Powershell, Windows Installer 4.5을 설치할 수 있는 링크를 함께 제공하므로 관련 패키지가 없는 경우 설치하도록 하자. 설치는 크게 어렵지 않게 진행할 수 있을 것이다. 설치 중 설치 구성요소를 묻는 화면이 나타나면 “전체 선택”을 통해 설치를 진행하기 바란다.

↓설치메뉴를 이용해 손쉽게 설치할 수 있다.

[그림 2] SQL Express 2005부터 관리도구를 함께 제공한다

설치를 완료하였다면 먼저 일반 디스크에서의 데이터베이스 수행 능력을 확인해보자. 이를 위해 SQL 관리 도구에서 “새 쿼리” 아이콘을 누르고, 아래와 같이 내용을 입력하여 데이터베이스와 테이블을 생성하자.

createdb_nosql.sql
–데이터베이스를 생성한다.
USE masterGOCREATE DATABASE NoSQL ON PRIMARY (NAME = NoSQL, FILENAME = N’c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\NoSQL.mdf’)

[예제 1] 데이터베이스 생성 쿼리

NoSQL이라는 데이터베이스가 정상적으로 생성되었다면, 데이터베이스 리스트에서 “NoSQL”을 선택한 이후 “새 쿼리“을 눌러 진행하거나 아래와 같이 데이터베이스를 먼저 선택하고 10000개의 값을 생성한 테이블에 입력해 보자.

inserttable1.sql
–테이블을 생성하나 생성한다.
USE NoSQLGOCREATE TABLE tempdb_test1 (COMMENT VARCHAR(100))DECLARE @i INTSET @I = 1–100000개의 데이터를 입력

WHILE (@i <= 100000 )

BEGIN

insert into tempdb_test1 (comment) values (‘abcdefghijklmn’)

set @i = @i + 1

END

[예제 2] 100000의 내용을 입력하는 쿼리문

아래 그림은 위 조건을 실행했을 때 나타난 결과이다. 쿼리 실행 완료에 걸린 시간에 주목하자.

[그림 3] 테이블 작성과 데이터입력에 23초의 시간이 소요됐다

그럼 이제 메모리 드라이브를 생성해 해당 드라이브에서 테스트를 진행해보자.

무료 버전인 만큼 사용할 수 있는 기능이 많지 않다. 메뉴도 직관적이므로 쉽게 메모리 드라이브를 생성할 수 있으리라 믿는다. 단 “Enable NTFS Compression“이 기본적으로 체크되는데 디스크 색인 압축을 사용한다는 뜻이다. 이 옵션에 대해 체크를 해제한 후 디스크를 생성해 주도록 하자(체크하고 생성하였다면 디스크 정보에서 변경이 가능하다).

여기서 “플래시 메모리를 이용한 하드디스크인 SSD(Solid State Drive)와 같은 것이 아니냐”라고 생각할 수 있지만 램 디스크와 메모리를 이용해서 만들어낸 디스크는 큰 속도 차이를 보인다. 메모리 종류의 차이도 있지만, 각 드라이버들이 이용하는 버스 컨트롤러의 차이도 나타난다. SSD는 일반 하드디스크가 이용하는 SATA를 함께 이용하도록 제작되었다. 따라서 SATA의 버스 속도에 제한을 받게 된다. 그에 반해 물리 메모리는 CPU와 직접 통신하는 방식으로, CPU 내부에 존재하는 캐시 메모리 다음으로 속도가 빠르다(물론 메모리 타입에 따른 속도 차이도 존재한다). 따라서 SSD에 비해 물리 메모리를 이용한 램 디스크의 속도는 직접 테스트 해보면 몇 수십 배 이상 빠르다.

[그림 4] 램 디스크로 512MB를 할당하였다

그럼 먼저 어느 정도의 속도 차이가 있는지 간단한 Disk 벤치마크 도구를 이용하여 확인해 보도록 하자. 필자는 CrystalDiskMark를 이용하였다. 아래 사이트에서 다운로드 가능하다.

http://crystalmark.info/software/CrystalDiskMark/index-e.html

가상화 머신의 일반 디스크 이미지(필자는 가상화 머신을 이용해 테스트하였다)인 C 드라이브의 성능을 확인해 보자. 화면상의 All이라는 아이콘을 누르면 간단히 테스트를 진행할 수 있다. 필자의 경우 테스트는 최소 단위인 50MB 5회로 진행하였다.

[그림 5] 가상 머신의 일반 디스크 성능

이번에는 램 디스크인 E드라이브를 진행해보자.

MSSQL memory nosql

[그림 6] 램 디스크 성능

거의 10배 가량의 성능 차이를 보인다. SSD가 일반 디스크에 비해 2배 정도 빠르다고 보면, 램 디스크의 성능적 효과는 환상적이라 할 수 있다.

그리고 Vsuite의 Free 버전 이상 버전에서 제공하는 I/O 형식인 Direct IO 형식은 필자가 확인해본 결과 성능적 차이는 크지 않고 오히려 호환성 문제가 있어, 큰 도움은 되지 않는다.

추가로 램 디스크에 Enabe Image File을 체크하면, 생성한 램 디스크와 이미지 파일을 연결시켜 시스템 종료시 자동으로 지정한 이미지 파일로 백업을 진행하게 된다. 이를 통해 시스템을 재시작하여도 자동으로 램 디스크 내용을 저장하였다가 시스템 시작시 적용해 주어 데이터 유실에 대한 걱정을 덜 수 있다. 하지만 비정상적인 종료, 오류에는 대책이 없으니, 주의하기 바란다. 필자는 I/O 형식을 SCSI IO Disk 유형으로 선택하여 진행하여야 데이터베이스를 정상적으로 설치할 수 있다. 그럼 램 디스크인 E드라이브에 데이터베이스를 생성하도록 하자. 필자는 데이터베이스 이름을 Ramdb라고 하였다.

createdb_ramdb.sql
–데이터베이스를 생성한다.
USE masterGOCREATE DATABASE Ramdb ON PRIMARY (NAME = Ramdb, FILENAME = N’E:\Ramdb.mdf’)

[예제 3] 데이터베이스 생성 쿼리

Ramdb이라는 데이터베이스가 정상적으로 생성되었다면, 데이터베이스 리스트에서 “Ramdb”를 선택한 이후 “새 쿼리“을 눌러 진행하거나 아래와 같이 데이터베이스를 먼저 선택하고 10000개의 값을 생성한 테이블에 입력해 보자.

inserttable2.sql
–테이블을 생성하나 생성한다.
USE RamdbGOCREATE TABLE tempdb_test (COMMENT VARCHAR(100))DECLARE @i INTSET @I = 1–100000개의 데이터를 입력

WHILE (@i <= 100000 )

BEGIN

insert into tempdb_test (comment) values (‘abcdefghijklmn’)

set @i = @i + 1

END

[예제 4] 조금전 사용한 동일한 100000의 내용을 입력하는 쿼리문 실행

위 쿼리를 실행하면, 아래와 같이 향상된 처리 결과를 확인할 수 있다.

[그림 7] 6초 만에 동일 쿼리 실행 완료

기존 23초의 작업 결과가 6초로 단축되어 4배에 가까운 성능 향상을 가져왔다.

더욱 더 높은 성능을 위해서는 해당 데이터베이스의 트랜잭션 로그 파일을 물리적으로 다른 디스크에 설치하면 더욱 성능을 향상시킬 수 있지만 이 부분까지는 여기서 진행하지 않겠다.

이 외에도 1부에서 언급한 레이먼 강의자료인 MSSQL Truly Level 400 동영상에서 MAXDOP의 중요성과 Tempdb의 역할을 봤다면 Tempdb를 메모리 드라이브로 만들어 성능 개선을 진행해 볼 수도 있다. MSSQL에서 Tempdb는 쿼리 실행시 중간 결과를 저장하거나, 소팅(Sorting, 정렬), 해쉬 테이블을 만드는 임시 데이터베이스로서, 복잡한 쿼리 작업을 많이 처리하는 데이터베이스라면 TempDB를 램 디스크로 접목하기에 좋은 지점이라 할 수 있다(Tempdb개선은 데이터베이스 자체의 처리 속도 개선이며, 실제 부하 분산을 위해서는 웹 서버에서 ASP를 구성하여 진행하여야 한다. 이 부분에 대해서는 바로 다음에 다룬다).

만약 Tempdb에 적용하였다면 아래 쿼리를 이용해 Tempdb의 경로를 변경할 수 있다.

movetempdb.sql
USE master;

GO

ALTER DATABASE TEMPDB

MODIFY FILE (NAME = tempdev, FILENAME = ‘E:\TEMPDB.mdf’);

GO

ALTER DATABASE TEMPDB

MODIFY FILE (NAME = templog, FILENAME = ‘E:\templog.ldf’);

GO

[예제 4] Tempdb 경로 변경

Tempdb의 경로를 변경한 이후에는 데이터베이스 서비스를 재시작해주어야 적용된다(만약 자동 적용을 구성하고자 한다면, 시스템의 예약된 작업을 이용하여 구성하면 된다).

이 외에도 램 디스크를 개인 사용자들이 사용한다면, 인터넷 임시파일을 램 디스크를 이용하는 방법도 있다. 인터넷 익스플로러에서 인터넷 화면을 로딩할 때 사용하는 공간으로, 인터넷 로딩 속도 개선에 큰 효과를 볼 수 있다. 필자의 경우 Imdisk라는 공개 램 디스크 프로그램을 이용하여 인터넷 임시파일을 램 디스크로 지정해 사용한다. 드라이버가 가볍고, 호환성이 좋아 개인이 사용하기에는 편리하다. 본 도구는 다음 링크에서 다운로드 할 수 있다.

http://www.ltr-data.se/opencode.html/

(ImDisk Virtual Disk Driver에서 Download ImDisk install package를 통해 다운로드)

설치하면 시스템 환경변수를 자동 등록하여 Imdisk의 CLI 명령을 이용할 수 있다. 아래 명령을 배치파일로 생성하여 시작프로그램에 등록하면 시스템 등록시 자동으로 실행된다.

// 128MB 사이즈의 FAT 파일 시스템을 가진 디스크를 Z드라이브명으로 생성한다. 생성시 바로 빠른 포맷을 진행
imdisk –a –s 128m –p “/fs:fat32 /q/y” –m z:

그리고 인터넷 옵션을 변경하면 쉽게 램 디스크를 이용할 수 있다.

[그림 8] 인터넷 옵션을 램 디스크로 지정한다

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.