zoukankan      html  css  js  c++  java
  • Sysbench0.5初体验

    最近工作中需要测试数据库的OLTP的性能,参考了下MariaDB的benchmark中的测试脚本,发现脚本中已经使用了Sysbench-0.5,可以在这里https://launchpad.net/sysbench 拉下来trunk,这就是传说中的0.5版本。

    1. 编译安装

     1 Shell>pwd
     2 
     3 /home/nocode
     4 
     5 Shell> bzr branch lp:~sysbench-developers/sysbench/0.5  sysbench
     6 
     7 Shell> cd sysbench
     8 
     9 Shell> ./autogen.sh
    10 
    11 Shell> ./configure
    12 
    13 Shell> make
    14 
    15 Shell> sudo make install

    2. 使用

    1 Shell>pwd
    2 
    3 /home/nocode/sysbench/sysbench
    4 
    5 Shell>./sysbench --num-threads=1 --test=./tests/db/oltp.lua --oltp-table-size=1000 --oltp-tables-count=1  --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password= --mysql-db=test prepare
    6 
    7 Shell>./sysbench --num-threads=1 --test=./tests/db/oltp.lua --oltp-table-size=1000 --oltp-tables-count=1 --report-interval=5 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password= --mysql-db=test run
    8 
    9 Shell>./sysbench --num-threads=1 --test=./tests/db/oltp.lua --oltp-table-size=1000 --oltp-tables-count=1  --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password= --mysql-db=test cleanup

    3. Sysbench分析

    这里可以看出来--test参数的值有所变化,在之前的版本,--test取值如下

    Compiled-in tests:
    fileio - File I/O test
    cpu - CPU performance test
    memory - Memory functions speed test
    threads - Threads subsystem performance test
    mutex - Mutex performance test
    oltp - OLTP test

    新版本的test的取值是lua脚本,我们看下test/db/下都有哪些脚本:

    Shell>ls
    common.lua Makefile.am parallel_prepare.lua update_index.lua
    delete.lua Makefile.in select.lua update_non_index.lua
    insert.lua oltp.lua select_random_points.lua
    Makefile oltp_simple.lua select_random_ranges.lua

    这些脚本大部分都是可以作为test的取值的,这就是新版本有别于之前版本的最大区别,我们可以自己定义lua脚本,

    进行定制化的测试,而不需要去修改sysbench的代码,重新编译再进行测试。

    我们首先看下common.lua,这个文件并非是测试文件,而是用于prepare和cleanup,当然还包括参数的读取。

    先看下一下这个脚本里面的prepare:

     1 function prepare()
     2 local query
     3 local i
     4 local j
     5 
     6 set_vars()
     7 
     8 db_connect()
     9 for i = 1,oltp_tables_count do
    10 create_insert(i)
    11 end
    12 
    13 return 0
    14 end

    prepare函数调用create_insert函数来创建表并插入数据。cleanup函数用来DROP TABLE,如下所示。

    function cleanup()
    local i
    
    set_vars()
    
    for i = 1,oltp_tables_count do
    print("Dropping table 'sbtest" .. i .. "'...")
    db_query("DROP TABLE sbtest".. i )
    end
    end

    下面我们看下oltp.lua文件,这里面有两个函数,一个初始化函数:thread_init,用于初始化每个线程的参数

    function thread_init(thread_id)
    set_vars()
    
    if (db_driver == "mysql" and mysql_table_engine == "myisam") then
    begin_query = "LOCK TABLES sbtest WRITE"
    commit_query = "UNLOCK TABLES"
    else
    begin_query = "BEGIN"
    commit_query = "COMMIT"
    end
    
    end

    这个初始化函数主要是调用了common.lua里面的set_vars函数,来初始化oltp相关的参数,如oltp_range_size,oltp_sum_ranges等等,

    这些参数都是用来控制一个T(Transaction)里面语句的类型和个数的。所谓的TPS值的高低也和这些值有关系,一个T的语句越少,越简单,

    TPS的值就会越高,相反,如果一个T里面语句多,语句复杂,那么TPS必然降低。我们来具体看下每个事务执行哪些语句,这就是函数event做的事情。

    我们看下这个函数里面的典型代码:

    if not oltp_skip_trx then
    db_query(begin_query)
    end
    
    for i=1, oltp_point_selects do
    rs = db_query("SELECT c FROM ".. table_name .." WHERE id=" .. sb_rand(1, o ltp_table_size))
    end
    
    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 " .. rang e_start .. " AND " .. range_start .. "+" .. oltp_range_size - 1)
    end

    根据oltp_skip_trx来决定是否启用事务,然后根据oltp_point_selects来决定点查询语句的个数,oltp_simple_rannges来确定范围查询语句的个数。

    4. 定制脚本

    默认的sysbench在prepare的时候是使用的多行插入,而我的测试需要使用单行插入来完成初始化。

    故这里需要对common.lua中的create_insert函数进行修改。需要添加一个参数oltp_bulk_insert来决定是否使用多行插入,

    同时需要修改相应的INSERT语句,看下面的patch就一目了然了。

    Shell>bzr diff
    === modified file 'sysbench/tests/db/common.lua'
    --- sysbench/tests/db/common.lua 2011-12-01 19:43:29 +0000
    +++ sysbench/tests/db/common.lua 2013-09-12 06:51:41 +0000
    @@ -25,7 +25,7 @@
    CREATE TABLE sbtest]] .. i .. [[ (
    id INTEGER UNSIGNED NOT NULL ]] ..
    ((oltp_auto_inc and "AUTO_INCREMENT") or "") .. [[,
    -k INTEGER UNSIGNED DEFAULT '0' NOT NULL,
    +k INTEGER UNSIGNED DEFAULT '0' NOT NULL, KEY(k),
    c CHAR(120) DEFAULT '' NOT NULL,
    pad CHAR(60) DEFAULT '' NOT NULL,
    ]] .. index_name .. [[ (id)
    @@ -58,14 +58,18 @@
    
    db_query(query)
    
    - db_query("CREATE INDEX k_" .. i .. " on sbtest" .. i .. "(k)")
    + if (db_driver ~= "mysql") then
    + db_query("CREATE INDEX k_" .. i .. " on sbtest" .. i .. "(k)")
    + end
    
    print("Inserting " .. oltp_table_size .. " records into 'sbtest" .. i .. "'")
    
    - if (oltp_auto_inc) then
    - db_bulk_insert_init("INSERT INTO sbtest" .. i .. "(k, c, pad) VALUES")
    - else
    - db_bulk_insert_init("INSERT INTO sbtest" .. i .. "(id, k, c, pad) VALUES")
    + if (oltp_bulk_insert) then
    + if (oltp_auto_inc) then
    + db_bulk_insert_init("INSERT INTO sbtest" .. i .. "(k, c, pad) VALUES")
    + else
    + db_bulk_insert_init("INSERT INTO sbtest" .. i .. "(id, k, c, pad) VALUES")
    + end
    end
    
    local c_val
    @@ -79,13 +83,21 @@
    pad_val = sb_rand_str([[
    ###########-###########-###########-###########-###########]])
    
    - if (oltp_auto_inc) then
    - db_bulk_insert_next("(" .. sb_rand(1, oltp_table_size) .. ", '".. c_val .."', '" .. pad_val .. "')")
    + if (oltp_bulk_insert) then
    + if (oltp_auto_inc) then
    + db_bulk_insert_next("(" .. sb_rand(1, oltp_table_size) .. ", '".. c_val .."', '" .. pad_val .. "')")
    + else
    + db_bulk_insert_next("("..j.."," .. sb_rand(1, oltp_table_size) .. ",'".. c_val .."', '" .. pad_val .. "' )")
    + end
    else
    - db_bulk_insert_next("("..j.."," .. sb_rand(1, oltp_table_size) .. ",'".. c_val .."', '" .. pad_val .. "' )")
    + if (oltp_auto_inc) then
    + db_query("INSERT INTO sbtest" .. i .. "(k, c, pad) VALUES(" .. sb_rand(1, oltp_table_size) .. ", '".. c_val .."', '" .. pad_val .. "')")
    + else
    + db_query("INSERT INTO sbtest" .. i .. "(id, k, c, pad) VALUES(" ..j.."," .. sb_rand(1, oltp_table_size) .. ", '".. c_val .."', '" .. pad_val .. "')")
    + end
    end
    +
    end
    -
    db_bulk_insert_done()
    @@ -150,4 +162,10 @@
    oltp_skip_trx = false
    end
    
    + if (oltp_bulk_insert == 'off') then
    + oltp_bulk_insert = false
    + else
    + oltp_bulk_insert = true
    + end
    +
    end

    5. 小结

    sysbench-0.5使用脚本来决定测试语句,比之前在代码里写死测试更加方便用户修改和使用,不需要去修改源程序,只需要修改相应的lua脚本,

    即可定制不同的测试用例,真心不错。

  • 相关阅读:
    Linux 修改 root密码
    python实现 CI/CD(jenkins+gitlab)
    redis集群
    土木工程材料0732
    C语言程序设计【1032】
    汽车文化【1196】
    应用写作0045
    思想道德修养与法律基础[1053]
    英语【0002】
    社区管理【0272】
  • 原文地址:https://www.cnblogs.com/nocode/p/3338287.html
Copyright © 2011-2022 走看看