[설치]
1. 다운
#apt-get install sysbench 또는
#wget http://downloads.mysql.com/source/sysbench-0.4.12.5.tar.gz
2. 압축해제
#gzip -d sysbench-0.4.12.5.tar.gz
#tar xvf sysbench-0.4.12.5.tar
3. 설치
#cd sysbench-0.4.12.5
#./autogen.sh
#./configure --prefix=${SYSBENCH_HOME} --with-mysql-includes=${MYSQL_HOME}/include/mysql --with-mysql-libs=${MYSQL_HOME}/lib/mysql
#make
#make install
===========예외 케이스==============
<./autogen.sh 예외처리>
- aclocal 미존재하여 에러 발생시
#yum install automake
- libtoolize 미존재하여 에러 발생시
#yum install libtool
<./configure 예외처리>
-자신의 디렉토리에 맞게 명령어를 입력하면된다
(./configure --prefix=/usr/local --with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib64/mysql)
-헤더파일이 없을경우 make 실행하면 아래와 같은 에러가 발생한다.
<에러>
drv_mysql.c:35:19: error: mysql.h: No such file or directory
drv_mysql.c:36:26: error: mysqld_error.h: No such file or directory
-헤더파일을 설치해야 할 경우 mysql-devel 설치후 다시 ./configure 실행하고 make 할 것
#yum install mysql-devel
===================================
[I/O test]
#sysbench --num-threads=16 --test=fileio --file-total-size=2G --file-test-mode=rndrw prepare
#sysbench --num-threads=16 --test=fileio --file-total-size=2G --file-test-mode=rndrw run
[OLTP test]
<데이터적재>
>create database sbtest;
#sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 --mysql-user=root --mysql-password=cjsgkanwjr --mysql-socket=/var/lib/mysql/mysql.sock prepare
<테스트 시작1>
#sysbench --num-threads=16 --max-requests=100000 --test=oltp --oltp-table-size=1000000 --mysql-user=root --mysql-password=cjsgkanwjr --mysql-socket=/var/lib/mysql/mysql.sock --oltp-read-only run
<테스트 시작2>
#sysbench --num-threads=16 --max-time=60 --max-requests=100000 --test=oltp --oltp-table-size=1000000 --mysql-user=root --mysql-password=cjsgkanwjr --mysql-socket=/var/lib/mysql/mysql.sock --oltp-read-only=off --oltp-test-mode=complex run
<실행 옵션>
--oltp-table-size=[테이블-레코드-건수]
--num-threads=[동시-스레드-개수]
--max-requests=[쿼리-요청-개수]
--max-time=[테스트-시간] // 0이면 지정된 횟수만큼 모두 완료해야 종료, 그외는 초단위로 지정된 시간만큼 실행
--mysql-host=[호스트명]
--mysql-user=[DB-USER]
--mysql-password=[DB-USER-비밀번호]
--mysql-db=[테스트-데이터베이스명]
--mysql-table-engine=[테이블-엔진-종류]
--mysql-socket=[MySQL-소켓-파일-경로]
--mysql-port=[MySQL-포트-번호]
--oltp-test-mode=[simple|complex|nontrx] // simple 은 select만 하고, complex는 select,insert,delete,update 중 랜덤하게 실행
--oltp-read-only=[on|off]
Sysbench 설치
yum install -y mysql-devel tar xvfz sysbench-0.4.12.tar cd sysbench-0.4.12 ./autogen.sh ./configure --prefix=${SYSBENCH_HOME} --with-mysql-includes=${MYSQL_HOME}/include/mysql \ --with-mysql-libs=${MYSQL_HOME}/lib/mysql make make install |
Sysbench 옵션
일반옵션 --num-threads=N 사용하는 쓰레드 수 --max-requests=N 쿼리 요청 개수 --max-time=N 테스트 시간 --forced-shutdown=STRING --max-time 후에 강제종료여부 on/off ( 기본값 : off ) --thread-stack-size=SIZE 쓰레드당 스텍 사이즈 ( 기본값 : 32K ) --init-rng=[on|off] initialize random number generator [off] --test=STRING test to run --debug=[on|off] 디버깅 정보 출력 [off] --validate=[on|off] perform validation checks where possible [off] --help=[on|off] 도움말 출력 --version=[on|off] 버전 출력 --oltp-table-size 테이블 레코드 건수 Compiled-in tests: fileio - File I/O test cpu - CPU performance test memory - Memory functions speed test threads - Mutex locking / unlocking을 통해 Job Scheduler 성능 측정 mutex - Mutex performance test oltp - OLTP test (Point Query, Range Query, Sum, Order by, Group by, Distinct 등의 쿼리를 수행하여 OLTP 쿼리 성능 측정 fileio 모드 : --file-num 생성된 파일 수 : 기본값 128 --file-block-size 모든 I/O 작동에 사용하는 블록사이즈수 : 기본값 16K --file-total-size 파일의 총 크기 : 기본값 2G --file-test-mode 작업유형 ( seqwr, seqrewr, seqrd, rndrd, rndrw, rndwr ) : 기본값 required --file-io-mode I/O 모드 ( sync, async, fastmmap, slowmmap ) : 기본값 sync --file-async-backlog 쓰레드당 큐의 비동기화 동작 수 (only for --file-io-mode=async) : 기본값 128 --file-fsync-freq Do fsync() after this number of requests (0 - don't use fsync() ) : 기본값 100
--file-fsync-all Do fsync() after each write operation : 기본값 no
--file-fsync-end Do fsync() at the end of the test : 기본값 yes
--file-fsync-mode 동기화 사용 방법 ( fsync, fdatasync ) : 기본값 fsync
--file-merged-requests Merge at most this number of I/O requests if possible (0 - don't merge) : 기본값 0
--file-rw-ratio reads/writes ration for combined random read/write test : 기본값 1.5
|
File I/O 성능 측정
#sysbench --num-threads=16 --test=fileio --file-total-size=1G --file-test-mode=rndrw prepare sysbench 0.4.12: multi-threaded system evaluation benchmark 128 files, 8192Kb each, 1024Mb total Creating files for the test... ------------------------------------------------------------------------------------------- # sysbench --num-threads=16 --test=fileio --file-total-size=1G --file-test-mode=rndrw run sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 16 Extra file open flags: 0 128 files, 8Mb each 1Gb total file size Block size 16Kb Number of random requests for random IO: 10000 Read/Write ratio for combined random IO test: 1.50 Periodic FSYNC enabled, calling fsync() each 100 requests. Calling fsync() at the end of test, Enabled. Using synchronous I/O mode Doing random r/w test Threads started! Done. Operations performed: 5999 Read, 4001 Write, 12800 Other = 22800 Total Read 93.734Mb Written 62.516Mb Total transferred 156.25Mb (18.646Mb/sec) 1193.37 Requests/sec executed Test execution summary: total time: 8.3796s total number of events: 10000 total time taken by event execution: 46.8871 per-request statistics: min: 0.01ms avg: 4.69ms max: 223.05ms approx. 95 percentile: 38.94ms Threads fairness: events (avg/stddev): 625.0000/90.00 execution time (avg/stddev): 2.9304/0.41 |
MySQL DB OLTP(Online Transaction Processing) 성능 측정
/usr/local/mysql55/bin/mysql -utheswice -p mysql> create database sbtest; mysql> use sbtest; mysql> \q # sysbench --debug=off --mysql-host=themade.com --mysql-user=theswice --mysql-password=XXXX \ --test=oltp --oltp-table-size=1000000 prepare // 데이터 준비 sysbench 0.4.12: multi-threaded system evaluation benchmark No DB drivers specified, using mysql Creating table 'sbtest'... Creating 1000000 records in table 'sbtest'... ---------------------------------------------------------------------------------------- // 실행 회수 기반의 테스트(시간 관계없이 1000000번 요청 실행) # sysbench --debug=off --mysql-host=theswice.com --mysql-user=theswice --mysql-password=XXXX \ --test=oltp --oltp-table-size=1000000 --num-threads=10 --max-requests=100000 run // 실행 sysbench 0.4.12: multi-threaded system evaluation benchmark No DB drivers specified, using mysql Running the test with following options: Number of threads: 10 Doing OLTP test. Running mixed OLTP test Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases) Using "BEGIN" for starting transactions Using auto_inc on the id column Maximum number of requests for OLTP test is limited to 100000 Threads started! OLTP test statistics: queries performed: read: 1400000 // 읽기수(페이지수) write: 500000 other: 200000 total: 2100000 transactions: 100000 (195.92 per sec.) // 초당 트랜잭션 195건 deadlocks: 0 (0.00 per sec.) // 데드락 read/write requests: 1900000 (3722.43 per sec.) // 초당 쿼리 실행 3722건 other operations: 200000 (391.83 per sec.) // 기타 작업에 의한 초당 작업수 Test execution summary: total time: 510.4193s // 총시간(초) total number of events: 100000 // 이벤트수 total time taken by event execution: 5103.3788 // 이벤트 실행에 의한 총 시간 per-request statistics: min: 3.98ms avg: 51.03ms max: 628.10ms approx. 95 percentile: 90.11ms Threads fairness: events (avg/stddev): 10000.0000/57.31 // 이벤트(평균/표준편차) execution time (avg/stddev): 510.3379/0.00 // 실행시간(평균/표준편차) ----------------------------------------------------------------------------------------------- //실행 시간 기반의 테스트 (요청 수에 관계 없이 20초 동안 실행) ./sysbench --test=oltp --oltp-table-size=10000000 --num-threads=8 --max-requests=0 --max-time=20 \ --mysql-host=localhost --mysql-user=theswice --mysql-password=XXXX \ --mysql-db=THESWICEDB --mysql-table-engine=innodb --mysql-create-options= \ --mysql-socket=/tmp/mysql.sock \ --mysql-port=3306 \ --oltp-test-mode=complex \ --oltp-read-only=off run |
주의사항
1. Sysbench 용 데이터를 prepare 한 후, 처음 실행하는 benchmark는 Buffer pool이 Warming-up되지 않았을 수 있음
2. 테스트하고자 하는 것이 CPU-Bound인지 I/O-Bound인지 명확히 구분하여, Buffer pool 사이즈와 --oltp-table-size를 적절히 조절해야 한다.
일반적으로 InnoDB 스토리지 엔진 사용시, record건수가 10,000,000건인 경우 2.3G 정도의 ibd 파일이 생성되며,
100,000,000 건인 경우 23G 정도의 ibd 파일이 생성된다.
3. 이 테스트로 인해서 산출된 tpmC 값은 시스템의 특성(MySQL Configuration이나 RAID 및 디스크 설정, CPU, 메모리,...)에 따른 상대적인
값이므로, 동일 수준의 장비와 비교를 위한 수치만으로 고려해야 한다.
4. 매번 테스트 시나리오를 변경할 때에는, MySQL 서버를 재 시작시키는 것이 가장 좋으며,
재시작시에는
mysql> set global innodb_fast_shutdown=0;
shell$> mysqladmin -uroot -p shutdown
와 같이 Clean shutdown을 해주는 것이 테스트 간의 영향도를 최소화시킬 수 있는 방법이다.
H/W 혹은 MySQL DB 환경(버전, 파라미터)의 변경으로 성능 비교가 필요한 경우, sysbench를 이용해서 간단하게 시스템, DB 성능을 측정할 수 있다.
Sysbench는 Oracle로 인수된 MySQL AB社에서 개발한 프로그램이다.
sysbench는 아래와 같이 간단하게 설치가 가능하다.
# 다운로드 (sourceforge) http://sourceforge.net/projects/sysbench # 압축 해제 $ tar xfz sysbench-0.4.12.tar.gz $ cd sysbench-0.4.12 # Config 및 Make $ ./autogen.sh $ ./configure --prefix=/usr/local --with-mysql-includes=$MYSQL_HOME/include --with-mysql-libs=$MYSQL_HOME/lib $ make $ make install |
sysbench는 아래와 같은 항목으로 시스템과 MySQL DB의 성능을 측정한다.
(1) fileio - 디스크에 대한 sequential, random I/O 성능 측정
(2) cpu - 소수(prime number)를 이용한 연산으로 CPU 성능 측정
(3) memory - 메모리 I/O 성능 측정
(4) threads - Mutex locking / unlocking을 통해 Job Scheduler 성능 측정
(5) mutex - Mutex lock 속도 측정
(6) oltp - Point Query, Range Query, Sum, Order by, Group by, Distinct 등의 쿼리를 수행하여 OLTP 쿼리 성능 측정
테스트 항목별로 사용법에 차이가 나기 때문에, 자세한 사용법은 아래 메뉴얼을 참고하면 된다. ^^
http://sysbench.sourceforge.net/docs/
(예1) File I/O 성능 측정
# sysbench --num-threads=16 --test=fileio --file-total-size=1G --file-test-mode=rndrw prepare sysbench 0.4.12: multi-threaded system evaluation benchmark
128 files, 8192Kb each, 1024Mb total Creating files for the test... # sysbench --num-threads=16 --test=fileio --file-total-size=1G --file-test-mode=rndrw run sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options: Number of threads: 16
Extra file open flags: 0 128 files, 8Mb each 1Gb total file size Block size 16Kb Number of random requests for random IO: 10000 Read/Write ratio for combined random IO test: 1.50 Periodic FSYNC enabled, calling fsync() each 100 requests. Calling fsync() at the end of test, Enabled. Using synchronous I/O mode Doing random r/w test Threads started! Done.
Operations performed: 5997 Read, 4003 Write, 12800 Other = 22800 Total Read 93.703Mb Written 62.547Mb Total transferred 156.25Mb (42.731Mb/sec) 2734.80 Requests/sec executed
Test execution summary: total time: 3.6566s total number of events: 10000 total time taken by event execution: 4.9801 per-request statistics: min: 0.01ms avg: 0.50ms max: 211.79ms approx. 95 percentile: 0.03ms
Threads fairness: events (avg/stddev): 625.0000/149.44 execution time (avg/stddev): 0.3113/0.15 # sysbench --num-threads=16 --test=fileio --file-total-size=1G --file-test-mode=rndrw cleanup |
(예2) MySQL DB OLTP 성능 측정
# sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 --mysql-user=root --mysql-password=root --mysql-socket=/tmp/mysql.sock prepare sysbench 0.4.12: multi-threaded system evaluation benchmark
No DB drivers specified, using mysql Creating table 'sbtest'... Creating 1000000 records in table 'sbtest'... # sysbench --num-threads=16 --max-requests=100000 --test=oltp --oltp-table-size=1000000 --mysql-user=root --mysql-password=root --mysql-socket=/tmp/mysql.sock --oltp-read-only run sysbench 0.4.12: multi-threaded system evaluation benchmark
No DB drivers specified, using mysql Running the test with following options: Number of threads: 16
Doing OLTP test. Running mixed OLTP test Doing read-only test Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases) Using "BEGIN" for starting transactions Using auto_inc on the id column Maximum number of requests for OLTP test is limited to 100000 Threads started! Done.
OLTP test statistics: queries performed: read: 1400000 write: 0 other: 200000 total: 1600000 transactions: 100000 (872.40 per sec.) deadlocks: 0 (0.00 per sec.) read/write requests: 1400000 (12213.65 per sec.) other operations: 200000 (1744.81 per sec.)
Test execution summary: total time: 114.6259s total number of events: 100000 total time taken by event execution: 1832.5973 per-request statistics: min: 0.16ms avg: 18.33ms max: 16946.78ms approx. 95 percentile: 26.99ms
Threads fairness: events (avg/stddev): 6250.0000/917.83 execution time (avg/stddev): 114.5373/0.09 |
# 벤치마킹용 데이터베이스 및 계정 생성
create database sysbench;
create user sysbench@'%' identified by 'sysbench';
create user sysbench@'localhost' identified by 'sysbench';
create user sysbench@'127.0.0.1' identified by 'sysbench';
grant all on sysbench.* to sysbench@'%';
grant all on sysbench.* to sysbench@'localhost';
grant all on sysbench.* to sysbench@'127.0.0.1';
# Sysbench building
$ wget http://downloads.sourceforge.net/project/sysbench/sysbench/0.4.12/sysbench-0.4.12.tar.gz?use_mirror=cdnetworks-kr-1
$ tar xvfz sysbench-0.4.12.tar.gz
$ cd sysbench-0.4.12
$ ./autogen.sh
$ ./configure --prefix=${SYSBENCH_HOME} --with-mysql-includes=${MYSQL_HOME}/include/mysql --with-mysql-libs=${MYSQL_HOME}/lib/mysql
$ make
$ make install
# 테스트를 위한 준비 (테이블 및 데이터 생성)
# 주어진 데이터베이스에 테스트용 테이블(default 테이블명은 sbtest)을 생성하고, 주어진 건수 만큼 레코드를 Insert
# 테스트용으로 만들어진 데이터를 초기화하는 방법은 sysbench 도구를 이용해도 되지만, 간단히 "drop table sbtest;"명령으로 삭제해도 됨
${SYSBENCH_HOME}/bin/sysbench --test=oltp --oltp-table-size=[테이블-레코드-건수] \
--max-requests=[쿼리-요청-개수] --max-time=[테스트-시간] \
--mysql-host=[호스트명] --mysql-db=[테스트-데이터베이스명] --mysql-user=[DB-USER] --mysql-password=[DB-USER-비밀번호] \
--mysql-table-engine=[테이블-엔진-종류] --myisam-max-rows=[MyISAM인 경우-레코드-최대-건수]
--mysql-create-options= \
--mysql-socket=[MySQL-소켓-파일-경로] \
--mysql-port=[MySQL-포트-번호] \
--oltp-test-mode=[simple|complex|nontrx] \
--oltp-read-only=[on|off] \
prepare
예제)
./sysbench --test=oltp --oltp-table-size=10000000 --num-threads=8 \
--mysql-host=localhost --mysql-user=sysbench --mysql-password=sysbench \
--mysql-db=sysbench --mysql-table-engine=innodb --myisam-max-rows=10000000000 --mysql-create-options= \
--mysql-socket=/tmp/mysql.sock \
--oltp-test-mode=complex \
--oltp-read-only=off \
prepare
# 테스트 실행
${SYSBENCH_HOME}/bin/sysbench --test=oltp --oltp-table-size=[테이블-레코드-건수] --num-threads=[동시-스레드-개수] \
--max-requests=[쿼리-요청-개수] --max-time=[테스트-시간] \
--mysql-host=[호스트명] --mysql-user=[DB-USER] --mysql-password=[DB-USER-비밀번호] \
--mysql-db=[테스트-데이터베이스명] --mysql-table-engine=[테이블-엔진-종류] --mysql-create-options= \
--mysql-socket=[MySQL-소켓-파일-경로] \
--mysql-port=[MySQL-포트-번호] \
--oltp-test-mode=[simple|complex|nontrx] \
--oltp-read-only=[on|off] \
run
예제)
# 실행 회수 기반의 테스트 (시간 관계없이 10000번 요청 실행)
./sysbench --test=oltp --oltp-table-size=10000000 --num-threads=8 --max-requests=10000 --max-time=0 \
--mysql-host=localhost --mysql-user=sysbench --mysql-password=sysbench \
--mysql-db=sysbench --mysql-table-engine=innodb --mysql-create-options= \
--mysql-socket=/tmp/mysql.sock \
--mysql-port=20306 \
--oltp-test-mode=complex \
--oltp-read-only=off \
run
# 실행 시간 기반의 테스트 (요청 수에 관계 없이 20초 동안 실행)
./sysbench --test=oltp --oltp-table-size=10000000 --num-threads=8 --max-requests=0 --max-time=20 \
--mysql-host=localhost --mysql-user=sysbench --mysql-password=sysbench \
--mysql-db=sysbench --mysql-table-engine=innodb --mysql-create-options= \
--mysql-socket=/tmp/mysql.sock \
--mysql-port=20306 \
--oltp-test-mode=complex \
--oltp-read-only=off \
run
# 결과 분석
sysbench 0.4.12: multi-threaded system evaluation benchmark
...
OLTP test statistics:
queries performed:
read: 140014
write: 50005
other: 20002
total: 210021
transactions: 10001 (866.61 per sec.) ==> 초당 트랜잭션 866 건
deadlocks: 0 (0.00 per sec.)
read/write requests: 190019 (16465.61 per sec.) ==> 초당 쿼리 실행 16465 건
other operations: 20002 (1733.22 per sec.)
Test execution summary:
...
# 테스트시 주의 사항
- Sysbench 용 데이터를 prepare 한 후, 처음 실행하는 benchmark는 Buffer pool이 Warming-up되지 않았을 수 있음
- 테스트하고자 하는 것이 CPU-Bound인지 I/O-Bound인지 명확히 구분하여,
Buffer pool 사이즈와 --oltp-table-size를 적절히 조절해야 한다.
일반적으로 InnoDB 스토리지 엔진 사용시, record건수가 10,000,000건인 경우 2.3G 정도의 ibd 파일이 생성되며,
100,000,000 건인 경우 23G 정도의 ibd 파일이 생성됨 - 이 테스트로 인해서 산출된 tpmC 값은 시스템의 특성(MySQL Configuration이나 RAID 및 디스크 설정, CPU, 메모리,...)에
따른 상대적인 값이므로, 동일 수준의 장비와 비교를 위한 수치만으로 고려해야 한다. - 매번 테스트 시나리오를 변경할 때에는, MySQL 서버를 재 시작시키는 것이 가장 좋으며,
재시작시에는
mysql> set global innodb_fast_shutdown=0;
shell$> mysqladmin -uroot -p shutdown
와 같이 Clean shutdown을 해주는 것이 테스트 간의 영향도를 최소화시킬 수 있는 방법이다.
## 참고 사항 (oltp-test-mode 의 설정값에 따른 테스트 케이스의 SQL 내용)
simple
- ==> 단순히 아래 형태의 SELECT 쿼리만 실행
- [필수] SELECT c FROM sbtest WHERE id=N;
complex (advanced transactional)
- ==> 아래의 쿼리들중에서 M개를 선별하여 쿼리 실행
- [필수] BEGIN;
- [옵션] SELECT c FROM sbtest WHERE id=N;
- [옵션] SELECT c FROM sbtest WHERE id BETWEEN N AND M;
- [옵션] SELECT SUM(K) FROM sbtest WHERE id BETWEEN N and M;
- [옵션] SELECT c FROM sbtest WHERE id between N and M ORDER BY c;
- [옵션] SELECT DISTINCT c FROM sbtest WHERE id BETWEEN N and M ORDER BY c;
- [옵션] UPDATE sbtest SET k=k+1 WHERE id=N;
- [옵션] UPDATE sbtest SET c=N WHERE id=M;
- [옵션] DELETE FROM sbtest WHERE id=N;
- [옵션] INSERT INTO sbtest VALUES (...);
- [필수] COMMIT;