강좌 & 팁
글 수 2,412
2011.07.11 03:32:06 (*.138.143.120)
39670
하드디스크의 퍼포먼스와 관련한 세팅값에 대한 내용을 찾아 본다.
먼저 ext3 의 파일 시스템은 세가지 기본 모드를 가지고 있다
mount 시에 사용하는 파라미터 중에
mount -t ext3 data=xxxxx /dev/hdxn /target
이러한 형식에서 xxxxx 에 해당하는 것이 파라미터인데
그 내용은 아래의 세가지이다.
data=writeback
data=ordered
data=journal
비정상적 종료시 디스크 내용은 복구가 가능한 것은 journal 모드인데
기본적으로는 ordered 모드이다. 따라서 마운트시에 journal 모드를 사용한다.
이에 따른 성능문제는 단편적인 쓰기 테스트에서는 드러나지 않는다.
또한 크기에 따른 성능의 차이는 크게 두드러지지 않았다.
16개의 쓰레드에서 쓰기 수행에 대한 성능은 아래와 같았다.
각각의 쓰레드는 아래와 같은 크기의 데이타를 쓰는 횟수에 따라 수행시간을 계산하였다.
한쓰레드에서 64 메가 바이트를 쓰는 것이었고
평균 쓰기 속도는 대략 초당 20메가 바이트 였다.
ext3 파일 시스템의 data=ordered 모드
패킷 크기 횟수 시간
128K 512 47/45/51
64K 1024 54/47/43
32K 2048 48/47/47
16K 4096 48/48/48
8K 8172 48/48/48
4K 16384 44/44/44
이러한 성능에도 불구하고 쓰기지연에 따른 버퍼 엠프티 현상은 일어 나게 된다.
/proc/sys/vm 디렉토리에는
-rw-r--r-- 1 root root 0 Mar 6 13:53 block_dump
-rw-r--r-- 1 root root 0 Mar 6 13:53 dirty_background_ratio
-rw-r--r-- 1 root root 0 Mar 6 13:53 dirty_expire_centisecs
-rw-r--r-- 1 root root 0 Mar 6 13:53 dirty_ratio
-rw-r--r-- 1 root root 0 Mar 6 13:53 dirty_writeback_centisecs
-rw-r--r-- 1 root root 0 Mar 6 13:53 laptop_mode
-rw-r--r-- 1 root root 0 Mar 6 13:53 lowmem_reserve_ratio
-rw-r--r-- 1 root root 0 Mar 6 13:53 max_map_count
-rw-r--r-- 1 root root 0 Mar 6 13:53 min_free_kbytes
-r--r--r-- 1 root root 0 Mar 6 13:53 nr_pdflush_threads
-rw-r--r-- 1 root root 0 Mar 6 13:53 overcommit_memory
-rw-r--r-- 1 root root 0 Mar 6 13:53 overcommit_ratio
-rw-r--r-- 1 root root 0 Mar 6 13:53 page-cluster
-rw-r--r-- 1 root root 0 Mar 6 13:53 swap_token_timeout
-rw-r--r-- 1 root root 0 Mar 6 13:53 swappiness
-rw-r--r-- 1 root root 0 Mar 6 13:53 vfs_cache_pressur
와 같은 파일들이 있으며 이 파일들은 버퍼링된 디스크 내용을 다루는 파라미터들이다.
이중에 현재 관심이 있는 것은 dirty_writeback_centisecs 로써
이것은 pdflush의 버퍼 flush 주기이다..
매우 바쁜 IO 를 갖는 시스템은 flush 하는 주기가 빨라야 더 효율적이므로 ,
이 주기가 기본적으로는 500 이다. 즉 5초이다.
그러나 이주기를 100 으로 바꾸어 적용하면 디스크에 쓰기 주기가 빨라지게 된다..
서버의 경우는 이 주기가 30초인데 쓰기 데이타가 많고 버퍼가 크면 "쓰기 폭풍" 이라는
대량의 데이타를 한꺼번에 쓰게 되는 현상이 일어나게 된다.
이런 경우에도 이런 파라미터를 조절함으로써 방지할수 있게 된다.
io 모드에서 32bit io 모드를 사용하도록 한다. (디폴트 16비트)
[root@hda]$ hdparm -c /dev/discs/disc0/disc
/dev/discs/disc0/disc:
IO_support = 0 (default 16-bit)
[root@DRON1600 hda]$ hdparm -c1 /dev/discs/disc0/disc
/dev/discs/disc0/disc:
setting 32-bit IO_support flag to 1
IO_support = 1 (32-bit)
한꺼번에 16페이지씩 읽도록 세팅한다. (디폴트 1페이지)
[root@hda]$ hdparm -t /dev/discs/disc0/disc
/dev/discs/disc0/disc:
Timing buffered disk reads: 64 MB in 4.34 seconds = 14.75 MB/sec
[root@hda]$ echo "multcount:16" > settings
[root@hda]$ hdparm -t /dev/discs/disc0/disc
/dev/discs/disc0/disc:
Timing buffered disk reads: 64 MB in 3.07 seconds = 20.85 MB/sec
보는 것처럼 읽기 수행 속도가 약 14.74MB/sec -> 20.85MB/sec 로 향상되었다.
리눅스는 커널 파라미터가 대부분 가장 안정적인 기본값을 갖고 동작한다.
용도에 따라서 이런 값들을 튜닝하여야 하는데 임베디드 리눅스에서는 커널에 대한
튜닝을 데스크탑과 같이 하는 경우가 없기 때문에 이런 내용들을 모아 스크립트로
동작하게 한다면 동일 시스템에서도 성능의 향상을 가져오게 된다.