云社区 博客 博客详情

关于sysbench自定义lua脚本性能测试,这些你知道吗?

山山而川&潺潺成镜 发表于 2020-04-30 15:49:29 2020-04-30
0
1

【摘要】 目前业界常用的mysql性能评估工具,最流行、对mysql最亲和的就是sysbench。sysbench除了自带的lua脚本,比如oltp_read_write.lua、oltp_insert.lua等等,今天我们重点介绍sysbench的自定义脚本。

一、前言

        我们经常有这样的需求,表定义或者表定义数据已经有了,需要评估某些语句的的性能,比如有如下表:

                DROP TABLE IF EXISTS `testiptable`;

                CREATE TABLE `testiptable` (

                  `id` int(11) NOT NULL AUTO_INCREMENT,

                  `ipaddr` varchar(20) DEFAULT NULL,

                  `rectime` varchar(30) DEFAULT NULL,

                  PRIMARY KEY (`id`)

                ) ENGINE = InnoDB DEFAULT CHARSET = utf8;

        此时我们需要评估某个实例写入的性能,该如何进行呢?

        目前业界常用的mysql性能评估工具,最流行、对mysql最亲和的就是sysbench。sysbench除了自带的lua脚本,比如oltp_read_write.lua、oltp_insert.lua等等,当然,sysbench还支持今天我们重点要介绍的自定义脚本。

        insert的关键的语句如下:

        insert into testiptable(ipaddr, rectime) values(‘192.168.10.121’, ‘2020-03-29 09:20:18’),(‘192.168.10.121’, ‘2020-03-29 10:20:18’);

        注:测试写入性能的时候,会进行多线程和批量insert。

        sysbench执行,一般函数:thread_init、event、thread_done,这三个函数分别对应线程初始化、线程执行事件、线程结束执行操作。Sysbench执行时会按照thread_init-> event-> thread_done顺序进行。

二、脚本定义

2.1 线程初始化和线程结束脚本

        function thread_init(thread_id)

                   drv = sysbench.sql.driver() 

                   con = drv:connect()

        end

       注:thread_init函数最重要的就是驱动连接。

        function thread_done() 

                   con:disconnect()

        end

        注:thread_done函数主要是执行完成

       函数内部没有local标识的变量,脚本内都可以使用,如con和drv后续的脚本内部都可以使用。

2.2 线程执行事件

        sysbench.cmdline.options = { 

                bulk_inserts = {"Number of values to to insert", 1}

        }

        sysbench.cmdline.options,可以在执行脚本时将输入参数传入脚本。我们在写入时需要进行批量insert, 通过--bulk_inserts=xx来设置批量修改。

        注意:大括号中前面是说明,后面是默认值。如果不输入参数,脚本自动按照默认值执行。除了能传递数字,还可以传递bool型的true和false,如:

                    sysbench.cmdline.options = { 

                            skip_trx= {"skip transaction", false}

                    }

        我们来看一下数据insert部分函数是如何实现的:

         function execute_inserts(thread_id)

                local ipaddr

                local rectime

                local sql = "insert " ..tablename.." (ipaddr,rectime) values"

                for i=1,sysbench.opt.bulk_inserts do

                        ipaddr = string.format("192.168.%d.%d",sysbench.rand.pareto(10,40),sysbench.rand.pareto(1,250))

                        rectime = os.date("%Y-%m-%d %H:%M:%S",os.time())

                        sql = sql .. string.format("('%s','%s')",ipaddr,rectime)

                        if ( i ~= sysbench.opt.bulk_inserts) then

                                sql = sql .. ","

                        end

                end

                con:query(sql)

        end

        注:con:query(sql),该语句作用为执行数据库语句。

        function event(thread_id)

                execute_inserts(thread_id) 

        end

三、脚本执行

        sysbench ./insert.lua --mysql-user=root --mysql-password='Test_123' --mysql-db=test --report-interval=1 --events=0 --time=180 --mysql-host=192.168.0.139 --bulk_inserts=100 run

        注:如果不输入--bulk_inserts=100,脚本默认--bulk_inserts=1。

   1.png

四、总结

        Sysbench自定义脚本,主要要实现event逻辑,可以通过sysbench.cmdline.options列表进行命令行传参。



登录后可下载附件,请登录或者注册

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请发送邮件至:huaweicloud.bbs@huawei.com;如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
评论文章 //点赞 收藏 1
点赞
分享文章到微博
分享文章到朋友圈

下一篇:我的PG数据库备份优化之路

评论 (0)


登录后可评论,请 登录注册

评论