Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
[Photo of the Author]
/글쓴이 : Mark Nielsen

글쓴이 소개:

글쓴이는 The Computer Underground, Inc.에서 일하는데 리눅스괴짜로 통한다. 멍청한 일을 재미있게 하고 바보같은 프로젝트를 만들기도 한다. 왜그렇게 하느냐고? 그렇게 하면 컴퓨터가 재미있지 않을까... Mark는 ZING,www.genericbooks.com에서 무료,공개 소프트웨어와 책자를 만드는데 자원봉사자로 일기도 하다.

순서:

리눅스에서 소형데이터베스의 속도 올리기

[Illustration]

Abstract:

This article shows how to speed up a PostgreSQL database server using a RAMDISK.



 

들어가는 글

먼저 RAMDISK가 무엇인지 그리고 어떻게 해서 PostgreSQL과 같은 데이터베이스 서버의 속도를 올리기 위해 사용할 수 있는지 살펴보자.

Ramdisk는 기본적으로 여러분의 메모리를 하드디스크 드라이브처럼 사용하는 것이다. 여러분이 ramdisk를 사용한다고 하면 하드 드라이브를 사용하는 것이 아니라 메모리를 사용하는 것이라는 얘기다. 여기에는 장단점이 함께 있다. 가장 큰 장점은 메모리를 사용하는 것이기때문에 여러분이 수행하고자 하는 작업을 하드디스크에서 사용할 때보다 매우 빠르게 수행 할 수 있다. 가장 큰 단점은 여러분의 데이터베이스에 변경사항이 발생했을때 컴퓨터가 재부팅된다면 이 변경사항을 모두 잃어버리게 된다. 이점은 데이터베이스의 무결성에 치명적인 단점으로 작용한다.

그렇지만 만약 PostgreSQL서버에서 모든 데이터베이스를 메모리에 읽어수행한다면 속도는 매우 빨라 질 것이다.  

/Test디렉토리에 ramdisk의 설정

여러분의 기본 ramdisk를 /Test 디렉토리에 설정하고자 한다면 다음과 같이 한다.

mkdir -p /Test
mkfs -t ext2 /dev/ram0
mount /dev/ram0 /Test
만약 초기설정값이 50메가의 크기를 변경하고자 할때는 다음과 같이 한다.
  1. 먼저 변경할 ramdisk의 크기를 결정해야 하는데 여기서는 50메가로 생각을 하자.
  2. /etc/lilo.conf파일을 수정한 다음 "lilo"명령을 반드시 실행한다. Lilo는 여러분의 컴퓨터에게 켜지기 시작할 때 어떻게 부팅과정을 수행할 것인지를 이야기해줄 뿐만 아니라 리눅스시스템에대하여 변경된 사항을 리눅스가 시작될 때 알려주는 프로그램이다. 나는 이 파일에 "ramdisk=50000"를 추가했다.
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    image=/boot/vmlinuz-2.2.5-15
            label=linux
            root=/dev/hda2
            read-only
            ramdisk=50000		
    		
  3. 이제 "lilo"명령을 수행한 다음 재부팅하면 된다. 컴퓨터가 재부팅된 다음 여러분은 다음 세줄의 명령어를 입력해야 한다.
    mkdir -p /Test
    mkfs -t ext2 /dev/ram0
    mount /dev/ram0 /Test
    

    매번 켤때마다 이 명령어를 입력하기 싫다면 /etc/rc.d/rc.local에 이 명령을 추가해도 된다.

 

PostgreSQL를 고려한 ramdisk의 설정

이론적으로 여러분은 두개의 데이터베이스 서버를 가지게 된다. 하나는 사용자가 변경할 수 있는 서버이고, 하나는 바로 ramdisk에 있는 서버이다. 이렇게 하기 위해서 "pg_dump"나 "pg_dumpall"명령을 이용해야 한다.

주석: 이 글에서는 이미 여러분의 데이터베이스 서버의 크기보다 훨씬 더 큰 크기를 가진 ramdisk가 이미 lilo.conf에 설정되어 있는 것으로 가정하고 이야기를 한다. 만약 어느정도 크기면 될지 알고 싶다면 "cd /var/lib/pgsql; du "명령을 이용하면 된다.

