sysbench的框架实现介绍

 

sysbench是一个非常经典的综合性能测试工具,它支持CPU,IO,内存,尤其是数据库的性能测试。那它是怎么做到通用性的呢,总结一句话是大量运用了重载的方法。

sysbench总体架构

sysbench是一个总体框架,它用来操作各个测性能的计算,那各个部门只需要做的一件事情是声明需要的实现。只要理解了这三个struct就可以了:

 
  1. /* 某个测试用例的整体结构 */

  2. typedef struct sb_test

  3. {

  4. const char *sname;

  5. const char *lname;

  6. /* 下面有具体说明 */

  7. sb_operations_t ops;

  8. sb_builtin_cmds_t builtin_cmds;

  9. sb_arg_t *args;

  10.  
  11. sb_list_item_t listitem;

  12. } sb_test_t;

  13. /* 某个测试用例的具体操作实现结构 */

  14. typedef struct

  15. {

  16. sb_op_init *init; /* initialization function */

  17. sb_op_prepare *prepare; /* called after timers start, but

  18. before thread execution */

  19. sb_op_thread_init *thread_init; /* thread initialization

  20. (called when each thread starts) */

  21. sb_op_print_mode *print_mode; /* print mode function */

  22. sb_op_next_event *next_event; /* event generation function */

  23. sb_op_execute_event *execute_event; /* event execution function */

  24. sb_op_report *report_intermediate; /* intermediate reports handler */

  25. sb_op_report *report_cumulative; /* cumulative reports handler */

  26. sb_op_thread_run *thread_run; /* main thread loop */

  27. sb_op_thread_done *thread_done; /* thread finalize function */

  28. sb_op_cleanup *cleanup; /* called after exit from thread,

  29. but before timers stop */

  30. sb_op_done *done; /* finalize function */

  31. } sb_operations_t;

  32. /* 某个测试用例的三阶段实现结构 */

  33. typedef struct

  34. {

  35. sb_builtin_cmd_func_t *help; /* print help */

  36. sb_builtin_cmd_func_t *prepare; /* prepare for the test */

  37. sb_builtin_cmd_func_t *run; /* run the test */

  38. sb_builtin_cmd_func_t *cleanup; /* cleanup the test database, files, etc. */

  39. } sb_builtin_cmds_t;

拿最简单的CPU性能计算举例,它需要实现的是:

 
  1. static sb_test_t cpu_test =

  2. {

  3. .sname = "cpu", /*case简称*/

  4. .lname = "CPU performance test",/*case全称*/

  5. .ops = {

  6. .init = cpu_init, /* 初始化case */

  7. .print_mode = cpu_print_mode, /* case启动前,做说明 */

  8. .next_event = cpu_next_event, /* 拿到下一个event的数据 */

  9. .execute_event = cpu_execute_event, /* 具体执行这个event */

  10. .report_cumulative = cpu_report_cumulative, /* 阶段性报告输出 */

  11. .done = cpu_done /* case结束后,处理干净 */

  12. },

  13. .args = cpu_args /*子case需要的参数说明*/

  14. };

看到这个后,把一个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里面某子线程是如何执行的,代码非常清晰易懂:
 
  1. static int thread_run(sb_test_t *test, int thread_id)

  2. {

  3. sb_event_t event;

  4. int rc = 0;

  5.  
  6. while (sb_more_events(thread_id) && rc == 0)

  7. {

  8. event = test->ops.next_event(thread_id);

  9. if (event.type == SB_REQ_TYPE_NULL)

  10. break;

  11.  
  12. sb_event_start(thread_id);

  13.  
  14. rc = test->ops.execute_event(&event, thread_id);

  15.  
  16. sb_event_stop(thread_id);

  17. }

  18.  
  19. return rc;

  20. }

  1. intermediate_report线程:周期性输出性能数据,参数项为:--report-interval=N,对CPU的测试用例举例:sysbench cpu --report-interval=1,截取部分输出结果如下:
 
  1. Threads started!

  2.  
  3. [ 1s ] thds: 1 eps: 922.10 lat (ms,95%): 1.08

  4. [ 2s ] thds: 1 eps: 925.19 lat (ms,95%): 1.08

  5. [ 3s ] thds: 1 eps: 926.00 lat (ms,95%): 1.08

  6. [ 4s ] thds: 1 eps: 926.00 lat (ms,95%): 1.08

  7. [ 5s ] thds: 1 eps: 926.00 lat (ms,95%): 1.08

  8. [ 6s ] thds: 1 eps: 926.00 lat (ms,95%): 1.08

  9. [ 7s ] thds: 1 eps: 925.00 lat (ms,95%): 1.08

  10. [ 8s ] thds: 1 eps: 926.02 lat (ms,95%): 1.08

  11. [ 9s ] thds: 1 eps: 925.99 lat (ms,95%): 1.08

  12. [ 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,截取部分输出结果如下:
 
  1. Threads started!

  2.  
  3. [ 3s ] Checkpoint report:

  4. CPU speed:

  5. events per second: 923.01

  6.  
  7. General statistics:

  8. total time: 3.0001s

  9. total number of events: 2771

  10.  
  11. Latency (ms):

  12. min: 1.08

  13. avg: 1.08

  14. max: 1.22

  15. 95th percentile: 1.08

  16. sum: 3000.88

  17.  
  18. Threads fairness:

  19. events (avg/stddev): 2773.0000/0.00

  20. execution time (avg/stddev): 3.0009/0.00

  21.  
  22. [ 8s ] Checkpoint report:

  23. CPU speed:

  24. events per second: 924.47

  25.  
  26. General statistics:

  27. total time: 8.0001s

  28. total number of events: 4622

  29.  
  30. Latency (ms):

  31. min: 1.08

  32. avg: 1.08

  33. max: 1.16

  34. 95th percentile: 1.08

  35. sum: 4998.04

  36.  
  37. Threads fairness:

  38. events (avg/stddev): 4621.0000/0.00

  39. execution time (avg/stddev): 4.9980/0.00

  1. tx_rate_controll线程,控制每秒输出量的一个线程:参数项为: --rate=N,默认是不做控制的。
    还是拿CPU测试用例举例,控制每秒跑10个event:sysbench cpu run --rate=10,截取部分输出结果如下:
 
  1. Running the test with following options:

  2. Number of threads: 1

  3. Target transaction rate: 10/sec

  4. Initializing random number generator from current time

  5.  
  6.  
  7. Prime numbers limit: 10000

  8.  
  9. Initializing worker threads...

  10.  
  11. Threads started!

  12.  
  13. CPU speed:

  14. events per second: 8.87 #没那么精准哈

输出速率控制在哪里呢?眼尖的人马上可以看到是在sb_more_events函数。那sb_more_events函数主要是做什么呢:

  1. 判断是否超时,默认是10秒
  2. 判断是否到达最大event数,如果设置了的话
  3. 就是速率控制。

综上,大概介绍了sysbench框架的总体实现,关于数据库性能测试容下篇再介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值