2010년 5월 23일 일요일

MySQL성능측정2

Super-Smack(http://vegan.net/tony/supersmack/)은 MySQL벤치마킹툴이다.

특징으로는 다음과 같은 것이 있다.

  • MySQL과 PostgreSQL에서 동작
  • C++로 만들어졌으므로 쓸데없는 준비가 필요없다. (자바나 펄이면 MySQL용 드라이버가 필요), C의 AP를 사용해서 서버에 접속하므로 쓸 데 없는 잡음이 들어가지 않는다. 개조나 확장하기 쉬운 구조로 되어있다. 예를 들면 MySQL고유의 처리는 mysql-client.cc파일에 정리되어져 있으므로 이것을 참고로 Firebird대응도 가능할 것이다.
  • 시나리오 파일(smack파일)로 자유롭게 실행하는 쿼리를 여러개 지정할 수 있다.
  • 복수의 클라이언트를 가상으로 fork()로 생성하고 각 클라이언트(자식 프로세스)로 쿼리를 실행할 수 있다. 모든 클라이언트는 같은 시나리오로 동작한다.
  • 데이터(영문숫자)를 생성하는 툴이 부속되어있다.
  • 쿼리는 mysql_query()와 PQexec()를 실행. stored procedure는 사용하지 않음.
  • SELECT결과는 fetch하지 않는다.
■컴파일
소스를 풀어놓은 후 configure, make한다. MySQL를 지원하려면 --with-mysql, --with-mysql-lib=, --with-mysql-include=를 지정한다.

make한 후 super-smack(이것이 본체)라는 명령어와 gen-data(데이터 생성 툴)이라는 명령어가 생기게 된다.

■사용방법
super-smack -d {pg|mysql} 시나리오파일 [인수 [인수] ...]
(pg: postgresql, mysql:MySQL, 인수는 시나리오 파일에서 사용하는 변수($1, $2...)가 된다. )
gen-data [-n행수 또는 --num-rows=행수] [-f포맷 또는 --format=포맷]
데이터를 생성하는 명령어로 생성할 레코드 수 , 레코드의 포맷을 지정한다.

■시나리오 파일 기술
다음의 블럭을 기술한다. (main, client, query, dictionary, table )

  • main{} : 근간이 된다. 접속, 절단 그리고 어느 쿼리를 몇번이나 실행할 것인지 등의 기본이 되는 동작의 지시를 한다.
  • client{} : 여러개 정의가 가능하다. 접속정보나 쿼리단위 정의를 한다.
  • query{}: 여러개 정의가 가능하다. 쿼리를 실제로 기술하는 블럭이다.
  • dictionry{}:여러개 정의가 가능하다. 필수조건은 아니다. 쿼리에 부여하는 값을 룰을 기술한다.
  • table{}:여러개 정의가 가능하다. 필수조건은 아니다. 테이블의 존재를 체크해 없으면 생성한다. 또 레코드수를 체크해서 적으면 일단 테이블을 drop하고 테이블작성과 레코드 작성을 수행한다.
■결점
Super-Smack은 만능은 아니로 다음과 같은 결점도 있다.
  • 여러개의 연속되는 쿼리에서 같은 값을 사용할 수 없다. 예를 들어 SELECT * FROM tbl WHERE col=$dict; UPDATE tbl SET col2=xxx WHERE col=$dict; 처럼 연속되는 쿼리의 $dict에는 다른값이 들어 가 버린다.
  • 같은 쿼리내에서도 같은 값을 사용할 수 없다. SELECT $dict, $dict; 라고 해도 예를 들어 SELECT 1, 999;처럼 다른 값이 처리된다.
  • 전에 실행한 SELECT의 결과를 새로운 쿼리에서 사용할 수 없다. 예를 들어 SELECT price FROM item WHERE id=1; 에서의 price값을 재 사용할 수 없다.