YCSB는 야후에서 만든 벤치마크인데, 원래 NoSQL 용으로 개발되었다.
하지만 많은 OLTP 논문에서 TPC-C를 비롯해 YCSB까지는 제시하고 있다.
실생활과 유사한 TPC-C는 반드시 필요한 것 같고, Read-Write ratio를 조절하는 것에 대한 차이는 YCSB로 제시한다.
나는 MySQL 8.4.5를 사용하고 있기 때문에 여기서 YCSB를 돌리는 과정을 글로 남겨본다.
두 가지 버전이 있는데, 하나는 brain frank cooper의 YCSB와 benchbase에 구현된 YCSB가 있다.
뭐가 원본인지는 모르겠지만... benchbase가 여러모로 범용성이 좋은 것 같아서 후자 추천!
[Brain Frank Cooper 버전]
0. 다운로드
- YCSB 다운로드
$ git clone https://github.com/brianfrankcooper/YCSB && cd YCSB && mvn -pl jdbc -am -DskipTests package
- Connector/J JAR 다운로드
$ cd YCSB
$ mvn org.apache.maven.plugins:maven-dependency-plugin:3.8.1:copy -Dartifact=com.mysql:mysql-connector-j:8.4.0 -DoutputDirectory=.
1. MySQL 환경 세팅
cd ~
BASE_DIR=`pwd -P`
echo "INIT MYSQL"
$BASE_DIR/mysql-8.4.5-build/bin/mysqld --defaults-file=$BASE_DIR/my.cnf --initialize-insecure --user=mysql --datadir=$BASE_DIR/mysql_data --basedir=$BASE_DIR/mysql-8.4.5
sleep 10
echo "RUN MYSQL"
$BASE_DIR/mysql-8.4.5-build/bin/mysqld --defaults-file=$BASE_DIR/my.cnf --datadir=$BASE_DIR/mysql_data & >/dev/null
sleep 20
echo "SET PASSWORD on MYSQL"
$BASE_DIR/mysql-8.4.5-build/bin/mysql -uroot mysql -e "CREATE DATABASE ycsb;"
$BASE_DIR/mysql-8.4.5-build/bin/mysql -uroot mysql -e "CREATE USER 'ycsb'@'%' IDENTIFIED BY 'ycsbpass';"
$BASE_DIR/mysql-8.4.5-build/bin/mysql -uroot mysql -e "GRANT ALL PRIVILEGES ON ycsb.* TO 'ycsb'@'%';"
$BASE_DIR/mysql-8.4.5-build/bin/mysql -uroot mysql -e "FLUSH PRIVILEGES;"
$BASE_DIR/mysql-8.4.5-build/bin/mysql -uycsb -pycsbpass ycsb < $BASE_DIR/YCSB/jdbc/src/main/resources/sql/create_table.mysql
$BASE_DIR/mysql-8.4.5-build/bin/mysqladmin -uroot shutdown
- 이때 create_table.mysql 파일을 보면 PK가 255 으로 선언되어 있는데, PK 길이 제한에 걸려서 191로 내렸다
- 만약에 실험을 여러번 진행할 거면 log, data 파일들을 백업해두자
2. YCSB 데이터 로드 및 실험 진행
# (예) JAR 경로 변수
JAR=./YCSB/mysql-connector-j-8.4.0.jar
# 1) 데이터 적재
# workload - 의미 없음
# fetchsize - select 시 한 번에 가져오는 row 수
# batchsize - insert 배치 row 개수
# recordcount - record 개수
cd YCSB
python3 bin/ycsb load jdbc \
-P workloads/workloada \
-s \
-p status.interval=5 \
-threads 32 \
-p db.driver=com.mysql.cj.jdbc.Driver \
-p db.url="jdbc:mysql://127.0.0.1:3306/ycsb?useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true" \
-p db.user=ycsb -p db.passwd=ycsbpass \
-p jdbc.autocommit=false \
-p jdbc.fetchsize=10 \
-p db.batchsize=1000 \
-p table=usertable \
-p recordcount=100000 \
-cp $JAR
# 2) 벤치마크 실행 (동시성/운영시간은 필요에 맞게 조정)
# workloada - R:W=50:50
python3 bin/ycsb run jdbc \
-P workloads/workloada \
-p status.interval=5 \
-p db.driver=com.mysql.cj.jdbc.Driver \
-p db.url="jdbc:mysql://127.0.0.1:3306/ycsb?useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true" \
-p db.user=ycsb -p db.passwd=ycsbpass \
-p jdbc.autocommit=false \
-p jdbc.fetchsize=10 \
-p db.batchsize=1000 \
-p table=usertable \
-p recordcount=100000 \
-p operationcount=200000 \
-threads 64 -target 0 \
-s \
-cp $JAR > new.log
- load 옵션은 insert만 진행하고 따로 update 같은 건 진행하지 않기 때문에 아무 workload나 줘도 됨
- run 명령어로 진행하는데, 스레드 수나 데이터 크기는 적절히 조절해서 사용하면 된다
옵션은 구글링하면 금방 나오니 패스
[Benchbase 버전]
0. Benchbase 설치
git clone --depth 1 https://github.com/cmu-db/benchbase.git
cd benchbase
./mvnw clean package -P mysql #여기서 에러 뜨면 maven 버전 확인
cd target
tar xvzf benchbase-mysql.tgz
cd benchbase-mysql
> 만약에 java 버전이 안 맞으면 아래 실행
cd benchbase
./mvnw -v
# Java version: 23.x 가 나와야 함
# 아니면 설치
# Ubuntu Pro 구독이 없으면 패키지를 받을 권한이 없다고 에러 뜨니까 아래 실행
sudo apt-get update
sudo apt-get install -y wget gpg apt-transport-https
wget -O- https://packages.adoptium.net/artifactory/api/gpg/key/public \
| sudo gpg --dearmor -o /usr/share/keyrings/adoptium.gpg
echo "deb [signed-by=/usr/share/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb focal main" \
| sudo tee /etc/apt/sources.list.d/adoptium.list
sudo apt-get update
scurl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install java 23.0.2-tem
sdk default java 23.0.2-tem
source "$HOME/.sdkman/bin/sdkman-init.sh"
./mvnw -v
1. MySQL 용 YCSB 데이터 로드
# 초기화 및 계정 생성은 위와 동일하고, table 명만 benchbase로 바꾸면 된다
java -jar benchbase.jar \
-b ycsb \
-c config/mysql/my_ycsb_config.xml \
--create=true \
--load=true \
--execute=false
10M row 로드 용 xml 파일은 아래 참고
my_ycsb_config.xml 내용
<?xml version="1.0"?>
<parameters>
<!-- Connection details -->
<type>MYSQL</type>
<driver>com.mysql.cj.jdbc.Driver</driver>
<url>jdbc:mysql://127.0.0.1:3306/benchbase?rewriteBatchedStatements=true&allowPublicKeyRetrieval=True&createDatabaseIfNotExist=true&sslMode=DISABLED</url>
<username>ycsb</username>
<password>ycsbpass</password>
<reconnectOnConnectionFailure>true</reconnectOnConnectionFailure>
<isolation>TRANSACTION_REPEATABLE_READ</isolation>
<batchsize>128</batchsize>
<!-- Scalefactor in YCSB is *1000 the number of rows in the USERTABLE-->
<!-- scalefactor: rows = scalefactor * 1000 (10000: 10M) -->
<scalefactor>10000</scalefactor>
<!-- Optional: Override the zipfian constant to modify the skew -->
<!-- <skewFactor>0.99</skewFactor> -->
<!-- The workload (로드에는 사용X) -->
<!-- terminals: 클라이언트 스레드 수 -->
<!-- time: 실행 시간 -->
<!-- rate: 목표 트랜잭션 처리율 (TPS limit = 10000) -->
<!-- weights: read, insert, scan, update, delete, read-modify-write 비율 -->
<terminals>1</terminals>
<works>
<work>
<time>60</time>
<rate>10000</rate>
<weights>50,5,15,10,10,10</weights>
</work>
</works>
<!-- YCSB Procedures declaration -->
<transactiontypes>
<transactiontype>
<name>ReadRecord</name>
</transactiontype>
<transactiontype>
<name>InsertRecord</name>
</transactiontype>
<transactiontype>
<name>ScanRecord</name>
</transactiontype>
<transactiontype>
<name>UpdateRecord</name>
</transactiontype>
<transactiontype>
<name>DeleteRecord</name>
</transactiontype>
<transactiontype>
<name>ReadModifyWriteRecord</name>
</transactiontype>
</transactiontypes>
</parameters>
2. YCSB 실행
java -jar benchbase.jar \
-b ycsb \
-c config/mysql/my_ycsb_config.xml \
--create=false \
--load=false \
--execute=true
- 결과는 /benchbase/target/benchbase-mysql/results 에 저장되고, summary 버전을 보면 된다
TPCC보다 더 단순하고 온전히 성능 체크에만 올인한 느낌의 벤치마크다.
benchbase 버전을 나중에 알아서 좀 억울했다... 훨씬 깔기도 편하고 결과도 친절한듯 ㅜㅜ...