DRDS Sysbench 测试说明
Sysbench 说明
Sysbench是一款开源的、模块化的、跨平台的多线程性能测试工具,可以执行数据库/CPU/内存/线程/IO等方面的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以下验证DRDS在Sysbench OLTP和SELECT场景中的性能表现。
测试设计
- 购买DRDS、ECS、RDS
- DRDS(4种规格) :入门版8C32G、标准版 16C64G、企业版 32C128G、企业版 64C256G
- ECS压力机(1台):32C64G、操作系统 Aliyun Linux 2.1903 64位、计算网络增强型
- RDS(12台):16C64G、MySQL 5.7、独享型
- 备注:DRDS、ECS、RDS都处于同一可用区,同一VPC
- 在DRDS控制台创建水平拆分库,选择已经购买的12台RDS
- 在ECS安装Sysbench,并准备1.6亿数据,如果第一次使用Sysbench,请参考Sysbench使用指南
测试参数说明
--test='/usr/local/share/sysbench/oltp_drds.lua' OLTP场景使用oltp_drds.lua, SELECT场景使用select.lua
--mysql_table_options='dbpartition by hash(`id`) tbpartition by hash(id) tbpartitions 2' DRDS分库分表语法,表示每个分库2张分表
--oltp-table-size=160000000 准备1.6亿数据
--oltp_auto_inc=off 关闭自增主键
--oltp_skip_trx=on 跳过事务
--oltp_secondary 将 id 设置为非主键防止主键冲突
--oltp_range_size=5 连续取值 5 个,必定走到 5 个分片
--rand-init=on 每个测试表都是用随机数据来填充的sysbench
--num-threads=200 具体每个场景的并发数,请参考结果表格
测试语句范例:
sysbench --test='/usr/local/share/sysbench/oltp_drds.lua' --oltp_tables_count=1 --report-interval=5 --oltp-table-size=160000000 --mysql-user=**** --mysql-password=**** --mysql-table-engine=innodb --rand-init=on --mysql-host=**** --mysql-port=3306 --mysql-db=**** --max-requests=0 --oltp_skip_trx=on --oltp_auto_inc=off --oltp_secondary --oltp_range_size=5 --mysql_table_options='dbpartition by hash(`id`) tbpartition by hash(id) tbpartitions 2' --num-threads=200 --max-time=300 run
OLTP 测试结果
规格 | 并发数 | 每秒 read/write 数量 |
---|---|---|
入门版 8C32G | 100 | 20807.12 |
标准版 16C64G | 230 | 49667.48 |
企业版 32C128G | 450 | 90693.70 |
企业版 64C256G | 900 | 177506.48 |
SELECT 测试结果
规格 | 并发数 | 每秒 read/write 数量 |
---|---|---|
入门版 8C32G | 200 | 41401 |
标准版 16C64G | 300 | 98182.26 |
企业版 32C128G | 600 | 180500.00 |
企业版 64C256G | 1200 | 366863.48 |
OLTP 场景测试脚本详情
pathtest = string.match(test, "(.*/)")
if pathtest then
dofile(pathtest .. "common.lua")
else
require("common")
end
function get_range_end(start)
return start + oltp_range_size - 1
end
function thread_init(thread_id)
set_vars()
if (((db_driver == "mysql") or (db_driver == "attachsql")) and mysql_table_engine == "myisam") then
local i
local tables = {}
for i=1, oltp_tables_count do
tables[i] = string.format("sbtest%i WRITE", i)
end
begin_query = "LOCK TABLES " .. table.concat(tables, " ,")
commit_query = "UNLOCK TABLES"
else
begin_query = "BEGIN"
commit_query = "COMMIT"
end
end
function event(thread_id)
local rs
local i
local table_name
local range_start
local c_val
local pad_val
local query
table_name = "sbtest".. sb_rand_uniform(1, oltp_tables_count)
if not oltp_skip_trx then
db_query(begin_query)
end
if not oltp_write_only then
for i=1, oltp_point_selects do
rs = db_query("SELECT c FROM ".. table_name .." WHERE id=" .. sb_rand(1, oltp_table_size))
end
if oltp_range_selects then
for i=1, oltp_simple_ranges do
range_start = sb_rand(1, oltp_table_size)
rs = db_query("SELECT c FROM ".. table_name .." WHERE id BETWEEN " .. range_start .. " AND " .. get_range_end(range_start))
end
for i=1, oltp_sum_ranges do
range_start = sb_rand(1, oltp_table_size)
rs = db_query("SELECT SUM(K) FROM ".. table_name .." WHERE id BETWEEN " .. range_start .. " AND " .. get_range_end(range_start))
end
for i=1, oltp_order_ranges do
range_start = sb_rand(1, oltp_table_size)
rs = db_query("SELECT c FROM ".. table_name .." WHERE id BETWEEN " .. range_start .. " AND " .. get_range_end(range_start) .. " ORDER BY c")
end
for i=1, oltp_distinct_ranges do
range_start = sb_rand(1, oltp_table_size)
rs = db_query("SELECT DISTINCT c FROM ".. table_name .." WHERE id BETWEEN " .. range_start .. " AND " .. get_range_end(range_start) .. " ORDER BY c")
end
end
end
if not oltp_read_only then
for i=1, oltp_index_updates do
rs = db_query("UPDATE " .. table_name .. " SET k=k+1 WHERE id=" .. sb_rand(1, oltp_table_size))
end
for i=1, oltp_non_index_updates do
c_val = sb_rand_str("###########-###########-###########-###########-###########-###########-###########-###########-###########-###########")
query = "UPDATE " .. table_name .. " SET c='" .. c_val .. "' WHERE id=" .. sb_rand(1, oltp_table_size)
rs = db_query(query)
if rs then
print(query)
end
end
for i=1, oltp_delete_inserts do
i = sb_rand(1, oltp_table_size)
rs = db_query("DELETE FROM " .. table_name .. " WHERE id=" .. i)
c_val = sb_rand_str([[
###########-###########-###########-###########-###########-###########-###########-###########-###########-###########]])
pad_val = sb_rand_str([[
###########-###########-###########-###########-###########]])
rs = db_query("INSERT INTO " .. table_name .. " (id, k, c, pad) VALUES " .. string.format("(%d, %d, '%s', '%s')",i, sb_rand(1, oltp_table_size) , c_val, pad_val))
end
end -- oltp_read_only
if not oltp_skip_trx then
db_query(commit_query)
end
end
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论