Sysbench 自定义lua脚本, 根据业务场景做迭代更新测试

相关的学习资料

系统版本 & kernel 版本

CentOS Linux release 7.6.1810 (Core)

4.20.10-1.el7.elrepo.x86_64

sysbench 版本

sysbench 1.0.17 (using system LuaJIT 2.0.4)

场景

使用 sysbench 根据业务场景做迭代更新, 的压力测试

数据库表

CREATE TABLE `table_1` (
  `id` int(11) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `city` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

自定义测试脚本: update.lua

#!/usr/bin/env sysbench

-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
    -- 连接数据库
    local drv = sysbench.sql.driver()
    local con = drv:connect()

    while (true)
    do
       con:query("BEGIN")
       local result = con:query(" UPDATE table_1 SET username= 'tug666' WHERE city = '大连市' limit 5000 ")
       con:query("COMMIT")

       if result.row <= 0 then
           break;
       end
    end
end

问题描述(我做了什么)

sysbench --config-file=config update.lua run

[tidb@test tidb-tools]$ sysbench --config-file=config update.lua run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 16
Report intermediate results every 10 second(s)
Initializing random number generator from current time


Initializing worker threads...

Threads started!

FATAL: `thread_run' function failed: update.lua:15: attempt to compare 'struct 167' with 'number'
Error in my_thread_global_end(): 1 threads didn't exit
[tidb@test tidb-tools]$

我的期望

result.row 能够返回,每次更新受影响的行数。

对 Lua 不是很了解。看报错像是在编译阶段就出错了,是不是误语法不对,或者调试下 result.row 这个值是否是 null

这个返回的 result 是 cdata <sql_result> ctype类型,我目前不知道如何使用 lua解析 它的返回值;我在sysbench的源码中找到了它的返回值对象,但是不知道 如何在 lua中使用

/* Result set definition */

typedef struct
{
  sb_counter_type   counter;     /* Statistical counter type */
  uint32_t       nrows;         /* Number of affected rows */
  uint32_t       nfields;       /* Number of fields */
  sql_statement  *statement;    /* Pointer to prepared statement (if used) */
  void           *ptr;          /* Pointer to driver-specific data */
  sql_row        row;           /* Last fetched row */
} sql_result;

关于 sysbench 和 lua 相关的疑问建议到 sysbench 和 lua 相关的论坛或者博客来咨询下哈~~~

我已经去github, 找作者了,等问题解决了,我会在这上面结案的:smile:

1赞

作者说:对于非SELECT查询, con:query() 返回正确 nil 。 我不明白他为什么要这样设计