taosBenchmark

简介

taosBenchmark 是一个用于 TDengine 的性能测试的应用程序。taosBenchmark 可以测试 TDengine 的插入、查询和订阅功能,它可以模拟由大量设备产生的大量数据,还可以灵活地控制列的数量,数据类型、线程等。以前叫 taosdemo,现在改名为为 taosBenchmark,安装包提供 taosdemo 作为 taosBenchmark 的软链接。 配置,一种是命令行配置,另一种是JSON文件

CLI

选项名称 描述
-f/--file JSON 配置文件, 与命令行其他参数不能同时使用
-c/--config-dir 配置文件所在的目录,默认路径是 /etc/taos/
-h/--host 用于连接 taosd 服务器的 FQDN,默认值为 localhost。
-P/--port 用于连接 taosd 服务器的端口号,默认值为 6030。
-I/--interface taosBenchmark 如何插入数据,默认值为 taosc。
-u/--user 用于连接 taosd 服务器的用户名,默认值为 root。
-p/--password 用于连接 taosd 服务器的密码,默认值为 taosdata。
-o/--output 指定结果输出文件的路径,默认值为 ./output.txt。
-T/--thread 指定插入数据的线程数,默认值为 8
-i/--insert-interval 隔行插入模式的插入间隔,单位为 ms,默认值为 0。
-S/--timestampstep 每个子表中每条记录的插入时间戳步长,单位是 ms,默认值是 1
-B/--interlace-rows 向子表插入交错行的数量
-r/--rec-per-req 每次插入请求的记录数,默认值为 30000
-t/--tables 子表的数量,默认值为 10000。
-n/--records 每个子表插入的记录数,默认值为 10000。
-d/--database 数据库的名称,默认值为 test。
-l/--columns 子表的列数,将使用int数据类型的列。
-A/--tag-type 子表的标签的数据类型。
-b/--data-type 子表的列的数据类型
-w/--binwidth 调整nchar和binary数据类型的默认长度,默认值为 64。
-m/--table-prefix 子表名称的前缀,默认值为 d
-E/--escape-character 在超级表和子表名称中使用转义字符,可选。
-C/--chinese nchar和binary是否基本的Unicode中文字符,可选。
-N/--normal-table 只创建普通表,不创建超级表,可选。
-M/--random 数据源否使用随机的,可选。
-x/--aggr-func 插入后查询聚合函数,可选。
-y/--answer-yes 通过确认提示继续,可选。
-R/--disorder-range 失序时间戳的范围,基于数据库的精度,默认值为 1000
-O/--disorder 插入无序时间戳的数据的概率,默认为 0。
-F/--prepare_rand 生产随机数据的随机个数,默认为10000
-a/--replica 创建数据库时的副本数量,默认值为 1。
-V/--version 显示版本信息并退出
-?/--help 显示帮助信息并退出。

JSON

1、插入 json 配置文件

{
    "filetype": "insert",
    "cfgdir": "/etc/taos",
    "host": "127.0.0.1",
    "port": 6030,
    "user": "root",
    "password": "taosdata",
    "connection_pool_size": 8,
    "thread_count": 4,
    "result_file": "./insert_res.txt",
    "confirm_parameter_prompt": "no",
    "insert_interval": 0,
    "interlace_rows": 100,
    "num_of_records_per_req": 100,
    "prepared_rand": 10000,
    "chinese":"no",
    "databases": [{
      "dbinfo": {
        "name": "db",
        "drop": "yes",
        "replica": 1,
        "days": 10,
        "cache": 16,
        "blocks": 8,
        "precision": "ms",
        "keep": 3650,
        "minRows": 100,
        "maxRows": 4096,
        "comp":2,
        "walLevel":1,
        "cachelast":0,
        "quorum":1,
        "fsync":3000,
        "update": 0
      },
      "super_tables": [{
        "name": "stb",
        "child_table_exists":"no",
        "childtable_count": 100,
        "childtable_prefix": "stb_",
        "escape_character": "yes",
        "auto_create_table": "no",
        "batch_create_tbl_num": 5,
        "data_source": "rand",
        "insert_mode": "taosc",
        "line_protocol": "line",
        "insert_rows": 100000,
        "childtable_limit": 10,
        "childtable_offset":100,
        "interlace_rows": 0,
        "insert_interval":0,
        "partial_col_num": 0,
        "disorder_ratio": 0,
        "disorder_range": 1000,
        "timestamp_step": 10,
        "start_timestamp": "2020-10-01 00:00:00.000",
        "sample_format": "csv",
        "sample_file": "./sample.csv",
        "use_sample_ts": "no",
        "tags_file": "",
        "columns": [{"type": "INT", "name": "id"}, {"type": "DOUBLE", "count":10}, {"type": "BINARY", "len": 16, "count":3}, {"type": "BINARY", "len": 32, "count":6}],
        "tags": [{"type": "TINYINT", "count":2, "max": 10, "min": 98}, {"type": "BINARY", "len": 16, "count":5, "values":["beijing","shanghai"]}]
      }]
    }]
}

