Lua sysbench – 速成课
这是对我之前关于使用启用 Lua 的 sysbench 的博客文章的后续。今天我将深入探讨如何为 sysbench 编写 Lua 脚本。 请看这个简单的例子
function prepare () local i print("creating table sbtest.t1 ...") db_query("create table t1 (c1 int unsigned primary key, c2 int)") db_query("begin") for i= 1, 1000 do db_query("insert into t1 values (" .. i .. "," .. i .. ")") end db_query("commit") end function cleanup() db_query("drop table t1") end function help() print("sysbench Lua demo; no special command line options available") end function thread_init(thread_id) end function thread_done(thread_id) db_disconnect() end function event(thread_id) db_query("select c2 from t1 where c1=" .. sb_rand(1, 1000)) end
有 3 个函数 prepare()
、cleanup()
和 help()
。当要求 sysbench 执行相应的操作时(例如 sysbench … help),这些函数就会被执行。
如果你运行 sysbench ... run
,情况就不同了。首先 sysbench 启动所需数量的线程,并为每个线程执行 thread_init()
函数。在此之前,每个线程都会连接到数据库服务器(使用 sbtest 数据库)。因此,你不需要(实际上是:禁止)从 thread_init()
中调用 db_connect()
。参数 thread_id
的值从 1 到所需的线程数。
之后 sysbench 会暂停片刻,让所有线程有机会完成初始化。然后每个线程都会在一个循环中执行 event()
函数,直到达到请求数限制(–max-requests)或执行时间限制(–max-time)。
最后,每个线程执行 thread_done()
函数。注意:当 sysbench 线程退出时,db_disconnect()
不会自动调用。如果 sysbench 直接连接到 MySQL 服务器,这不是问题,因为当 sysbench 退出时,所有 socket 都会关闭,MySQL 会终止相关的会话。如果你通过某个代理连接,你可能需要明确关闭连接,就像我上面做的那样。
如果提到的任何 Lua 函数为空,你可以从 Lua 脚本中省略它。上面我添加 thread_init()
函数只是为了完整起见。
这是使用上述 Lua 代码的示例会话
sysbench-trunk/sysbench$ ./sysbench --test=tests/db/demo.lua help sysbench 0.5: multi-threaded system evaluation benchmark sysbench Lua demo; no special command line options available sysbench-trunk/sysbench$ ./sysbench --test=tests/db/demo.lua --mysql-socket=/tmp/mysql.sock --mysql-user=root prepare sysbench 0.5: multi-threaded system evaluation benchmark creating table sbtest.t1 ... sysbench-trunk/sysbench$ ./sysbench --test=tests/db/demo.lua --mysql-socket=/tmp/mysql.sock --mysql-user=root --num-threads=4 --max-requests=0 --max-time=30 --report-interval=5 run sysbench 0.5: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 4 Report intermediate results every 5 second(s) Random number generator seed is 0 and will be ignored Threads started! [ 5s] threads: 4, tps: 0.00, reads/s: 37499.12, writes/s: 0.00, response time: 0.19ms (95%) [ 10s] threads: 4, tps: 0.00, reads/s: 37041.45, writes/s: 0.00, response time: 0.19ms (95%) [ 15s] threads: 4, tps: 0.00, reads/s: 37358.99, writes/s: 0.00, response time: 0.19ms (95%) [ 20s] threads: 4, tps: 0.00, reads/s: 36109.20, writes/s: 0.00, response time: 0.20ms (95%) [ 25s] threads: 4, tps: 0.00, reads/s: 35841.39, writes/s: 0.00, response time: 0.20ms (95%) OLTP test statistics: queries performed: read: 1096527 write: 0 other: 0 total: 1096527 transactions: 0 (0.00 per sec.) deadlocks: 0 (0.00 per sec.) read/write requests: 1096527 (36550.85 per sec.) other operations: 0 (0.00 per sec.) General statistics: total time: 30.0000s total number of events: 1096527 total time taken by event execution: 118.0536s response time: min: 0.07ms avg: 0.11ms max: 16.98ms approx. 95 percentile: 0.19ms Threads fairness: events (avg/stddev): 274131.7500/5125.89 execution time (avg/stddev): 29.5134/0.01
如果你了解 Lua,你可能已经注意到 demo.lua 使用了一些非标准的 Lua 函数。Sysbench 为 Lua 解释器添加了几个新函数。最重要的可能是 db_query()
和 sb_rand()
。还有更多。请查看 sysbench 源代码中 script_lua.c 文件中的 C 函数 sb_lua_new_state()
,以获取完整列表。
你也应该查看附带的 Lua 代码,了解如何使用这些函数。
接下来:扩展 oltp.lua …