1 sysbench安装
1.1 下载解压
yum install gcc gcc-c++ automake make libtool mysql-community-devel mysql-devel
yum -y install make automake libtool pkgconfig libaio-devel
wget https://github.com/akopytov/sysbench/archive/1.0.zip -O "sysbench-1.0.zip"
unzip sysbench-1.0.zip
cd sysbench-1.0
1.2 安装依赖
yum install automake libtool –y
yum -y install postgresql-devel
1.3 安装
安装之前,确保位于之前解压的sysbench目录中。
./autogen.sh
./configure \
--prefix=/sysbench \
--with-pgsql \
--without-mysql \
--with-pgsql-includes=/opt/module/pgsql/include \
--with-pgsql-libs=/opt/module/pgsql/lib
语句解析
–X | 解释 |
---|---|
–prefix=/sysbench | 最后将把sysbench安装在这个目录 |
–with-pgsql | 使用pg数据库 |
–without-mysql | 不使用mysql数据库 |
–with-pgsql-includes=/opt/module/pgsql/include | [你的pgsql数据库所在处]/include |
–with-pgsql-libs=/opt/module/pgsql/lib | [你的pgsql数据库所在处]/lib |
make
make install
1.4 安装成功
cd /sysbench # 进入sysbench安装在的路径
./bin/sysbench —version # 查看版本,确认是否安装成功
2 生成数据
sysbench \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=postgres \
--pgsql-password=postgres \
--pgsql-db=sysbench \
--oltp-table-size=10000 \
--oltp-tables-count=10 \
/opt/software/sysbench-1.0/tests/include/oltp_legacy/oltp.lua \
prepare
参数说明
属性 | 特征 |
---|---|
–oltp-tables-count=10 | 表的数量 |
–oltp-table-size=10000 | 测试表的记录数。默认是10000 |
–threads=10 | 表示发起 10 个并发连接 |
–time=120 | 表示执行120秒 |
–events=0 | 表示总请求数为 0 因为上面已经定义了总执行时长,所以总请求数可以设定为 0; 也可以只设定总请求数,不设定最大执行时长 |
–report-interval=10 | 表示每10秒输出一次测试进度报告 |
–percentile=99 | 表示设定采样比例,默认是 95%, 即丢弃1%的长请求,在剩余的99%里取最大值 |
3 清除数据
sysbench \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=postgres \
--pgsql-password=postgres \
--pgsql-db=sysbench \
--oltp-table-size=10000 \
/opt/software/sysbench-1.0/tests/include/oltp_legacy/oltp.lua \
cleanup
4 进阶:看看oltp_legacy中的脚本
进入/opt/software/sysbench-1.0/tests/include/oltp_legacy路径,查看里面的*.lua脚本
[root@localhost oltp_legacy]# pwd
/opt/software/sysbench-1.0/tests/include/oltp_legacy
[root@localhost oltp_legacy]# ls
bulk_insert.lua delete.lua oltp.lua parallel_prepare.lua select_random_points.lua update_index.lua
common.lua insert.lua oltp_simple.lua select.lua select_random_ranges.lua update_non_index.lu
重点关注其中的 common.lua
,我们可以修改其中的内容以生成所需的数据。
可以看到其中有function prepare()
和function cleanup()
。可知之前语句中的prepare和cleanup命令就是在调用它们,生成数据集和清除数据集
function prepare()
local query
local i
local j
set_vars()
db_connect()
for i = 1,oltp_tables_count do
create_insert(i)
end
return 0
end
function cleanup()
local i
set_vars()
for i = 1,oltp_tables_count do
print("Dropping table 'sbtest" .. i .. "'...")
db_query("DROP TABLE IF EXISTS sbtest".. i )
end
end
再看看function create_insert
,关注它是如何生成数据集的。
由于这个函数太长,我们简要的分三个部分:
function create_insert(table_id)
local index_name
local i
local j
local query
...
i = table_id
------------------------------------------------------------------------
-- 1 创建表sbtest[i]
print("Creating table 'sbtest" .. i .. "'...")
if ((db_driver == "mysql") or (db_driver == "attachsql")) then
query = [[...]]
elseif (db_driver == "pgsql") then
query = [[
CREATE TABLE sbtest]] .. i .. [[ (
id ]] .. auto_inc_type .. [[ NOT NULL,
k INTEGER DEFAULT '0' NOT NULL,
c CHAR(120) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
]] .. index_name .. [[ (id)
) ]]
db_query(query)
...
------------------------------------------------------------------------
-- 2 向表sbtest[i]中插入oltp_table_size大小的数据
print("Inserting " .. oltp_table_size .. " records into 'sbtest" .. i .. "'")
if (oltp_auto_inc) then
db_bulk_insert_init("INSERT INTO sbtest" .. i .. "(k, c, pad) VALUES")
else
db_bulk_insert_init("INSERT INTO sbtest" .. i .. "(id, k, c, pad) VALUES")
end
local c_val
local pad_val
for j = 1,oltp_table_size do
c_val = sb_rand_str([[
###########-###########-###########-###########-###########-###########-###########-###########-###########-###########]])
pad_val = sb_rand_str([[
###########-###########-###########-###########-###########]])
if (oltp_auto_inc) then
db_bulk_insert_next("(" .. sb_rand(1, oltp_table_size) .. ", '".. c_val .."', '" .. pad_val .. "')")
else
db_bulk_insert_next("("..j.."," .. sb_rand(1, oltp_table_size) .. ",'".. c_val .."', '" .. pad_val .. "' )")
end
end
db_bulk_insert_done()
------------------------------------------------------------------------
-- 3 是否创建二级索引
if oltp_create_secondary then
print("Creating secondary indexes on 'sbtest" .. i .. "'...")
db_query("CREATE INDEX k_" .. i .. " on sbtest" .. i .. "(k)")
end
end
5 实战
了解到以上这几点后,假设我们需要生成200,400,600,…,50000行的表,需要如何修改common.lua呢?
可以采用下面这个方案,也就是更改每个表oltp_table_size的大小
function prepare()
local query
local i
local j
set_vars()
db_connect()
oltp_table_size_start=oltp_table_size
for i = 1,oltp_tables_count do
oltp_table_size=oltp_table_size_start+i*200
create_insert(i)
end
return 0
end
sysbench \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=postgres \
--pgsql-password=postgres \
--pgsql-db=sysbench \
--oltp-table-size=0 \
--oltp-tables-count=250 \
/opt/software/sysbench-1.0/tests/include/oltp_legacy/oltp.lua \
prepare