参数

选项名称 描述
filetype 文件类型,指定哪种测试,对于插入测试,需要为insert。
cfgdir taosd 配置文件所在的目录,默认值是 /etc/taos。
host taosd 服务器的 FQDN,默认为 localhost。
port taosd 服务器的端口号,默认为 6030。
user 连接 taosd 服务器的用户名,默认为 root。
password 连接 taosd 服务器的密码,默认为 taosdata。
connection_pool_size taos连接池的大小,默认为线程数。
thread_count 插入和创建表的线程数,默认为 8。
result_file 保存输出结果的文件路径,默认为 ./output.txt。
confirm_parameter_prompt 在执行过程中传递确认提示,默认为无。
insert_interval 插入隔行扫描模式的间隔时间,默认值为 0
interlace_rows 每个子表的交错行数,默认值为 0。
num_of_records_per_req 每个请求中的记录数,默认值为 30000。
prepare_rand 随机产生的数据数量,默认值为 10000
chinese nchar 和 binary 都是 rand 中文,默认值为否。
dbinfo name 数据库名称,必填
dbinfo drop 插入测试前是否删除数据库,默认值为是。
dbinfo replica 复制的数量,默认值是 1。
dbinfo days 在文件中存储数据的时间跨度,默认值为 10。
dbinfo cache 内存块的大小,单位是 MB,默认值是 16。
dbinfo blocks 每个 vnode(tsdb) 中的缓存大小的内存块的数量,默认值为 6。
dbinfo precision 数据库时间精度,默认值为 "ms"。
dbinfo keep 保留数据的天数,默认值为 3650。
dbinfo minRows 文件块中的最小记录数,默认值为 100
dbinfo minRows 文件块中的最大记录数,默认值为 4096
dbinfo comp 文件压缩标志,默认值为 2。
dbinfo walLevel wal 级别,默认值是 1。
dbinfo cachelast 是否允许将每个表的最后一条记录保留在内存中,默认值为 0
dbinfo quorum 异步写需要的确认次数,默认为 1
dbinfo fsync 当 wal 设置为 2 时,fsync 的间隔时间,单位为 ms,默认值为 3000。
dbinfo update 是否支持数据更新,默认值为 0。
super_tables name 超级表的名称,必须填写。
super_tables child_table_exists 子表是否已经存在,默认为否。
super_tables child_table_count 子表的数量,必填
super_tables childtable_prefix 子表名称的前缀,必须填写。
super_tables escape_character 超级表和子表的名称包括转义字符,默认为否。
super_tables auto_create_table SQL 语句是否自动创建子表。
Super_tables batch_create_tbl_num 为每个请求创建的子表数量,默认为 10。
super_tables data_source 数据资源类型,选项:rand, sample。
super_tables insert_mode 插入模式,选项:taosc, rest, stmt, sml,默认为 taosc。
super_tables non_stop_mode 插入模式是否为持续不停的写入,默认为 no
super_tables line_protocol 行协议,可选项:line, telnet, json, 默认为 line。
super_tables tcp_transfer 使用 tcp 还是 http 协议,默认为 http。
super_tables insert_rows 每个子表的记录数,默认为 0。
super_tables childtable_offset 子表的偏移量。
super_tables childtable_limit 插入数据的子表数量。
super_tables interlace_rows 每个子表的间隔行,默认为 0。
super_tables insert_interval 两个请求之间的插入时间间隔,当 interlace_rows 大于 0 时有效。
super_tables partial_col_num 指定仅向前多少列写入,默认为 0。
super_tables disorder_ratio 紊乱时间戳的数据比例,默认为 0
super_tables disorder_range 无序时间戳的范围,只有当 disorder_ratio 大于 0 时才有效,默认为 1000。
super_tables timestamp_step 每条记录的时间戳步骤,默认为 1。
super_tables start_timestamp 每个子表的时间戳起始值,默认值是 now。
super_tables sample_format 样本数据文件的类型,现在只支持 csv。
super_tables sample_file 样本文件,仅当 data_source 为 "sample "时有效。
super_tables use_sample_ts 样本文件是否包含时间戳,默认为否。
super_tables tags_file 原理与sample_file相同,标签数据样本文件,仅支持 taosc、rest insert模式。
columns/tags type 数据类型,必填
columns/tags len 数据长度,默认为 8。
columns/tags count 该列的连续数,默认为 1。
columns/tags name 这一列的名称,连续的列名将是 name_#{number}。
columns/tags min 数字数据类型列/标签的最小值
columns/tags max 数字数据类型列/标签的最大值
columns/tags values nchar/binary 列/标签的值,将从值中随机选择。

