日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sysbench代码剖析和实践

發(fā)布時間:2024/3/26 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sysbench代码剖析和实践 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

sysbench是一款比較流行的測試工具,主要用于測試fileio、cpu、memory、threads、mutex等的性能測試,但是最主要的還是做數(shù)據(jù)庫的性能測試,經(jīng)常用來測試MySQL、Drizzle、AttachSQL、Oracle、PostgreSQL等相關(guān)的數(shù)據(jù)庫,也可以擴(kuò)展支持其他的數(shù)據(jù)庫以及測試用例,本文主要介紹sysbench的代碼邏輯、代碼調(diào)試、lua腳本以及相關(guān)擴(kuò)展功能。

本文的介紹主要基于sysbench 1.0的代碼:
repo:https://github.com/akopytov/sysbench
branch:1.0

1. 代碼邏輯

sysbench的代碼邏輯如下(已經(jīng)過濾掉一些不需要額外說明的代碼文件):

sysbench/ ├── src │ ├── db_driver.c // db驅(qū)動測試功能接口,主要串聯(lián)sysbench測試框架和具體的db-driver │ ├── db_driver.h // db驅(qū)動接口申明,具體的實現(xiàn)見下面的drivers目錄 │ ├── drivers // 具體的driver驅(qū)動實現(xiàn) │ │ ├── attachsql │ │ ├── drizzle │ │ ├── mysql │ │ ├── oracle │ │ └── pgsql │ ├── lua // 內(nèi)置的oltp測試工具實現(xiàn) │ │ ├── bulk_insert.lua │ │ ├── internal │ │ ├── oltp_common.lua │ │ ├── oltp_delete.lua │ │ ├── oltp_insert.lua │ │ ├── oltp_point_select.lua │ │ ├── oltp_read_only.lua │ │ ├── oltp_read_write.lua │ │ ├── oltp_update_index.lua │ │ ├── oltp_update_non_index.lua │ │ ├── oltp_write_only.lua │ │ ├── select_random_points.lua │ │ └── select_random_ranges.lua │ ├── sb_barrier.h // 線程屏障,用于線程的同步 │ ├── sb_ck_pr.h // 原子操作,具體的在../third_party/concurrency_kit中實現(xiàn) │ ├── sb_counter.h // 計數(shù)器程序,由于統(tǒng)計 │ ├── sb_global.h │ ├── sb_histogram.h // todo │ ├── sb_list.h // List的C語言實現(xiàn) │ ├── sb_logger.h // logger實現(xiàn) │ ├── sb_lua.c │ ├── sb_lua.h // 串聯(lián)C和Lua程序,目標(biāo):1. Lua可以調(diào)用C中的db-driver-api;2. C可以調(diào)用Lua程序 │ ├── sb_options.h // 參數(shù)解析實現(xiàn) │ ├── sb_rand.h // 隨機(jī)數(shù)、字符串實現(xiàn) │ ├── sb_thread.h // 線程函數(shù)實現(xiàn) │ ├── sb_timer.h // 定時器實現(xiàn) │ ├── sb_util.h // 功能函數(shù),主要是對齊(align)相關(guān)的宏 │ ├── sb_win.h // 跨平臺代碼,windows支持 │ ├── sysbench.c // sysbench的main函數(shù) │ ├── sysbench.h │ ├── tests // 其他的測試模型程序,包括cpu、fileio等 │ │ ├── cpu │ │ ├── fileio │ │ ├── memory │ │ ├── mutex │ │ ├── sb_cpu.h │ │ ├── sb_fileio.h │ │ ├── sb_memory.h │ │ ├── sb_mutex.h │ │ ├── sb_threads.h │ │ └── threads │ └── xoroshiro128plus.h ├── tests // db-driver的測試用例 │ ├── include │ │ ├── api_sql_common.sh │ │ ├── config.sh.in │ │ ├── drv_common.sh │ │ ├── inspect.lua │ │ ├── mysql_common.sh │ │ ├── oltp_legacy │ │ ├── pgsql_common.sh │ │ ├── script_bulk_insert_common.sh │ │ ├── script_oltp_common.sh │ │ ├── script_oltp_legacy_common.sh │ │ ├── script_select_random_common.sh │ │ └── script_select_random_legacy_common.sh │ ├── t // sysbench單元測試程序 │ └── test_run.sh └── third_party // sysbench的第三方依賴庫├── concurrency_kit // 并發(fā)控制模塊├── cram // 命令后程序測試框架└── luajit // lua的jit編譯器

