'Performance'에 해당되는 글 2건

  1. 2009.04.14 IOMeter를 이용한 디스크 Performance 측정 (ext3 vs ext4) (1)
  2. 2008.10.20 MySQL InnoDB Table Space 관리하기
2009. 4. 14. 22:58

IOMeter를 이용한 디스크 Performance 측정 (ext3 vs ext4)

IOMeter는 OpenSource 용 디스크 성능 측정 도구입니다.
서버의 경우에 어떤 파일 시스템 또는 장비자체의 성능 비교를 하고자 할때 기준자료를 제시하기위해 사용하곤 합니다.
플랫폼으로는 Linux/Window 전부 제공하고 있지만 실제 성능 측정을 시작하고 정보를 모으는 Manager는 윈도우만 가능합니다.
(성능 측정을 하기 위한 Agent-dynamo는 Linux/Window 전부 존재하며, ioMeter.exe는 Manager역할로 테스트 Suite작성과 테스트 실행, 테스트 결과 수집등을 담당합니다.)

Project Page : http://www.iometer.org/
Download : http://www.iometer.org/doc/downloads.html
Document : http://www.iometer.org/doc/documents.html 

32비트 환경의 경우에는 binary가 제공되지만 64비트 환경은 binary가 제공되지 않는 관계로 Linux Ext3 vs Ext4의 성능 측정을 위해서 Source를 컴파일 하였습니다.

 

( 환경 구성 )

Manager Computer (192.168.0.10): Windows XP sp3,
성능 측정용 Computer (192.168.0.11): OpenSUSE 11.1 64bit(kernel 2.6.27.7-9)
RAM : 4G
Disk : W/D 250G SATA2 : sdb(ext3), Samsung 250G SATA2 : sda(ext4),
CPU : Intel Core2 Duo E6300(1.86G)

 

( 테스트 방법 )

1. IOMeter를 설치한다(Windows)

2. Linux 에 IOMeter Source를 컴파일 한다.

/iometer-2006_07_27.common-src/src> make -f Makefile-Linux.x86_64 all
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOGlobals.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c Pulsar.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOManager.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOManagerLinux.cpp
IOManagerLinux.cpp: In member function 'int Manager::Report_Disks(Target_Spec*)':
IOManagerLinux.cpp:167: warning: deprecated conversion from string constant to 'char*'
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOGrunt.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOTarget.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOTargetDisk.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOTargetTCP.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOPort.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOPortTCP.cpp
IOPortTCP.cpp: In destructor 'virtual PortTCP::~PortTCP()':
IOPortTCP.cpp:182: warning: deprecated conversion from string constant to 'char*'
IOPortTCP.cpp:183: warning: deprecated conversion from string constant to 'char*'
IOPortTCP.cpp: In member function 'virtual BOOL PortTCP::Disconnect()':
IOPortTCP.cpp:576: warning: deprecated conversion from string constant to 'char*'
IOPortTCP.cpp: In member function 'virtual BOOL PortTCP::Close()':
IOPortTCP.cpp:613: warning: deprecated conversion from string constant to 'char*'
IOPortTCP.cpp:614: warning: deprecated conversion from string constant to 'char*'
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c Network.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c NetTCP.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c ByteOrder.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOPerformanceLinux.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOTime.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFF                                    SET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOCQAIO.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOCompletionQ.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_REENTRANT -DNOMINMAX -c IOAccess.cpp
/usr/bin/g++ -O -Wall -D_GNU_SOURCE -DIOMTR_OSFAMILY_UNIX -DIOMTR_OS_LINUX -DIOMTR_CPU_X86_64 -DIOMTR_SETTING_GCC_M64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_REENTRANT -DNOMINMAX -o dynamo IOGlobals.o Pulsar.o IOManager.o IOManagerLinux.o IOGrunt.o IOTarget.o IOTargetDisk.o IOTargetTCP.o IOPort.o IOPortTCP.o Network.o NetTCP.o ByteOrder.o IOPerformanceLinux.o IOTime.o IOCQAIO.o IOCompletionQ.o IOAccess.o  -lrt -lpthread -g
/iometer-2006_07_27.common-src/src> ls -l dynamo
-rwxr-xr-x 1 xxxx users 147752 Jan 15 17:22 dynamo

 3. Linux의 dynamo Agent를 실행한다.(만일 원격에 있는 윈도우 테스트를 한다면 같은 명령어를 원격 윈도우에서 입력해주면 된다.)