2、查询测试 json 配置文件

{
  "filetype": "query",
  "cfgdir": "/etc/taos",
  "host": "127.0.0.1",
  "port": 6030,
  "user": "root",
  "password": "taosdata",
  "confirm_parameter_prompt": "no",
  "databases": "db",
  "query_times": 2,
  "query_mode": "taosc",
  "specified_table_query": {
    "query_interval": 1,
    "concurrent": 3,
    "sqls": [
      {
        "sql": "select last_row(*) from stb0 ",
        "result": "./query_res0.txt"
      },
      {
        "sql": "select count(*) from stb00_1",
        "result": "./query_res1.txt"
      }
     ]
   },
   "super_table_query": {
     "stblname": "stb1",
     "query_interval": 1,
     "threads": 3,
     "sqls": [
     {
       "sql": "select last_row(ts) from xxxx",
       "result": "./query_res2.txt"
      }
     ]
   }
}

查询测试 JSON 文件的参数

选项 描述
filetype 文件类型,指定哪种测试,对于查询测试,需要
cfgdir taosd 配置文件所在的目录。
host taosd 服务器的 FQDN,默认为 localhost。
port taosd 服务器的端口号,默认为 6030。
user 连接 taosd 服务器的用户名,默认为 root。
password 连接 taosd 服务器的密码,默认为 taosdata。
confirm_parameter_prompt 在执行过程中传递确认提示,默认为否。
database 数据库的名称,需要
query_times 查询次数
query mode 查询模式,选项:taosc 和 rest,默认为 taosc。
specified_table_query/super_table_query query_interval 查询时间间隔,单位是秒,默认是 0
specified_table_query/super_table_query concurrent/threads 执行 SQL 的线程数,默认为 1。
super_table_query stblname supertable name, required 超级表名称。
sqls sql SQL 命令,必填
sqls result 查询结果的结果文件,没有则为空。

3、订阅 json 配置文件

{
  "filetype":"subscribe",
  "cfgdir": "/etc/taos",
  "host": "127.0.0.1",
  "port": 6030,
  "user": "root",
  "password": "taosdata",
  "databases": "db",
  "confirm_parameter_prompt": "no",
  "specified_table_query":
    {
      "concurrent":1,
      "interval":0,
      "restart":"yes",
      "keepProgress":"yes",
      "sqls": [
        {
          "sql": "select * from stb00_0 ;",
          "result": "./subscribe_res0.txt"
        }
        ]
      },
      "super_table_query":
      {
        "stblname": "stb0",
        "threads":1,
        "interval":10000,
        "restart":"yes",
        "keepProgress":"yes",
        "sqls": [
        {
          "sql": "select * from xxxx where ts > '2021-02-25 11:35:00.000' ;",
          "result": "./subscribe_res1.txt"
        }]
      }
}

订阅测试 JSON 文件的参数

选项 描述
filetype 文件类型,指定哪种测试,对于订阅测试,需要
cfgdir taosd 配置文件的目录。
host taosd 服务器的 FQDN,默认为 localhost。
port taosd 服务器的端口号,默认为 6030。
user 连接 taosd 服务器的用户名,默认为 root。
password 连接 taosd 服务器的密码,默认为 taosdata。
databases 数据库名称,需要
confirm_parameter_prompt 在执行过程中是否通过确认提示。
specified_table_query/super_table_query concurrent/threads 执行 SQL 的线程数,默认为 1。
specified_table_query/super_table_query interval 执行订阅的时间间隔,默认为 0。
specified_table_query/super_table_query restart no: 继续之前的订阅,yes: 开始新的订阅。
specified_table_query/super_table_query keepProgress 是否保留订阅的进度。
specified_table_query/super_table_query resubAfterConsume 是否取消订阅,然后再次订阅?
super_table_query stblname supertable 的名称,必须的。
sqls sql SQL 命令,必填
sqls result 查询结果的结果文件,没有则为空。

参数具体说明

返回

insert mode

可选项有taosc, rest, stmt, sml, sml-rest, 分别对应c接口,restful,参数绑定,schemaless的c接口,taosAdapter schemaless写入

insert interval

只有当interlace rows大于0时才起作用。 意味着线程在为每个子表插入隔行扫描记录后,会等待该值的时间再进行下一轮写入。

partial col num

若该值为 5, 则仅向前 5 列写入,仅当 insert_mode 为 taosc 和 rest 时生效,为 0 则是向全部列写入。

batch create tbl num

创建子表时的批数,默认为 10。

注:实际的批数不一定与该值相同,当执行的 SQL 语句大于支持的最大长度时,会自动截断再执行,继续创建。

auto create table

仅当 insert_mode 为 taosc, rest, stmt 时 并且 childtable_exists 为 ”no“ 时生效,此参数表示执行写入的 SQL 语句,若为 “yes” 则为 insert into tb using stb tags (xxx,xxx,...) values (xxx,xxx,...) 这样的格式,若为 “no“ 则为 insert into tb values (xxx,xxx,...) 这样的格式,前者不需要提前建立子表,后者需要。

interlace rows

如果它的值为 0,意味着逐个子表逐个子表插入,如果它的值大于零,比如5,将首先插入 到第一个子表的5条记录,然后是第二个子表5条记录、然后第三个,以此类推。当所有的子表都写入5条记录后,线程将从第一个子表继续写入,以此类推。

record per request

每次插入数据请求/调用api时包含的数据行数,也是批次数,当批次数过大时,taos客户端会返回相应的错误信息,此时需要调整这个数来满足写入要求。

columns

如果同时设置了该参数和-b/--data-type,会比较该参数与-b/--data-type设置的列类型的列的个数,如果前者大于后者,比如: -l 5 -b float,double, 那么最后的列为 FLOAT,DOUBLE,INT,INT,INT。如果前者小于等于后者,比如: -l 3 -b float,double,float,bigint,那么最后的列为 FLOAT,DOUBLE,FLOAT,BIGINT

tag type

设置超级表的标签类型,nchar 和 binary 也可以设置长度,例如:

  taosBenchmark -A INT,DOUBLE,NCHAR,BINARY(16)

默认是INT,BINARY(16)。

注意:在有的 shell 比如 bash 命令里面 “()” 需要转义,则上述指令应为:

  taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\)

data type

-A/--tag-type相同,但用于列,默认为FLOAT,INT,FLOAT

random

默认的情况下,数据是模拟电表的采集点的数据,数据值有特定的大小范围,若配置次参数,数据将随机从支持最大的正负32位整数中产生。若有修改表结构的其他参数,如 -l, -b, -A等...,将自动使用从支持最大的正负32位整数内随机产生的数据。

