手把手教你改 sysbench 代码
作者: GangShen 原文来源:https://tidb.net/blog/a8c2981d
sysbench 原始代码介绍
oltp_point_select.lua/oltp_read_write.lua/oltp_update_index.lua 等脚本是使用 sysbench 进行 OLTP 各项测试的入口
oltp_common.lua 包含了一些常见的 OLTP 基准测试场景和数据模型,包括创建表、插入数据、查询数据等
sysbench prepare 建表以及生成数据的实现逻辑在 `function create_table(drv, con, table_num)` 实现。如果要自定义的表结构或者并发生成数据,主要是通过修改 create_table 函数的逻辑来实现。
修改 1 :修改表结构提高单表记录最大数量
修改主要内容
修改 2:修改非 AUTO_INCREMENT 主键起始值
表结构已经存在,重复建表会导致 DDL 错误
id 主键从 1 开始生成,会产生主键冲突的错误
修改方式:
对于重复建表的问题,可以在建表语句末尾加上 if not exists 定义,或者将执行建表语句行直接注释,跳过建表,con:query(query) 这一行就是在执行建表语句,通过 – 将代码注释。
对于 id 主键冲突的问题,比较简单的方式就是直接修改 for 循环的起始值和结束值,查询出中断时候,表内已有数据的最大 id 值,for 循环从 max(id)+1 开始,到 table-size 结束。
但是这种修改方式主要是针对单表造数的情况,如果有多张表的造数,sysbench 遇到错误中断退出后,每个表的 max(id) 值可能是不同的,如果对数据数量以及准确度要求完全跟原生 sysbench 产生的一样,可以将 INSERT 语句修改为 REPLACE 语句,并且 for 循环起始位置取多张表的 max(id) 中的最小值来完成。
修改 3:提升单表造数并发度
修改 4:控制每个 INSERT 语句记录行数
bulk_insert_init() 初始化 INSERT INTO VALUES 语句,并开启事务
bulk_insert_next() 拼接生成的每一行记录值 (),(),()… ,通过代码看到当拼接的字符串长度大于 BULK_PACKET_SIZE = 524288 之后,就会执行当前 SQL 语句,在 autocommit 模式下等于提交事务
bulk_insert_done() 表示提交事务
通过 bulk_insert_next() 拼接的 INSERT 语句提交的时机是通过字符串长度进行控制的,所以单个 INSERT 提交多少行记录是不固定的,当我们需要控制 sysbench 按照 500 行记录一次提交的时候,需要修改 sysbench 相关代码。相关接口已经实现,只需要修改一下调用接口的逻辑即可,在 for 循环中记录已经拼接的记录行数,当记录行数达到 500 行,调用 bulk_insert_done() 提交事务,然后重新初始化字符串。
独立修改的测试代码
调用命令方式
附完整修改代码
oltp_common_tidb.lua
oltp_read_write_tidb.lua
使用 10 并发进行造数例子
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/fd480226e2cdb922c9eee273a】。文章转载请联系作者。
评论