sysbench是一個很是經典的綜合性能測試工具,它支持CPU,IO,內存,尤爲是數據庫的性能測試。那它是怎麼作到通用性的呢,總結一句話是大量運用了重載的方法。數據庫
sysbench整體架構
/* 某個測試用例的總體結構 */
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;
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須要的參數說明*/
};複製代碼
那sysbench的完整流程是怎樣呢?黃色部分是測試用例須要實現的。
上面struct裏面有個event概念,不一樣的測試event的定義都不同:好比CPU的測試case,一個event是完成求得小於某數(默認10000)的全部質數。好比fileio的測試case,一次read或者一次write操做就是一個event。
sysbench的線程介紹bash
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;
}複製代碼
--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複製代碼
--report-checkpoints=[LIST,...]
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複製代碼
--rate=N
,默認是不作控制的。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 #沒那麼精準哈複製代碼
sysbench是一個整體框架,它用來操做各個測性能的計算,那各個部門只須要作的一件事情是聲明須要的實現。只要理解了這三個struct就能夠了:架構
拿最簡單的CPU性能計算舉例,它須要實現的是:sb_more_events
函數。那sb_more_events
函數主要是作什麼呢: