前言:压测数据库的选择工具sysbench,这个工具可以模拟几千个线程并发的访问数据库,模拟使用各种各样的SQL语句,模拟出来各种事务提交,模拟出几十万的TPS去压测数据库。
之前看到帖子Ubuntu系统可以直接apt安装:(亲测Ubuntu18.0.4可以)
- apt-get install sysbench
- sysbench --version 看到sysbench的版本号,就说明安装成功了。
但是。。
安装好了之后对ubuntu20构造数据run的时候会有问题
于是。。
apt-get remove sysbench 1.0.18 卸载
(apt-get remove只删除包的二进制文件。它不会触及配置文件)
一、安装 sysbench 1.0.20
首先下载 Sysbench源码。运行 wget https://github.com/akopytov/sysbench/archive/1.0.20.tar.gz
命令。
然后将文件重命名并解压缩。
mv 1.0.20.tar.gz sysbench.tar.gz
tar -zxvf sysbench.tar.gz
然后安装编译必须的文件,并编译。
sudo apt install -y automake
sudo apt install -y libtool
sudo apt install -y pkg-config
sudo apt install -y libmysqlclient-dev
cd sysbench-1.0.20/
./autogen.sh
./configure
sudo make -j
sudo make install
运行sysbench --version
查看版本
安装成功~~构造数据的时候必须进入lua目录 ,cd /usr/bin/sysbench-1.0.20/src/lua
不然使用run的时候就会提示找不到模块:
或者你真的不想进入目录,每次执行前也可以指明绝对路径,这样写的就有点长
(ps:Ubuntu 20 不支持安装yum,iostat,可以apt-get,iotop代替)
二、sysbench中Lua脚本详解
进入lua里面,里面存在大部分的脚本都会底层调用oltp_common.lua脚本里的函数stmt_defs的变量
读写性能测试语句
vi oltp_common.lua脚本里面查看
这个脚本相当于一个公共的函数库
-- 初始化
function init()
-- 创建表结构,获取c,pad字段随机字符串,插入数据,建立二级索引
function create_table(drv, con, table_num)
-- 创建表结构,表结构如下
-- CREATE TABLE `sbtest1` (
-- `id` int(11) NOT NULL AUTO_INCREMENT, # 主键
-- `k` int(11) NOT NULL DEFAULT '0', # 二级索引
-- `c` char(120) NOT NULL DEFAULT '',
-- `pad` char(60) NOT NULL DEFAULT '',
-- PRIMARY KEY (`id`),
-- KEY `k_1` (`k`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1
-- get_c_value() 获取字段c的值
-- get_pad_value() 获取字段pad的值
-- INSERT 语句插入到相关表,直到达到指定的table-size
-- 建立二级索引k
-- 获取字段c的值,返回一个随机字符串
function get_c_value()
-- 获取字段pad的值,返回一个随机字符串
function get_pad_value()
-- 初始化线程
function thread_init()
-- 关闭线程连接
function thread_done()
-- Close prepared statements
function close_statements()
-- 如果我们已经重新连接了,那么重新准备语句,
function sysbench.hooks.before_restart_event(errdesc)
-- close_statements() //Close prepared statements
-- prepare_statements() // This function is a 'callback' defined by individual benchmark scripts
-- 构造语句
function prepare_for_each_table(key)
-- 对应prepare命令
function cmd_prepare()
-- 对应prewarm命令
function cmd_prewarm()
-- 清理数据,把相关表都DROP掉
function cleanup()
-- 启动事务 BEGIN
function prepare_begin() //构造 BEGIN 语句
function begin() //执行 BEGIN 语句
-- 提交事务 COMMIT
function prepare_commit() //构造 BEGIN 语句
function commit() //执行 COMMIT 语句
-- 主键等值查询 SELECT c FROM sbtest? WHERE id = ? function prepare_point_selects() // 调用 prepare_for_each_table() 函数生成ponit_selects语句 function execute_point_selects() // 执行 prepare_point_selects() 生成的语句
-- 主键范围查询 SELECT c FROM sbtest? WHERE id BETWEEN ? AND ?
function prepare_simple_ranges() // 调用 prepare_for_each_table() 函数生成simple_ranges语句 function execute_simple_ranges() // 执行 prepare_point_selects() 生成的语句
-- 主键范围查询 + 求和 SELECT SUM(k) FROM sbtest? WHERE id BETWEEN ? AND ?
function prepare_sum_ranges() // 调用 prepare_for_each_table() 函数生成sum_ranges语句 function execute_sum_ranges() // 执行 prepare_point_selects() 生成的语句
-- 主键范围查询 + 排序 SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c function prepare_order_ranges()
function execute_order_ranges()
-- 主键范围查询 + 排序 + 去重 SELECT DISTINCT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c
function prepare_distinct_ranges()
function execute_distinct_ranges()
-- 二级索引上更新(k是二级索引) UPDATE sbtest%u SET k=k+1 WHERE id=? function prepare_index_updates() // 调用 prepare_for_each_table() 函数生成index_updates语句 function execute_index_updates() // 执行 prepare_point_selects() 生成的语句
-- 无索引的更新 UPDATE sbtest%u SET c=? WHERE id=? function prepare_non_index_updates()
function execute_non_index_updates()
-- 删除 DELETE FROM sbtest%u WHERE id=?
function prepare_delete_inserts() function execute_delete_inserts() // 执行 prepare_for_each_table 生成的语句
bulk_insert.lua 插入的lua脚本
-- 初始化线程
function thread_init()
-- 准备表结构
prepare()
-- CREATE TABLE IF NOT EXISTS sbtest%d (
-- id INTEGER NOT NULL,
-- k INTEGER DEFAULT '0' NOT NULL,
-- PRIMARY KEY (id))]], i))
-- 批量插入
event()
-- 关闭线程
thread_done(thread_9d)
-- 清理数据,DROP掉相关的表
cleanup()
oltp_delete.lua DELETE语句的lua脚本
-- 加载oltp_common脚本
require("oltp_common")
-- 构造DELETE语句
prepare_statements()
-- 执行DELETE语句
event()
oltp_read_only.lua 只读语句的Lua脚本
-- 加载oltp_common脚本
require("oltp_common")
-- 构造语句
prepare_statements()
-- prepare_point_selects() // 构造点查语句
-- prepare_begin() // 构造 BEGIN 语句
-- prepare_commit() // 构造 COMMIT 语句
-- prepare_simple_ranges() // 构造简单范围查询语句
-- prepare_sum_ranges() // 构造求和语句
-- prepare_order_ranges() // 构造排序语句
-- prepare_distinct_ranges() // 构造排序去重语句
-- 执行语句
event()
-- execute_point_selects() // 执行点查语句
-- execute_simple_ranges() // 执行简单范围查询语句
-- execute_sum_ranges() // 执行求和语句
-- execute_order_ranges() // 执行排序语句
-- execute_distinct_ranges() //排序去重语句
oltp_read_write.lua 读写的Lua脚本
-- 加载oltp_common脚本
require("oltp_common")
-- 构造语句
prepare_statements()
-- 读操作
-- prepare_point_selects() // 构造点查语句
-- prepare_begin() // 构造 BEGIN 语句
-- prepare_commit() // 构造 COMMIT 语句
-- prepare_simple_ranges() // 构造简单范围查询语句
-- prepare_sum_ranges() // 构造求和语句
-- prepare_order_ranges() // 构造排序语句
-- prepare_distinct_ranges() // 构造排序去重语句
-- 写操作
-- prepare_index_updates() // 构造更新索引操作语句
-- prepare_non_index_updates() // 构造更新无索引字段操作语句
-- prepare_delete_inserts() // 构造删除+更新操作语句
-- 执行语句
event()
-- 读操作
-- execute_point_selects() // 执行点查语句
-- execute_simple_ranges() // 执行简单范围查询语句
-- execute_sum_ranges() // 执行求和语句
-- execute_order_ranges() // 执行排序语句
-- execute_distinct_ranges() //排序去重语句
-- 写操作
-- execute_index_updates() // 执行更新索引操作语句
-- execute_non_index_updates() // 执行更新无索引字段操作语句
-- execute_delete_inserts() // 执行删除+更新操作语句
oltp_update_index.lua 更新索引字段操作的Lua语句
-- 加载oltp_common脚本
require("oltp_common")
-- 构造语句
prepare_statements()
-- prepare_index_updates()
-- 执行语句
event()
-- execute_index_updates(con)
oltp_update_non_index.lua 更新无索引字段操作语句
-- 加载oltp_common脚本
require("oltp_common")
-- 构造语句
prepare_statements()
-- prepare_non_index_updates()
-- 执行语句
event()
-- execute_non_index_updates()
oltp_write_only.lua 纯写语句的Lua脚本
-- 加载oltp_common脚本
require("oltp_common")
-- 构造语句
prepare_statements()
-- prepare_index_updates()
-- prepare_non_index_updates()
-- prepare_delete_inserts()
-- 执行语句
event()
-- execute_index_updates()
-- execute_non_index_updates()
-- execute_delete_inserts()
select_random_points.lua 随机点查脚本
-- 加载oltp_common脚本
require("oltp_common")
-- 准备阶段
prepare()
-- 线程初始化
thread_init()
-- 关闭线程
thread_done()
-- 执行相关SQL
event()
select_random_ranges.lua
-- 加载oltp_common脚本
require("oltp_common")
-- 准备阶段
prepare()
-- 线程初始化
thread_init()
-- 关闭线程
thread_done()
-- 执行相关SQL
event()
oints.lua 随机点查脚本
-- 加载oltp_common脚本
require("oltp_common")
-- 准备阶段
prepare()
-- 线程初始化
thread_init()
-- 关闭线程
thread_done()
-- 执行相关SQL
event()