앞의 글에서 내용을 이어나간다.

 

공식 문서를 적극 참고한다.

 

 

 

ycsb 를 이용하여 workload 를 실행하려면

 

총 6 단계를 거쳐야 한다.

 

 

  1. Set up the database system to test
  2. Choose the appropriate DB interface layer
  3. Choose the appropriate workload
  4. Choose the appropriate runtime parameters (number of client threads, target throughput, etc.)
  5. Load the data
  6. Execute the workload

 

 

 

< 1. Set up the database system to test >

 

ycsb 를 이용하여 테스트를 하기 전에 Database 시스템을 미리 손봐야 한다.

 

db를 미리 설치해두는 것은 물론이고,(이 포스트에서 db 설치 과정은 설명하지 않음)

 

단일 시스템에서 테스트할 지, 클러스터에서 테스트할 지도 정해야 하며,

 

db 내에, ycsb가 테스트를 하는데 필요한 테이블을 미리 만들어두어야 한다.

(예를 들어 mysql 의 경우, CREATE TABLE 명령을 이용하table 을 미리 만들어두어야 함)

 

ycsb는 이 테이블을 이용하여 여러 테스트들(insert, update, read 등)을 진행한다.

 

 

 

 

 

< 2. Choose the appropriate DB interface layer >

 

이해 안 가서 pass

 

 

 

 

 

< 3. Choose the appropriate workload >

 

적절한 workload 를 선택한다.

 

예를 들어, "나는 mysql 에서 1000만개의 데이터를 읽을 때 성능을 보고 싶다"

 

혹은, "나는 mysql 에서 데이터를 읽고 수정한 후 다시 쓰는 작업을 할 때의 성능을 보고싶다" 등의 workload 가 있다.

 

기본적으로 제공하는 workload 는 a, b, c, d, e, f(workload 이름들임) 총 6개가 있다.

 

core workloads 에 대한 공식 문서 

 

아래는 ycsb가 제공하는 표준 workloads 의 이름과 동작 방법이다.

(혹시 해석이 틀린 게 있다면 덧글 바람)

 

 

Workload A: Update heavy workload : 데이터의 50%를 db에서 읽고 50%를 db에 쓴다.

Workload B: Read mostly workload : 데이터의 95%를 db에서 읽고 5%를 db에 쓴다.

Workload C: Read only : 데이터의 100%를 db에서 읽는다.

Workload D: Read latest workload : 새로운 데이터를 db에 저장하고, 가장 최근에 저장된 데이터들을 읽는다.

Workload E: Short ranges : 각각의 데이터를 쿼리하는 대신, 어떤 좁은(혹은 짧은) 구간 내에 속하는 데이터들을 쿼리한다.

Workload F: Read-modify-write : 데이터를 읽고, 수정한 후, 그 수정된 데이터를 다시 db에 쓴다.

 

 

위의 workload 들의 % percentage 는 매개변수를 변경함으로써 직접 수정이 가능하다.

 

또한 이 표준 workloads 들로 만족되지 않는다면 workload를 직접 구현할 수 있다.

 

workload를 직접 구현하는 방법에 대한 공식 문서 

 

성능 테스트 하고 싶은 workload 를 선택했다면,

 

ycsb가 제공하는 load 와 run(나중에 다시 설명) 명령어 둘 다 적용된다는 점을 기억하자.

 

load 할 때 workload a 를 했다가, run 할 때 똑같은 workload a 대신 workload f 를 하지 말자는 말이다.

 

 

 

 

 

 

< 4. Choose the appropriate runtime parameters >

 

runtime parameters 를 직접 선택할 수 있다.

 

이를테면 -threads 옵션을 통해 숫자 parameter를 넣어서, ycsb 가 테스트할 때 사용되는 thread 의 개수를 조정할 수 있다.

 

-target 옵션을 통해 숫자 parameter 를 넣어서, ycsb가 초당 작업수를 조절할 수 있다.

 

여기서는 이렇게 parameters 를 이용하여 내가 원하는 환경을 조성 가능하다 정도만 알고 넘어가자.

 

참고 

 

 

 

 

 

 

 

 

 

5번 들어가기 앞서 알아두어야 할 것이 있다.

 

ycsb 가 db를 이용하여 테스트를 하는데 2 단계를 거친다.

 

  1. load 단계 : ycsb 가 테스트에 사용할 데이터를 db 에 저장하는 단계
  2. run 단계 : ycsb 가 load 단계에서 저장한 데이터를 이용하여 workload 를 실행하는 단계. transaction 단계라고도 함.

5번에서 load 단계에 대해, 6번에서 run 단계에 대해 알아본다.

 

 

 

 

< 5. Load the data >

 

사용자가 선택한 workload 를 테스트하기 앞서,

 

테스트에 사용할 데이터를 db 에 저장하는 단계이다.

 

간단한 명령어로 workload 에 따른 데이터를 db에 저장할 수 있다.

 

예를 들어 내가 workload a 를 선택하였고 이에 맞는 데이터를 basicDB에 저장하고 싶다고 하자.

 

아래 명령어를 사용하면 된다.

 

$ ./bin/ycsb load basic -P workloads/workloada 

 

 

load 는 데이터를 저장한다는 의미이고,

 

basic 은 db 이름이다.

 

-P는 옵션값(properties)이 적인 파일이나, workload 파일을 불러올 때 사용한다.

 

여기서 불러온 파일은 workloads path 내에 있는 workload a 파일이다.

 