./dynamo -i <io meter 실행할 컴퓨터 이름 또는 주소> -m <Manager 를 실행할 컴퓨터 이름 또는 주소>

./dynamo -i 192.168.0.10 -m 192.168.0.11

Fail to open kstat device file. You can ignore this warning
unless you are running dynamo on XSCALE CPU.

Command line parameter(s):
   Looking for Iometer on "192.168.0.10"

Sending login request...
   linux
   192.168.0.11 (port 40391)

4. Windows에서 Iometer.exe를 실행한다.

실행하면 Linux 콘솔창에는 접속이 되었다는 메시지가 뜬다.


Sending login request...
   linux
   192.168.0.11 (port 39722)
Successful PortTCP::Connect
  - port name: 192.168.0.10

*** If dynamo and iometer hangs here, please make sure
*** you use a correct -m <manager_computer_name> that
*** can ping from iometer machine. use IP if need.
   Login accepted.
Reporting drive information...
Set_Sizes: Open on "/sys/iobw.tst" failed (error No such file or directory).
Set_Sizes: Open on "/sys/kernel/debug/iobw.tst" failed (error Permission denied).
Set_Sizes: Open on "/dev/iobw.tst" failed (error Invalid argument).
Set_Sizes: Open on "/sys/fs/fuse/connections/iobw.tst" failed (error Permission denied).
Set_Sizes: Open on "/sys/kernel/security/iobw.tst" failed (error Permission denied).
Set_Sizes: Open on "/proc/sys/fs/binfmt_misc/iobw.tst" failed (error Permission denied).
  Physical drives (raw devices)...
Reporting TCP network information...
   done.

   윈도우에는 테스트 할수 있는 GUI창이 뜬다.


 

(테스트요소 구성)

1. 테스트 할 타겟드라이브를 설정한다.

2. 테스트 요소를 추가한다.

3. 테스트 요소를 설정한다.

4. 테스트 시간을 설정한다.

5. 테스트를 수행한다.

 

(테스트 결과)

아래의 결과를 보면 Ext4가 Ext3보다 성능상으로는 훨씬 앞서는것으로 나옵니다.

(Total I/O 는 46.71 vs 86.35, Response Time 은 83.58 vs 28.128)

안정성 및 복구 능력이 탁월한지는 더 지켜봐야겠지만, I/O가 많이 일어나는쪽에 도입을 해서 테스트해볼 필요가 있어보입니다.

새로운 커널이 나오면 적용을 하고 Ext4의 버그나 리포트도 꾸준히 봐야할것 같습니다.

 

Ext3

 

Ext4


OpenSUSE 11.1에 새로 도입된 요소중에 Ext4 파일 시스템이 지원이 있습니다.

마침 이 performance를 비교한 자료가 있는데 상당히 의미가 있네요.

하지만 SSD 를 기준으로 해서 비교한 자료라 SATA/IDE와 같은 디스크에서는 어떤 performance를 보여줄지는 모르겠지만, Ext4의 시스템 디자인 자체가 Ext3보다 더 나은 성능과 안정성을 증가시켰다고 하니(Ext4 is designed to provide better performance and increase reliability) 한번 적용해볼만 한듯 보입니다.

대용량의 Database 시스템에서는 항상 I/O의 성능 문제가 걸리는데 이 결과처럼 대용량에서 Ext3의 2배정도의 성능을 보여준다면 Ext4를 사용했을때 큰 이익을 얻을것으로 보입니다.
SATA Disk에서의 Ext3와 Ext4에서의 I/O Benchmark 해보려고 합니다.

원문 : http://arstechnica.com/journals/linux.ars/2009/01/12/super-fast-ext4-filesystem-arrives-in-ubuntu-9-04

차세대 리눅스의 Ext3 파일시스템은 Ext4가 최신 우분투 9.04 인스톨러 이미지에 포함되어 사용할수 있게 되었다. 지난달에 릴리즈된 Linux 2.6.28 커널에 포함된 Ext4는 공식적으로 안정되었다.

Ext4는 더 나은 성능(performance)와 신뢰성이 증가되도록 설계되어 1 엑사바이트(exabyte: 1,000,000,000,000,000,000)까지 최대 파일 시스템 크기가 증가되었고 fsck 동작을 수행할때 필요한 시간이 감소되었다.

 

리눅스 하드웨어 사이트는 Phoronix는 SSD(Solid-State Drive)를 이용하여 수행된 광범위한 Ext4의 성능 테스팅한 벤치마크 결과를 발표하였다. 대용량 파일에 대한 write 성능을 측정한 IOZone 테스트에서 꽤나 인상적인 결과들을 볼수 있다. 이 결과에서 Ext4의 완승을 볼수 있으며, XFS,JFX,ReiserFS, Ext3와 비교하여 매우 뛰어난 성능을 보여주고 있다. 새로운 파일 시스템은  the Intel IOMeter File Server Access Pattern Test 에서 또한 다른 시스템에 비하여 능가하는 성능을 보여준다.


Benchmark graph by Phoronix

만일 이러한 벤치마크를 직접 하고 싶다면, 최신의 우분투 9.04 일일 빌드 이미지와 Phoronix Test Suite를 설치하면된다.

 

추가) OpenSUSE 11.1의 경우에 커널 버젼이 2.6.27.7-9 이라서 정식으로 Ext4를 지원하지 않습니다.

우분투가 첫번째 지원 OS가 되는것인지도 모르겠군요.

그렇다고 OpenSUSE 11.1에서 Ext4를 사용하지 못하는 것이 아니라 사용하는 방법이 있습니다.