어쨌든 현재 "/var/lib/pgsql"에 설치되어 있는 postgresql서버를 메모리로 올리기 위해서는 다음과 같이 한다.

        ### 현재 postgresql서버를 중지시킨다.
/etc/rc.d/init.d/postgres stop
        ### 현재 디렉토리의 이름을 바꾼다.
mv /var/lib/pgsql /var/lib/pgsql_main
        #### ramdisk에 디렉토리를 생성한다.
mkdir -p /var/lib/pgsql_memory
 	#### 새로 만들어진 디렉토리의 소유자를 postgres나 
 	#### 실제 디렉토리 소유아이디로 변경한다.
chown postgres /var/lib/pgsql_memory
	#### 앨리어스를 만들거나 원래 이름(/var/lib/pgsql)과 연결시킨다.
ln -s /var/lib/pgsql_memory /var/lib/pgsql

	#### ramdisk를 포맷한다.
mkfs -t ext2 /dev/ram0
	#### ramdisk를 postgresql디렉토리에 마운트 시킨다.
mount /dev/ram0 /var/lib/pgsql_memory

	#### postgres의 디렉토리에 있는 모든 것을 ramdisk로 복사한다.
tar -C /var/lib/pgsql_main -cp . | tar -C /var/lib/pgsql_memory -xp
        ### postgresql서버를 가동시킨다.
/etc/rc.d/init.d/postgres start


 

속도에 대하여 몇마디만 더....

ramdisk에 postgresql을 올렸을 때와 안올렸을때의 속도차이를 검사해본 적이 있다. 어느때는 ramdisk에서 postgresql이 실행되고 있을때가 약 50%정도 속도가 빠른 경우도 있었지만 아닌 경우도 있었다.

그때 깨달은 사실은 데이터가 시스템에 의해 캐쉬되어져 성능값이 10%에서 20%정도로 밖에 향상되지 않았다는 것이다. 만약 하나씩만 존재하는 많은 량의 데이터들이 데이터베이스로 입력이 되면 그 성능은 극적으로 향상되게 된다.

ramdisk기법을 사용할 때 얻을 수 있는 가장 큰 장점은 데이터베이스가 하드드라이브에 접근하지 않고 바로 메모리에서 이용할 수 있다는 점이다. 만약 ramdisk를 사용하지 않는다면 데이터베이스는 아마 종종 캐쉬부족으로 스와핑작업을 수행하여 하드디스크로부터 새로 값을 불러 올 것이다.  

사족

  1. 리눅스운영체제에서 분명히 한번 파일이 읽어지면 메모리 공간이 다른 무엇인가에 의해 사용되기 전까지는 메모리상에 존재한다.바로 캐쉬가 되는 것이다. 이것은 하나의 해결방법이 될 수 있다. 그러나 실제 데이터베이스의 경우 필자의 데이터베이스서버에 한번 명령을 내릴때마다 하드가 계속 돌아가게 된다. ramdisk를 사용하면 데이터베이스를 메모리상에서 동작할 수 있도록 하기 때문에 스와핑 작업을 하지 않아도 된다. 만약 데이터베이스를 많이 사용한다면 메모리상에 올려놓고 작업하기를 바란다.
  2. ramdisk를 사용할 때 장점은 데이터베이스의 속도가 빠르고 산뜻하면서 단순하다는 점이다. 만약 읽기 전용의 데이터베이스 서버라면 이것은 정말 확실하고 산뜻한 해결방법이 될 것이다.
  3. ramdisk를 이용할 때 단점은 여러분이 관리하기 위하여 조금 더 공부를 해야 한다는 점이고 만약 데이터베이스에 변화가 생겼다면 반드시 백업을 수행해야 한다는 점이다.
 

참고

  1. How to use a Ramdisk for Linux /글쓴이: Mark Nielsen
  2. PostgreSQL홈페이지

리눅스포커스 편집자팀에서 관리합니다.
© Mark Nielsen
LinuxFocus 1999
번역 정보 :
en -> kr Lee Juho

1999-10-26, generated by lfparser version 0.8