이렇게 세팅한 명령어를 실행시키면 -P 옵션을 통해 workload a 를 불러오게 되고, workload a 에 맞는 데이터가 basic db에 저장된다.

 

직접 옵션값들을 적은 파일을 만들어서 -P 를 통해 불러와 적용시킬 수 있는 모양이다. 자세한 건 공식문서의 5번 참고.

 

어떤 옵션값들을 적용할 수 있는지 공식 문서의 core properties page 참고.

 

 

mongodb 예를 들어보자.

 

만약 workload c 를 선택하였고 이에 맞는 데이터를 mongodb 에 저장하고 싶다고 하자.

 

아래 명령어를 사용하면 된다.

 

$ ./bin/ycsb load mongodb -P workloads/workloadc

 

 

hbase 예를 들어보자.

 

만약 workload f 를 선택하였고 이에 맞는 데이터를 hbase 에 저장하고 싶다고 하자.

 

아래 명령어를 사용하면 된다.

$ ./bin/ycsb load hbase -P workloads/workloada -p columnfamily=family

 

-p 는 parameters 를 넣는데 사용된다.

 

hbase 는 db 에 columnfamily 를 지정해줘야하는 db이기 때문에 위의 명령어처럼 -p 옵션을 이용하여 지정해준다.

 

-p 로 넣을 수 있는 parameters 중 하나를 더 예로 들어보자면 recordcount 가 있다.

 

예를 들어 -p recordcount=491 이라는 paramters 를 넣으면,

 

load 할 때 넣는 레코드(데이터)의 양이 491 개가 된다(default 레코드 개수는 1000).

 

 

load 명령을 수행하고 나면 에러나 성공 등의 결과를 stdout(이게 뭔지 모르면, 터미널에 그대로 보여준다고 생각하자) 으로 보여주는데

 

에러 분석이나 로그 처리를 위해 파일로 따로 저장해두는 게 좋다고 한다.

 

예를 들면 아래처럼 load 명령어의 결과를 load.dat 이라는 파일로 저장해둔다.

 

$ ./bin/ycsb load basic -P workloads/workloada -P large.dat -s > load.dat

 

 

-s 을 붙임으로써 10초마다 "opertaion이 얼마나 일어나고 있는지" 를 log로 볼 수 있다.

 

이를 통해 시간이 얼마나 걸리는지 측정이 가능하겠다.

 

 

 

 

 

 

 

< 6. Execute the workload >

 

load 명령어를 통해 데이터가 db에 저장되면, run 명령어를 통해 그 db의 데이터를 이용하여 workload 를 진행한다.

 

예를 들어 basic db에 저장된 데이터를 이용하여 workload a 를 실행하고 싶다고 하자.

 

아래 명령어를 사용하면 된다.

 

$ ./bin/ycsb run basic -P workloads/workloada -P large.dat -s > transactions.dat

 

 

workload a 를 실행하고 난 뒤의 결과 log를 transactions.dat 파일로 따로 저장한다.

 

추가적으로 -P 옵션을 사용하여 large.dat 이라는 파일을 불러와 적용하였다.

 

large.dat 내용은 다음과 같다.

 

 

recordcount=491

threadcount=10
target=100

 

 

안의 내용을 해석해보면,

 

< large.dat 내용 >

recordcount=491 : 491 개의 레코드(데이터) 크기만큼만 read, scan, update 하라. (default recordcount 는 1000)

threadcount=10 : ycsb가 10개의 thread 를 이용하여 workload 하게 만들어라. (default thread 는 1)

target=100 : ycsb가 초당 100개의 작업만 하도록 제한하라.

 

위의 내용 그대로 -P large.dat 으로 불러와서 ycsb가 workload 를 실행할 때 적용시킨다.

 

 

load 명령을 했을 때 처럼, run 명령을 수행하고 나면 에러나 성공했을 시 workload 성능 측정 값 등의 결과를 stdout 으로 보여주는데

 

우리가 ycsb를 통해 궁극적으로 보고싶은 것이 바로 이 내용 되시겠다.

 

이것 역시 파일로 따로 저장해두는 게 좋겠다.

 

예를 들면 위의 명령어를 사용하면 run 명령어의 결과를 transaction.dat 이라는 파일로 저장하고 내용은 다음과 같다.

 

[OVERALL],RunTime(ms), 10110
[OVERALL],Throughput(ops/sec), 98.91196834817013
[UPDATE], Operations, 491
[UPDATE], AverageLatency(ms), 0.054989816700611
[UPDATE], MinLatency(ms), 0
[UPDATE], MaxLatency(ms), 1
[UPDATE], 95thPercentileLatency(ms), 1
[UPDATE], 99thPercentileLatency(ms), 1
[UPDATE], Return=0, 491
[UPDATE], 0, 464
[UPDATE], 1, 27
[UPDATE], 2, 0
[UPDATE], 3, 0
[UPDATE], 4, 0
...

 

 

workload 의 결과는 전체 실행시간, 평균 처리량, 평균/최대/최소 지연 시간, 95번째/99번째 percentile 지연시간 등이 포함되어 있다.

 

위 결과의 return 을 해석해보면, return code 는 "작업 성공"을 의미하는 0 이고

 

491 개의 데이터가 UPDATE 되었다.

 

464 개의 데이터가 0~1ms 사이에 처리되었고,

 

27개의 데이터가 1~2ms 사이에 처리되었다.

 

...라는 의미이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts