1. 程式人生 > >sysbench的框架實現介紹

sysbench的框架實現介紹

sysbench是一個非常經典的綜合性能測試工具,它支援CPU,IO,記憶體,尤其是資料庫的效能測試。那它是怎麼做到通用性的呢,總結一句話是大量運用了過載的方法。

sysbench總體架構

sysbench是一個總體框架,它用來操作各個測效能的計算,那各個部門只需要做的一件事情是宣告需要的實現。只要理解了這三個struct就可以了:

/* 某個測試用例的整體結構 */
typedef struct sb_test
{
  const char *sname; const char *lname; /* 下面有具體說明 */ sb_operations_t ops; sb_builtin_cmds_t builtin_cmds; sb_arg_t *args; sb_list_item_t listitem; } sb_test_t; /* 某個測試用例的具體操作實現結構 */ typedef struct { sb_op_init *init; /* initialization function */ sb_op_prepare *prepare; /* called after timers start, but before thread execution */ sb_op_thread_init *thread_init; /* thread initialization (called when each thread starts) */ sb_op_print_mode *print_mode; /* print mode function */ sb_op_next_event *next_event; /* event generation function */ sb_op_execute_event *execute_event; /* event execution function */ sb_op_report *report_intermediate; /* intermediate reports handler */ sb_op_report *report_cumulative; /* cumulative reports handler */ sb_op_thread_run *thread_run; /* main thread loop */ sb_op_thread_done *thread_done; /* thread finalize function */ sb_op_cleanup *cleanup; /* called after exit from thread, but before timers stop */ sb_op_done *done; /* finalize function */ } sb_operations_t; /* 某個測試用例的三階段實現結構 */ typedef struct { sb_builtin_cmd_func_t *help; /* print help */ sb_builtin_cmd_func_t *prepare; /* prepare for the test */ sb_builtin_cmd_func_t *run; /* run the test */ sb_builtin_cmd_func_t *cleanup; /* cleanup the test database, files, etc. */ } sb_builtin_cmds_t;

拿最簡單的CPU效能計算舉例,它需要實現的是:

static sb_test_t cpu_test =
{
  .sname = "cpu", /*case簡稱*/
  .lname = "CPU performance test",/*case全稱*/ .ops = { .init = cpu_init, /* 初始化case */ .print_mode = cpu_print_mode, /* case啟動前,做說明 */ .next_event = cpu_next_event, /* 拿到下一個event的資料 */ .execute_event = cpu_execute_event, /* 具體執行這個event */ .report_cumulative = cpu_report_cumulative, /* 階段性報告輸出 */ .done = cpu_done /* case結束後,處理乾淨 */ }, .args = cpu_args /*子case需要的引數說明*/ };

看到這個後,把一個case需要做的事情描述很清楚了,從需要什麼引數,到初始化,逐個event執行,函式定義很清晰。sysbench的其他case也都這樣需要一個完整的結構說明,如io操作,則需要多一個case的prepare和cleandown宣告。
那sysbench的完整流程是怎樣呢?黃色部分是測試用例需要實現的。
sysbench

至此,可以清晰地看到sysbench的框架還是非常好理解。
上面struct裡面有個event概念,不同的測試event的定義都不一樣:比如CPU的測試case,一個event是完成求得小於某數(預設10000)的所有質數。比如fileio的測試case,一次read或者一次write操作就是一個event。

sysbench的執行緒介紹

  1. worker_thread具體實現是怎樣呢:欣賞下sysbench.c裡面某子執行緒是如何執行的,程式碼非常清晰易懂:
static int thread_run(sb_test_t *test, int thread_id) { sb_event_t event; int rc = 0; while (sb_more_events(thread_id) && rc == 0) { event = test->ops.next_event(thread_id); if (event.type == SB_REQ_TYPE_NULL) break; sb_event_start(thread_id); rc = test->ops.execute_event(&event, thread_id); sb_event_stop(thread_id); } return rc; }
  1. intermediate_report執行緒:週期性輸出效能資料,引數項為:--report-interval=N,對CPU的測試用例舉例:sysbench cpu --report-interval=1,擷取部分輸出結果如下:
Threads started!

[ 1s ] thds: 1 eps: 922.10 lat (ms,95%): 1.08 [ 2s ] thds: 1 eps: 925.19 lat (ms,95%): 1.08 [ 3s ] thds: 1 eps: 926.00 lat (ms,95%): 1.08 [ 4s ] thds: 1 eps: 926.00 lat (ms,95%): 1.08 [ 5s ] thds: 1 eps: 926.00 lat (ms,95%): 1.08 [ 6s ] thds: 1 eps: 926.00 lat (ms,95%): 1.08 [ 7s ] thds: 1 eps: 925.00 lat (ms,95%): 1.08 [ 8s ] thds: 1 eps: 926.02 lat (ms,95%): 1.08 [ 9s ] thds: 1 eps: 925.99 lat (ms,95%): 1.08 [ 10s ] thds: 1 eps: 924.98 lat (ms,95%): 1.08

每一秒輸出一個結果,eps是每一秒的event數,lat單位是毫秒,95分位延遲資料是1.08

  1. checkpoints_report執行緒:如果嫌週期性輸出不夠多,那麼可以在某幾個時間點整體輸出,引數項為: --report-checkpoints=[LIST,...]
    還是對CPU測試用例舉例:sysbench cpu --report-checkpoints=3,8 run,擷取部分輸出結果如下:
Threads started!

[ 3s ] Checkpoint report:
CPU speed:
    events per second:   923.01

General statistics:
    total time:                          3.0001s total number of events: 2771 Latency (ms): min: 1.08 avg: 1.08 max: 1.22 95th percentile: 1.08 sum: 3000.88 Threads fairness: events (avg/stddev): 2773.0000/0.00 execution time (avg/stddev): 3.0009/0.00 [ 8s ] Checkpoint report: CPU speed: events per second: 924.47 General statistics: total time: 8.0001s total number of events: 4622 Latency (ms): min: 1.08 avg: 1.08 max: 1.16 95th percentile: 1.08 sum: 4998.04 Threads fairness: events (avg/stddev): 4621.0000/0.00 execution time (avg/stddev): 4.9980/0.00
  1. tx_rate_controll執行緒,控制每秒輸出量的一個執行緒:引數項為: --rate=N,預設是不做控制的。
    還是拿CPU測試用例舉例,控制每秒跑10個event:sysbench cpu run --rate=10,擷取部分輸出結果如下:
Running the test with following options:
Number of threads: 1
Target transaction rate: 10/sec
Initializing random number generator from current time


Prime numbers limit: 10000

Initializing worker threads...

Threads started!

CPU speed:
    events per second:     8.87 #沒那麼精準哈

輸出速率控制在哪裡呢?眼尖的人馬上可以看到是在sb_more_events函式。那sb_more_events函式主要是做什麼呢:

  1. 判斷是否超時,預設是10秒
  2. 判斷是否到達最大event數,如果設定了的話
  3. 就是速率控制。

綜上,大概介紹了sysbench框架的總體實現,關於資料庫效能測試容下篇再介紹。