(http://www.ngohq.com/operating-systems/15197-opensuse-11-1-ext4.html)


출처 : http://blog.naver.com/kimbeast


Trackback 1 Comment 1
  1. 2009.10.17 17:47 address edit & del reply

    비밀댓글입니다

2008. 10. 20. 10:19

MySQL InnoDB Table Space 관리하기

1. What is Innodb Table space  ?

    - 그 동안  Myisam 방식으로 테이블 스페이스를 사용하던 mysql은 rollback 이 되지 않는다.

       다른 데이터베이스 와 달리  autocommit 이 자동으로 실행 하여 

       데이터 베이스의 트렌젝션시 발생되는 lock을 처리 하기 힘들었다.

   -  innodb는 오라클 처럼 shared tablespace ( ibdataN) 와 로그파일 (ib_logfileN ) 로 구성된다.

      로그파일은 트랜젝션들을 처리하는 오라클의 아카이브 로그 같이 생각 하면 된다.

 

2. Mysql의 주요 특징 

   참고 : Mysql Technical Reference fo Ver 5.0 : 16장  InnodB Configureation

  -  rollback 을 구현 할수 있다.

  -  transaction isolation Level

     : READ-UNCOMMITED, READ-COMMITED, REPEATABLE-READ, SERIALIZABLE

  - innodb_buffer_pool_size

    : MyIsam 방식과 달리 buffer poll을 이용하여 인덱스와 raw data를 캐싱한다.

      따라서 사용량이 많아 지면 tablespace  Disk I/O  가 그만큼 줄어 든다

      pool의 용량은 real memory의 80% 까지 줄수 있으나,  다른 어플리 케이션과 사용시

     너무 많이 주게 되면 운영 체제의 paging을 일으키게 된다.

     ( 참고로 오라클은 SGA 를 50%로 권고 한다)

     또 32bit 시스템의 경우 2 ~ 3.5G의 제한되므로 너무 많이 주면 안된다고 한다.

 - innodb_data_file_path

    아직 오라클 같이 Shared Table Space 를 온라인상에서 추가 하기 힘들다.  

    오직 my.cnf 환경 파일로 생성이 되고 변경 된다.

      형식

     innodb_data_file_path  = [파일위치1/]파일명1:파일1사이즈:autoextend:max:MAX파일 사이즈

     파일 간의 구분자는 ";" 이고 파일의 속성 구분자는 ":" 이며

     autoextend:max:2000M 는 맨마지막 파일에만 해당된다.

innodb_file_per_table

   를 사용하면 이전 isam 같이 데이터 베이스 폴더 안에 table_name.ibd 라는 파일이 생긴다.

   사용예는 다음과 같다.

    innodb_data_home_dir=/export/DATABASE/MyData

   innodb_data_file_path = ibdata1:500M;ibdata2:500M;ibdata3:500M;ibdata4:200M:autoextend:max:2000M

 

3. Innodb 관리

  3.1 테이블 rename

      RENAME TABLE old_db_name.tbl_name TO new_db_name.tbl_name;

  3.2 데이블 복구

       이전 백업 된 데이터 파일을 이용하여 복구 하는방법

     가) ALTER TABLE tbl_name DISCARD TABLESPACE; 

          -> 현재 tbl_name.ibd 를 삭제한다.

     나) 백업된 tbl_name.ibd 를 복사해온다.

     다) ALTER TABLE tbl_name IMPORT TABLESPACE;

  3.3 SHOW INNODB STATUS

  3.4 Adding and Removing InnoDB Data and Log Files

     >my.cnf<

        innodb_data_home_dir=/export/DATABASE/MyData

        innodb_data_file_path = ibdata1:500M:ibdata2:500M:ibdata3:500M:ibdata4:200M:autoextend:max:2000M

  3.5  Shared Table Space 용량 조정

       가) mysqldump로 innodb table을 백업 받는다.

       나) 서버를 중지

       다) 현재  사용중인  ibdata1  .. ibdataN 을 삭제 한다.

       라) 위의 환경 파일을 수정한다.

       마) 서버를 재구동 한다.

       바) dump 파일을 import 한다.

   3.6  로그파일 관리

    보통 다음 과 같은 디폴트 값을 사용하며

      # Set buffer pool size to 50-80% of your computer's memory
      set-variable = innodb_buffer_pool_size=70M
      set-variable = innodb_additional_mem_pool_size=10M

      # Set the log file size to about 25% of the buffer pool size
      set-variable = innodb_log_file_size=20M
      set-variable = innodb_log_buffer_size=8M

  3.2 테이블 스페이스 관리

    아직 오라클 같이 Shared Table Space 를 온라인상에서 추가 하기 힘들다.  

    오직 my.cnf 환경 파일로 생성이 되고 변경 된다.

    대량의 데이터 베이스 의 경우 3 ~ 4G 이상이 되는경우

    디폴트로 ibdata1:10M:autoextend 를 쓴다면 곤욕을 치르게 될것이다.

 

    다음과 같이 여러개의 파일을 이용하여 분산 하는 것을 추천 합니다.

    파일은 path을 이용 할수 도 있고 raw 디바이스를 이용 할수도 있습니다.

    /data1 .. /data4 를 각각 다른 디바이스라고 한다면 아래와 같이 사용하면 된다.

     innodb_data_home_dir=

    innodb_data_file_path = /data1/ibdata1:500M;/data2/ibdata2:500M;/data3/ibdata3:500M;/data4/ibdata4:200M:autoextend:max:2000M

  

    보통 백업을 위해서 오라클의 경우 500MB ~ 1GB로 데이터 파일 을 생성 하였다.

    그리고 200MB는 현재 사용량이 얼마인지 모르기 때문에 200MB -> 300MB가 되면

    다시 환경 파일을 수정하고 데이터 파일을 추가 하기 위한 방법이다.

      그러나 이것도 문제 가 많다는 것을 독자들도 알것이다.

    암튼 아직은 미약한 부분이 많다는 것을 착안 하기 바란다.

    데이처 파일을  500MB ~ 1GB로 생성 하는이유는

    예전에 OS에서 제한이 있어서 그런 적도 있었지만 , 파일이 크면 그 만큼  I/O분산이 안된다.

    그리고 파일당 백업 시간이 증가하거나 문제가 발생 하면  복구도 그만큼  힘들다.

   예로 500MB데이터 파일 하나가 사라진 경우와 1GB 데이터 파일 1개가 사라진 경우

    그안에 속한 데이터의 량은 곱절이 된다.

   즉 재난 을 최소화 하기 위해서라고 1GB이하로 쪼개는 것이 낳기 때문이다.

 

  그렇다고 3GB 되는 것을 100MB로 쪼개면  어떨까 performance에서  문제가 될것이다.

   그러므로 DBA의 적절한 선택이 필요하다.


Trackback 0 Comment 0