disorder ratio

随机乱序时间戳的概率,最大为50,即为50%。随机的乱序时间戳为当前应插入数据的时间戳倒退随机disorder-range内的时间戳。

disorder range

只有当-O/--disorder大于0时才有效,单位与数据库的时间精确度相同。

prepared rand

作为数据源预先生成的随机数据的数量,小的prepare_rand 会节省内存,但会减少数据种类。若为1,则生成的所有同类型的数据相同。

connection pool size

所有与taos c客户端相关的交互都需要 taos 实例,实例会预先创建,以防止运行过程中由于中断导致的失败,该值决定taos实例预先创建的数量。若不配置,则与线程数相同。

data source

数据的来源,默认为 taosBenchmark 随机产生,可以配置为 sample,即为使用 sample_file 参数指定的文件内的数据。

line protocol

行协议,仅当 insert_mode 为 sml 与 sml-rest 时生效,可选项为 line, telnet, json。

non stop mode

写入模式是否为不停的持续写入,若为 “yes” 则 insert_rows 失效,直到 Ctrl + C 停止程序,写入才会停止。

注:即使 insert_rows 失效,但是也必须是一个非零正整数。

tcp transfer

仅当 insert_mode 为 sml-rest 并且 line_protocol 为 telnet 时生效,支持两种通讯协议: tcp 与 http, 默认为 http。

normal table

仅当 insert_mode 为 taosc, stmt, rest 模式下可以使用,不创建超级表,只创建普通表。

childtable limit

仅当 childtable_exists 为 yes 时生效,为使用语句 select tbname from stable limit x offset y; 中的limit的值 x,即为获取插入的现有的子表数量。

childtable offset

仅当 childtable_exists 为 yes 时生效,为使用语句 select tbname from stable limit x offset y; 中的 offset的值y,即为获取插入子表的偏移量。

sample file

是否使用以 csv 格式的数据作为数据源,仅当data_source 为 sample 时生效。

注:这里与最终生成的数据不同,最终数据源的数据与prepared_rand的值有关,若 csv 文件内的数据行数小于prepared_rand,那么会循环读取 csv 文件数据直到与prepared_rand相同,若大于,则会只读取 prepared_rand 个数的行的数据。

use sample ts

仅当 data_source 为 sample 时生效,sample_file 指定的 csv 文件内是否包含第一列时间戳,默认为 no, 若为yes, 则使用 csv 文件第一列的时间戳,由于同一子表时间戳不能重复,生成的数据个数必须与 csv 文件内的数据行数相同,此时 insert_rows 失效。

tags file

仅当 insert_mode 为 taosc, rest 的模式下生效。

注:这里原理与 sample-file 类似,最终的 tag 的数值与 childtable_count 有关,如果 csv 文件内的 tag 数据行小于给定的子表数量,那么会循环读取 csv 文件数据直到与子表数量相同,若大于,则只会读取 childtable_count 行 tag 数据。

type

可选值请参考官方支持的数据类型(https://www.taosdata.com/docs/cn/v2.0/taos-sql#data-type)。

注:JSON 数据类型比较特殊,只有在 tags 里面可以选择,并且有且仅有一列 JSON tag 才可以,此时 countlen 代表的意义分别是 JSON tag 内的 key-value pair 的个数和每个KV pair 的 value的值的长度,value默认为string。

count

该列连续的个数,比如我们想测试4096个列的性能时,不用罗列出 4096 个列来表示,直接使用 "count": 4096 即可。

len

该数据类型的长度,对 NCHAR,BINARY 和 JSON 数据类型有效,若对其他数据类型配置,若为 0 , 则代表这列始终都是以 null 值写入,若为其他数,则没有意义,不建议配置。

name

列的名字,若与count同时使用,比如 "name":"current", "count":3, 则 3 个列的名字分别为 current, current_2. current_3

sql

对于超级表的查询 SQL,在 SQL 命令中保留 "xxxx",程序会自动将其替换为超级表的所有子表名。 替换为超级表中所有的子表名。