实验介绍:
YCSB(全称为Yahoo! Cloud Serving Benchmark),该性能测试工具由Java语言编写(在之前的MC文章中也提到过这个,如果没看过的读者可以去看看之前MC那一期),主要用于云端或者服务器端的数据库性能测试工具,其内部涵盖了常见的NoSQL数据库产品,如Cassandra、MongoDB、HBase、Redis等等。
MySQL数据库服务是一个完全托管的数据库服务,可使用世界上最受欢迎的开源数据库来部署云原生应用程序。它是百分百由MySQL原厂开发,管理和提供支持。
当然,本次实验所用到的平台还是衡山-2(HS-2)RISC-V通用主板,该主板是一款专为开发者设计的标准mATX主板,该主板最高支持128GB内存,通过类似PC的丰富的接口和较强的兼容性,赋予开发者桌面级的RISC-V开发体验。
HS-2主板搭载了一颗国产的服务器级RISC-V 64核处理器(SG2042)。SG2042是目前已量产的性能最高的RISC-V处理器,主要针对高性能计算领域需求设计,适用于科学计算、工程计算、AI计算、融合计算等大算力应用场景。
实验材料:
MySQL/MySQL源代码
一台SG2042服务器(HS-2)
TPCC源代码
YCSB源代码
JDK(本教程使用系统自带的JDK 11)
实验过程:
安装MySQL:
方式一:直接通过apt安装
sudo apt install mysql-server
方式二:编译安装(此路不通)
下载源码
wget
https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.34.tar.gz
如果wget太慢,可以先提前下载到电脑上,然后再传到服务器上。
解压并进入
tar -xzvf mysql-8.0.34.tar.gz
cd mysql-8.0.34/
mkdir build
cd build/
由于MySQL需要boost,而且直接下载boost比较慢,因此我们选择手动下载boost
https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.gz
解压
tar -xzvf boost_1_77_0.tar.gz
回到mysql的build文件夹下:
cd mysql-8.0.34/build/
运行cmake
sudo cmake .. -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci
-DENABLED_LOCAL_INFILE=ON -DWITH_SSL=system
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql/server -DMYSQL_DATADIR=/usr/local/mysql/data
-DMYSQL_TCP_PORT=3306 -DDOWNLOAD_BOOST=0
-DWITH_BOOST=/home/perfxlab01/boost_1_77_0/
编译并安装
sudo make -j64
结果提示SHM_Buffer.hpp上的代码报错,后来发现当时不支持RISC-V平台编译,因此在此建议还是通过包管理器安装mysql。
注意,如果是之前已经卸载并重装过mysql,如果出现sock无法访问,请参考:
https://stackoverflow.com/questions/70813122/getting-error-mysql-service-failed-because-the-control-process-exited-with-erro
如果提示mysql.cnf出错,只要执行以下命令即可修复。
sudo touch /etc/mysql/mysql.cnf(新建mysql.cnf文件)
sudo dpkg --configure -a(重新配置)
初始化设置:
sudo mysql_secure_installation
发现没有权限
进入mysql
sudo mysql
执行以下命令:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '[你想设置的密码]';
然后退出mysql shell
接下来我们运行YCSB测试
获取YCSB
https://hub.yzuu.cf/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-0.17.0.tar.gz
或
https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-0.17.0.tar.gz
如果wget下载太慢的话可以先在电脑上使用多线程下载工具下载到电脑上,然后上传到服务器上
传到服务器上后解压:
tar -xzvf ycsb-0.17.0.tar.gz
进入YCSB文件夹
cd ycsb-0.17.0/
由于YCSB使用的Java语言编写,因此我们还需要JDK。不过系统以已经提前提供了JDK11,因此无需另外安装JDK。
登录数据库,创建数据库和表:
create database ycsb;
use ycsb;
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
);
编辑db.properties
cd jdbc-binding/conf/
mv db.properties db.properties.bak
vim db.properties
db.properties内容如下:
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/ycsb
db.user=root
db.passwd=[你的密码]
然后下载所需要的数据库驱动
wget
https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-j-8.0.33.tar.gz
解压并将驱动安装到指定文件夹下:
tar -xzvf mysql-connector-j-8.0.33.tar.gz
cp mysql-connector-j-8.0.33/mysql-connector-j-8.0.33.jar ~/ycsb-0.17.0/jdbc-binding/lib/
载入数据:
bin/ycsb load jdbc -P workloads/workloada -P ./jdbc-binding/conf/db.properties
-cp ./jdbc-binding/lib/mysql-connector-j-8.0.33.jar
然后就是跑分时间:
bin/ycsb run jdbc -P workloads/workloada -P ./jdbc-binding/conf/db.properties
-cp ./jdbc-binding/lib/mysql-connector-j-8.0.33.jar
(上面两个步骤时间比较长,可以在等的时候顺便泡杯咖啡或者看一会番等等)
如果提示Python报错,那是因为YCSB使用的是Python 2代码,虽然有人试图将Python3支持与主仓库合并,但是却一直没有被合并进去(0.17.0依旧还是使用Python 2)。
先安装python2
sudo apt install python2
更改链接
sudo rm /usr/bin/python
sudo ln -s /usr/bin/python2 /usr/bin/python
测试一下:
python --version
如果提示Python 2.7.18那就说明已经成功将链接改到python 2了。
然后重新尝试执行载入数据并跑分
跑分结果:
[OVERALL], RunTime(ms), 1180970
[OVERALL], Throughput(ops/sec), 84.67615604122035
[TOTAL_GCS_Copy], Count, 127
[TOTAL_GC_TIME_Copy], Time(ms), 2214
[TOTAL_GC_TIME_%_Copy], Time(%), 0.18747300947526185
[TOTAL_GCS_MarkSweepCompact], Count, 6
[TOTAL_GC_TIME_MarkSweepCompact], Time(ms), 526
[TOTAL_GC_TIME_%_MarkSweepCompact], Time(%), 0.044539658077681905
[TOTAL_GCs], Count, 133
[TOTAL_GC_TIME], Time(ms), 2740
[TOTAL_GC_TIME_%], Time(%), 0.23201266755294375
[READ], Operations, 49947
[READ], AverageLatency(us), 1485119.70881134
[READ], MinLatency(us), 20192
[READ], MaxLatency(us), 66584575
[READ], 95thPercentileLatency(us), 3217407
[READ], 99thPercentileLatency(us), 3725311
[READ], Return=OK, 49947
[CLEANUP], Operations, 100
[CLEANUP], AverageLatency(us), 207285.48
[CLEANUP], MinLatency(us), 4828
[CLEANUP], MaxLatency(us), 6111231
[CLEANUP], 95thPercentileLatency(us), 999935
[CLEANUP], 99thPercentileLatency(us), 1299455
[UPDATE], Operations, 50053
[UPDATE], AverageLatency(us), 609746.7518030887
[UPDATE], MinLatency(us), 22224
[UPDATE], MaxLatency(us), 2666495
[UPDATE], 95thPercentileLatency(us), 1309695
[UPDATE], 99thPercentileLatency(us), 1539071
[UPDATE], Return=OK, 50053
总结:
从跑分结果来看,SG2042在数据库应用方面还是比较不错的,但是由于YCSB使用的是Python 2,而Python 2已于2020年1月1日停止支持,因此也希望YCSM尽快迁移到Python 3上。
参考资料:
MySQL中文官网:
https://www.mysql.com/cn/
YCSB的jdbc文档
https://github.com/brianfrankcooper/YCSB/tree/master/jdbc
Port ycsb to Python3 and also make it Python2 compatible #1421(Github)
https://github.com/brianfrankcooper/YCSB/pull/1421
MySQL server fails to build on RISC-V 64
https://bugs.mysql.com/bug.php?id=100356