logo
Tags

Yingyu's Magic World

Linux YCSB Benchmark

[YCSB] 使用YCSB对数据库性能测试

场景:在Liunx下配置运行YCSB基准(以对接数据库mysql为例,基于jdbc引擎)

简介

Yahoo! Cloud Serving Benchmark (YCSB) 是一个Java语言实现的主要用于云端或者服务器端的数据库性能测试工具。

前置步骤:下载配置mysql

参考在Ubuntu 22.04 LTS上安装MySQL

前置步骤2:配置ycsb

使用YCSB对数据库性能测试

官网 https://github.com/brianfrankcooper/YCSB/tree/master/jdbc 教程参考https://piaohua.github.io/post/mysql/20220723-ycsb/

部署YCSB

下载ycsb代码

curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-0.17.0.tar.gz 
tar xfvz ycsb-0.17.0.tar.gz 
cd ycsb-0.17.0

(github不稳定,通过Windows直接下载压缩包后传到服务器上替代)

选择合适的绑定(Binding)此处以jdbc-binding为例

250722-image1 查看当前目录可以看到-binding都是可以选择的,对应不同的数据库场景。 250722-image2

250722-image3

修改ycsb配置

vi /root/xyy/ycsb-0.17.0/jdbc-binding/conf/db.properties

250722-image4

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1:3306/ycsb
db.user=root
db.passwd=123456

创建test数据表,创建新的dataset

SHOW DATABASES;

250722-image5

CREATE DATABASE test;
USE test;
CREATE TABLE usertable (
	YCSB_KEY VARCHAR(255) PRIMARY KEY,
	FIELD0 TEXT, FIELD1 TEXT,
	FIELD2 TEXT, FIELD3 TEXT,
	FIELD4 TEXT, FIELD5 TEXT,
	FIELD6 TEXT, FIELD7 TEXT,
	FIELD8 TEXT, FIELD9 TEXT
);

选择jdbc驱动,安装下载mysql-connector-java-j-8.0.33.jar

在官网https://downloads.mysql.com/archives/c-j/下载合适的版本

250722-image6

这里以8.0.33版本为例 Windows下载后可以直接复制到服务器上 250722-image7

创建临时目录

mkdir temp-deb && cd temp-deb

将下载的包解压

ar x ~/xyy/mysql-connector-j_8.0.33-1ubuntu20.04_all.deb
tar -xf data.tar.xz
find . -name "*.jar"

250722-image8

移动jar包到ycsb目录下

cp ./usr/share/java/mysql-connector-j-8.0.33.jar ~/xyy/ycsb-0.17.0/jdbc-binding/lib/

配置好后就可以运行workload

250722-image9

修改数据库datadir(用于对比测试不同ssd上的性能)

1.修改配置文件

需要修改

vi /etc/mysql/mysql.conf.d/mysqld.cnf

里面的datadir

以及apparmor的配置文件

vim /etc/apparmor.d/usr.sbin.mysqld

修改后执行

service apparmor restart

Ps: 企业级盘数据库datadir = /mnt/test_ssd/mysql_data/

消费级datadir =/mnt/test_ssd_1602/mysql/

apparmor设置:

企业级

