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框架的总体实现,关于数据库性能测试容下篇再介绍。

目录
相关文章
|
11月前
|
人工智能 JSON 自然语言处理
基于阿里云通义千问的AI模型应用开发指南
阿里云通义千问是阿里巴巴集团推出的多模态大语言模型平台,提供了丰富的API和接口,支持多种AI应用场景,如文本生成、图像生成和对话交互等。本文将详细介绍阿里云通义千问的产品功能,并展示如何使用其API来构建一个简单的AI应用,包括程序代码和具体操作流程,以帮助开发者快速上手。
2379 3
|
JavaScript 前端开发 Java
前端开发者眼中的Node.js未来发展趋势
随着互联网的高速发展,前端开发领域的技术也在不断演进,各种各样的前端技术日新月异,前端框架也是层出不穷。在这个变化的过程中,Node.js作为一种强大的服务器端运行环境,已经成为前端开发者的重要技术之一,Node.js以其高效的非阻塞I/O模型和可伸缩性,为前端开发者提供了许多优势,而且Node.js越来越成为全栈工程师比较喜欢的技术栈,Node.js作为一种流行的服务器端运行环境,已经在前端开发领域扮演了重要的角色。在不断变化的技术环境下,在前端开发者眼中的Node.js未来发展趋势是什么呢?它是否有可能在前端领域一家独大?那么本文就来聊聊前端开发者眼中的Node.js未来发展趋势。
522 1
前端开发者眼中的Node.js未来发展趋势
|
SQL 分布式计算 DataWorks
同步Hive表数据报block文件不存在问题 java.io.FileNotFoundException: File does not exist
同步Hive表数据报block文件不存在问题 java.io.FileNotFoundException: File does not exist
|
关系型数据库 MySQL 测试技术
压测工具sysbench的使用
压测工具sysbench的使用
1007 0
|
7月前
|
数据可视化 API 开发者
R1类模型推理能力评测手把手实战
R1类模型推理能力评测手把手实战
197 2
|
10月前
|
人工智能 安全 JavaScript
Open Interpreter:AI 赋能终端!在终端中对话AI模型进行编程,通过运行代码来完成各种计算机操作任务
Open Interpreter 是一个让语言模型运行代码的强大工具,提供了一个类似 ChatGPT 的界面,支持多种编程语言和丰富的功能。
516 7
Open Interpreter:AI 赋能终端!在终端中对话AI模型进行编程,通过运行代码来完成各种计算机操作任务
|
10月前
|
机器学习/深度学习 人工智能 安全
千问团队开源会思考的QwQ模型,这模型成精了!
QwQ是由Qwen团队开发的大型语言模型,专注于增强AI的推理能力。此预览版本在数学和编程领域表现出色,但在其他领域仍有提升空间。模型具备深度自省和自我质疑的能力,通过逐步推理和假设检验,能够在复杂问题上取得突破性进展。QwQ不仅支持本地推理和Ollama直接运行,还提供了详细的微调指南,助力开发者根据特定需求定制模型。尽管QwQ在推理过程中存在语言切换和安全性等方面的局限性,Qwen团队仍致力于不断优化,推动模型向更高层次的智能迈进。[了解更多](https://modelscope.cn/studios/Qwen/QwQ-32B-preview)
3299 0
千问团队开源会思考的QwQ模型,这模型成精了!
|
前端开发 Java API
Spring Boot与GraphQL的集成
Spring Boot与GraphQL的集成
|
NoSQL Linux Redis
Redis在Linux环境下的详细安装教程
Redis在Linux环境下的详细安装教程
788 0
Redis在Linux环境下的详细安装教程
|
资源调度 关系型数据库 MySQL
SysBench
SysBench
153 0