閱讀代碼從sysbench.c中的main函數(shù)開始,流程邏輯還是比較清晰的:

// source file: src/sysbench.c int main(int argc, char *argv[]) {sb_test_t *test = NULL;int rc;sb_globals.argc = argc;sb_globals.argv = malloc(argc * sizeof(char *));memcpy(sb_globals.argv, argv, argc * sizeof(char *));/* Initialize options library */sb_options_init();/* First register the logger */if (log_register())return EXIT_FAILURE;/* Register available tests */if (register_tests()){fprintf(stderr, "Failed to register tests.\n");return EXIT_FAILURE;}/* Parse command line arguments */if (parse_general_arguments(argc, argv))return EXIT_FAILURE;/* Initialize global variables and logger */if (init() || log_init() || sb_counters_init())return EXIT_FAILURE;print_header();test = sb_load_lua(NULL);current_test = test;/* Load and parse test-specific options */if (parse_test_arguments(test, argc, argv))return EXIT_FAILURE;/* prepare, cleanup, run. */if (!strcmp(sb_globals.cmdname, "prepare")){rc = test->builtin_cmds.prepare();}else if (!strcmp(sb_globals.cmdname, "cleanup")){rc = test->builtin_cmds.cleanup();}else if (!strcmp(sb_globals.cmdname, "run")){rc = run_test(test) ? EXIT_FAILURE : EXIT_SUCCESS;}/* clean up. */ end:if (sb_lua_loaded())sb_lua_done();db_done();sb_counters_done();log_done();sb_options_done();sb_rand_done();sb_thread_done();free(timers);free(timers_copy);free(sb_globals.argv);return rc; }

2. Lua腳本

Lua和C的親和性非常好,被稱為最好的膠水語言,Lua可以調(diào)用C中定義的方法,C也可以非常方便的調(diào)用Lua,為什么要C和Lua結(jié)合使用呢:

  • C的優(yōu)勢是高性能,但它是編譯語言,程序發(fā)生變動,就需要重新進(jìn)行編譯,相對來說不太靈活;
  • Lua的優(yōu)勢是靈活,它是解釋語言,無需編譯,就可以執(zhí)行,一般用來寫一些經(jīng)常變動的規(guī)則性代碼。

那問題來了:Lua不會拖慢C的性能嗎?那就不得不提LuaJIT了,它是Lua的虛擬機(jī),主要功能就是將Lua程序編譯成字節(jié)碼程序去執(zhí)行,LuaJIT比較輕量,在C程序里面很容易就能集成進(jìn)去,這就使得Lua的性能并不會有大的影響,并且支持動態(tài)的加載Lua程序。
下面是一個Lua的簡單的代碼:

-- file: lua_test.lua function domain(num)-- call C function.local tab = gettab()-- show key and valuefor k, v in pairs(tab) doprint("key: ".. k)print("val: ".. v)print()end end

下面是和C交互的代碼:

// file: c_test.c int get_tab(lua_State *L) {// create table.lua_newtable(L);// push (key, value).int i;char value[10] = {0};for(i=0; i<5; ++i) {sprintf(value, "value%d", i+1);lua_pushnumber(L, i+1); //keylua_pushstring(L, value); //valuelua_settable(L, -3); //push key,value}// deal return.return 1; }int main() {// create a state and load standard library.lua_State* L = luaL_newstate();luaL_openlibs(L);// register function be called by lua.lua_register(L, "gettab", get_tab);// load and exec the specified lua file.int error = luaL_dofile(L, "lua_test.lua");if(error) {perror("luaL_dofile error");exit(1);}// get the domain function from lua file. lua_getglobal(L, "domain");// exec the domain function.error = lua_pcall(L, 0, 0, 0);if (error) {fprintf(stderr, "%s\n",lua_tostring(L, -1));lua_pop(L, 1);}// close lua state.lua_close(L);return 0; }

這種通過lua_State交互的方式對C代碼的侵入較大,還有一種就是ffi的方式,可以參考這個鏈接:
https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/FFI.html
sysbench以上兩種方式都用了:

  • 通過lua_State進(jìn)行交互:主要用在Lua調(diào)用C中定義好的db-driver api;
  • ffi主要用在Lua使用C中定義好的結(jié)構(gòu)體、字段類型、常規(guī)函數(shù)(sleep、隨機(jī)函數(shù))等。

3. 擴(kuò)展功能

sysbench測試db場景比較簡單,表結(jié)構(gòu)如下:

CREATE TABLE `sbtest1` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`k` int(10) unsigned NOT NULL DEFAULT '0',`c` char(120) NOT NULL DEFAULT '',`pad` char(60) NOT NULL DEFAULT '',PRIMARY KEY (`id`),KEY `k_1` (`k`) BLOCK_SIZE 16384 GLOBAL );

在我們測試其他場景,比如寬表、大字段、小字段等,這種場景用原生的sysbench測試腳本就力不從心了。
這個時候就需要修改代碼的實現(xiàn)了,實現(xiàn)也比較簡單,就是在Lua腳本中實現(xiàn)這幾個函數(shù)就可以了:

// src/sb_lua.c #define EVENT_FUNC "event" // worker線程執(zhí)行內(nèi)容 #define PREPARE_FUNC "prepare" // prepare階段:創(chuàng)建表、預(yù)加載數(shù)據(jù) #define CLEANUP_FUNC "cleanup" // cleanup階段:清理數(shù)據(jù)等 #define HELP_FUNC "help" // help函數(shù),展示測試用例的參數(shù)用法 #define THREAD_INIT_FUNC "thread_init" // worker線程初始化:設(shè)置運(yùn)行參數(shù)、生成標(biāo)名稱等 #define THREAD_DONE_FUNC "thread_done" // worker線程執(zhí)行完:清理線程中的資源 #define THREAD_RUN_FUNC "thread_run" // 一般無需實現(xiàn),只需要關(guān)注event #define INIT_FUNC "init" // 全局init:一般無需實現(xiàn) #define DONE_FUNC "done" // 全局done:一般無需實現(xiàn)

sysbench自帶的oltp的測試case就是這樣實現(xiàn)的,主要包含兩個文件:

  • oltp.lua:定義了thread_init、event函數(shù);
  • common.lua:定義了prepare、cleanup函數(shù)。

下面寫一個我們自己的測試case腳本:

-- file: test_cjf.lua -- A simple test case.function prepare()db_connect()-- create table.local query = [[CREATE TABLE `sbtest_cjf` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`k` int(10) unsigned NOT NULL DEFAULT '0',`c` char(120) NOT NULL DEFAULT '',`pad` char(60) NOT NULL DEFAULT '',PRIMARY KEY (`id`))]]db_query(query)print("create table sbtest_cjf succ.")-- insert 1000 records.local ifor i = 1, 1000 doquery = [[insert into sbtest_cjf(`id`, `k`, `c`, `pad`) values(]] .. i .. ',' .. i + 1000 .. ", 'c', 'pad')"db_query(query)endprint("insert 1000 record to sbtest_cjf succ.")return 0 endfunction cleanup()db_query('DROP TABLE IF EXISTS sbtest_cjf')print('drop table sbtest_cjf succ.')return 0 endfunction event()db_query('select * from sbtest_cjf where id = 1') end

使用sysbench對上述test_cjf.lua進(jìn)行測試:

$./src/sysbench ./tests/include/oltp_legacy/test_cjf.lua --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=xxx --mysql-db=dbtest --db-driver=mysql --report-interval=2 --threads=1 --time=10 prepare sysbench 1.0.20-6cb07f3 (using bundled LuaJIT 2.1.0-beta2)create table sbtest_cjf succ. insert 1000 record to sbtest_cjf succ.$./src/sysbench ./tests/include/oltp_legacy/test_cjf.lua --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=xxx --mysql-db=dbtest --db-driver=mysql --report-interval=2 --threads=1 --time=10 run sysbench 1.0.20-6cb07f3 (using bundled LuaJIT 2.1.0-beta2)Running the test with following options: Number of threads: 1 Report intermediate results every 2 second(s) Initializing random number generator from current timeInitializing worker threads...Threads started![ 2s ] thds: 1 tps: 2182.39 qps: 2182.39 (r/w/o: 2182.39/0.00/0.00) lat (ms,95%): 0.55 err/s: 0.00 reconn/s: 0.00 [ 4s ] thds: 1 tps: 2323.41 qps: 2323.41 (r/w/o: 2323.41/0.00/0.00) lat (ms,95%): 0.47 err/s: 0.00 reconn/s: 0.00 [ 6s ] thds: 1 tps: 2299.49 qps: 2299.49 (r/w/o: 2299.49/0.00/0.00) lat (ms,95%): 0.47 err/s: 0.00 reconn/s: 0.00 [ 8s ] thds: 1 tps: 2304.50 qps: 2304.50 (r/w/o: 2304.50/0.00/0.00) lat (ms,95%): 0.48 err/s: 0.00 reconn/s: 0.00 SQL statistics:queries performed:read: 22804write: 0other: 0total: 22804transactions: 22804 (2279.41 per sec.)queries: 22804 (2279.41 per sec.)ignored errors: 0 (0.00 per sec.)reconnects: 0 (0.00 per sec.)General statistics:total time: 10.0024stotal number of events: 22804Latency (ms):min: 0.40avg: 0.44max: 14.6895th percentile: 0.53sum: 9974.14Threads fairness:events (avg/stddev): 22804.0000/0.00execution time (avg/stddev): 9.9741/0.00$./src/sysbench ./tests/include/oltp_legacy/test_cjf.lua --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=xxx --mysql-db=dbtest --db-driver=mysql --report-interval=2 --threads=1 --time=10 cleanup sysbench 1.0.20-6cb07f3 (using bundled LuaJIT 2.1.0-beta2)drop table sbtest_cjf succ.

4. 參考文檔

Lua教程:https://www.w3xue.com/manual/lua/Lua-Chinese.pdf
GDB入門:https://zhuanlan.zhihu.com/p/74897601
GDB命令:https://developer.aliyun.com/article/232348

總結(jié)

以上是生活随笔為你收集整理的sysbench代码剖析和实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产第一毛片 | 精品三级在线 | 国产精品夜夜爽张柏芝 | av电影在线网站 | 亚洲一一在线 | 校园伸入裙底揉捏1v1h | av三级在线播放 | 午夜精品久久久内射近拍高清 | 日本黄色成人 | 老妇free性videosxx | 日本成人社区 | 亚洲成人高清在线 | 在线免费三级 | 香蕉视频一区二区 | 玖玖网 | 国产香蕉视频在线 | 亚洲欧洲国产精品 | 精品色图 | 五月色婷婷综合 | 琪琪色综合| 欧美精品乱人伦久久久久久 | 黄色一大片 | 国产主播av在线 | 午夜高清视频 | 91成人免费看 | 露出调教羞耻91九色 | 欧美交受高潮1 | 女性裸体瑜伽无遮挡 | 亚洲精品喷潮一区二区三区 | 最新精品国产 | 女人17片毛片60分钟 | 99视频在线免费观看 | 国产真人无遮挡作爱免费视频 | 7777久久亚洲中文字幕 | 播播成人网 | 亚洲天堂区 | 久人人 | 中文字幕――色哟哟 | 久久精品一区二区在线观看 | 色网站在线免费观看 | 美女国产视频 | 久久久久夜夜夜精品国产 | 告诉我真相俄剧在线观看 | 日韩少妇内射免费播放 | av大片免费 | 老湿机69福利 | 久久99精品国产麻豆91樱花 | 蜜臀久久99精品久久久久久 | 黄色三级三级三级 | 成人精品毛片 | 欧美高清一区二区三区四区 | 日日操夜夜 | 713电影免费播放国语 | 久久成人乱码欧美精品一区二区 | 俄罗斯丰满熟妇hd | 一区二区三区小说 | 日韩成人中文字幕 | 日本人妻熟妇久久久久久 | 国产精品www| 好色婷婷 | 国产福利在线观看 | 刘玥91精选国产在线观看 | 亚洲国产一区二区a毛片 | 中国黄色三级 | 国产草草影院 | 亚洲二区在线观看 | a点w片| 天堂在线观看视频 | jzzijzzij亚洲成熟少妇在线播放 狠狠躁日日躁夜夜躁2022麻豆 | 国产视频123| 国产成人精品123区免费视频 | 日韩精品福利视频 | 美女屁股眼视频免费 | 国产精品毛片视频 | 国产精品探花一区二区三区 | 国产一级视频在线播放 | 韩国毛片一区二区三区 | 欧美激情久久久久久 | 午夜视频入口 | 亚洲少妇激情 | 草草视频在线免费观看 | 亚洲成人av电影在线 | 男男play呻吟动漫网站 | 天堂网a| 97超在线| 国产精品午夜未成人免费观看 | ass极品国模人体欣赏 | 西欧free性满足hd老熟妇 | 亚洲精品尤物 | 操操操插插插 | 阿v天堂2017 欧美小视频在线观看 | 污视频网站在线播放 | 国产又色又爽又黄的 | 天堂综合网久久 | 操操操网站| 长篇h版少妇沉沦交换 | 免费日皮视频 | 国产伊人久久 | 羽月希奶水一区二区三区 |