# Allow data dir access
#  /var/lib/mysql/ r,
#  /var/lib/mysql/** rwk,
  /mnt/test_ssd/mysql_data/ r,
  /mnt/test_ssd/mysql_data/** rwk,

手动初始化数据库命令:

sudo mysqld --initialize --user=mysql --datadir=/mnt/test_ssd/mysql_data

消费级

#  /var/lib/mysql/ r,
#  /var/lib/mysql/** rwk,
#  /mnt/test_ssd/mysql_data/ r,
#  /mnt/test_ssd/mysql_data/** rwk,
/mnt/test_ssd_1602/mysql/ r,
/mnt/test_ssd_1602/mysql/** rwk,

手动初始化数据库命令:

sudo mysqld --initialize --user=mysql --datadir=/mnt/test_ssd_1602/mysql

2.修改后刷新,重启mysql服务

sudo systemctl stop mysql
sudo systemctl start mysql

详情见“手动测试,重启服务”

3.修改workload文件,增加并发以及唯一性

例如:

vi /root/xyy/ycsb-0.17.0workloads/workloada

250722-image10

threadcount只并发线程,需要增加insertorder=hased 以及参数-p insertstart=0来避免Duplicate entry Error 如下:

Error in processing insert to table: usertablejava.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'user8753205170136912308' for key 'usertable.PRIMARY'
Error inserting, not retrying any more. number of attempts: 1Insertion Retry Limit: 0

手动测试,重启服务

关闭

sudo systemctl stop mysql

开启

sudo systemctl start mysql

systemctl start mysql失败

250722-image11

mysqld –initialize遇到问题

(py310) root@flyslice-System-Product-Name:~/xyy/test-mount# mysqld --initialize.
... Failed to set datadir to '/root/xyy/test-mount/mysql/' (OS errno: 13 - Permission denied)

原因是没有权限

sudo chown -R mysql:mysql /root/xyy/test-mount/mysql/
sudo chmod -R 755 /root/xyy/test-mount/mysql/
namei -l /root/xyy/test-mount/mysql/

250722-image12 建议mount到别的目录比如/mnt下,/root下权限会有问题。

遇到问题OS errno 17 - File exists:

250722-image13

原因是因为apparmor

参考 https://www.cnblogs.com/linxiyue/p/8229048.html

250722-image14

修改

vim /etc/apparmor.d/usr.sbin.mysqld

然后重启apparmor应用更新

service apparmor restart

记得加上权限

sudo chown -R mysql:mysql /mnt/test_ssd/mysql_data
sudo chmod -R 755 /mnt/test_ssd/mysql_data

检查结果,重新生成数据库需要的是数据,成功了。

sudo rm -rf /mnt/test_ssd/mysql_data/*
sudo mysqld --initialize --user=mysql --datadir=/mnt/test_ssd/mysql_data

ls -la /mnt/test_ssd/mysql_data

250722-image15

可以重启mysql了。

sudo systemctl start mysql

查看随机密码

tail /var/log/mysql/error.log

250722-image16

sudo mysql -uroot -p
Bu-Jn-&5IpOv

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

进入mysql检查,成功修改挂载目录。

sudo mysql -uroot -p
123456
SHOW VARIABLES LIKE 'datadir';

250722-image17 250722-image18 250722-image19

最终测试参数

Load

bin/ycsb load jdbc -P workloads/workloada -P jdbc-binding/conf/db.properties   -cp mysql-connector-java-8.0.33.jar   -p recordcount=1000000   -p insertstart=0 -s > enterprise_load.log

Run

bin/ycsb run jdbc -P workloads/workloada -P jdbc-binding/conf/db.properties   -cp mysql-connector-java-8.0.33.jar   -p recordcount=1000000   -p insertstart=0 -s > enterprise_run.log

注: 250722-image20

运行完一次benchmark后需要清除数据库重新生成文件,以防重复key错误。

SELECT COUNT(*) FROM usertable;

250722-image21

进入mysql,输入

TRUNCATE TABLE usertable;

或直接输入shell

export MYSQL_PWD="123456"
mysql -u root -e "USE test; TRUNCATE TABLE usertable;"

查看生成的表格数量

mysql -u root -e "USE test; SELECT COUNT(*) FROM usertable;"

场景2:在Liunx下配置运行YCSB基准(以对接数据库rocksdb为例,基于rocksdb-binding)

rocksdb多用于存储元数据,作为底层性能测试更为合适。

步骤

参考官网步骤

重新克隆YCSB库

git clone https://github.com/brianfrankcooper/YCSB.git

克隆不下来网络不稳定用以下代替

git clone --depth 1 https://github.com/brianfrankcooper/YCSB.git

通过mvn编译rocksdb-binding

cd YCSB
mvn -pl site.ycsb:rocksdb-binding -am clean package

前置条件:maven、python软连接

maven安装

需要用系统默认安装maven包

apt install maven

mvn修改换源

查找setting.yml位置

find / -name "setting.yml"

250722-image24

vi /etc/maven/settings.xml

250722-image25

<mirrors>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
</mirrors>

250722-image26

验证配置:

mvn help:effective-settings

250722-image27

再次运行mvn即可。

需要软连接python3到python

sudo ln -s /usr/bin/python3 /usr/bin/python

250722-image22

250722-image23

运行benchmark

250722-image28