taosdemoPerformance.py 7.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
###################################################################
#           Copyright (c) 2016 by TAOS Technologies, Inc.
#                     All rights reserved.
#
#  This file is proprietary and confidential to TAOS Technologies.
#  No part of this file may be reproduced, stored, transmitted,
#  disclosed or used in any form or by any means other than as
#  expressly provided by the written permission from Jianhui Tao
#
###################################################################

# -*- coding: utf-8 -*-

import taos
import pandas as pd
import argparse
import os.path
18
import json
P
Ping Xiao 已提交
19
import sys
20 21

class taosdemoPerformace:
22
    def __init__(self, commitID, dbName, branch, type):
23
        self.commitID = commitID
24
        self.dbName = dbName
25 26
        self.branch = branch
        self.type = type
27 28 29
        self.host = "127.0.0.1"
        self.user = "root"
        self.password = "taosdata"
30
        self.config = "/etc/perf"
31 32 33 34
        self.conn = taos.connect(
            self.host,
            self.user,
            self.password,
35
            self.config)
36
        self.insertDB = "insertDB"
37 38 39 40 41 42
        self.host2 = "192.168.1.179"    
        self.conn2 = taos.connect(
            host = self.host2,
            user = self.user,
            password = self.password,
            config = self.config)
43

44 45 46 47 48 49 50 51 52
    def generateJson(self):
        db = {
            "name": "%s" % self.insertDB,
            "drop": "yes",
            "replica": 1
        }

        stb = {
            "name": "meters",
53
            "child_table_exists": "no",
54 55 56 57 58 59 60
            "childtable_count": 10000,
            "childtable_prefix": "stb_",
            "auto_create_table": "no",
            "data_source": "rand",
            "batch_create_tbl_num": 10,
            "insert_mode": "taosc",
            "insert_rows": 100000,
61
            "interlace_rows": 100,
62 63 64 65 66 67 68
            "max_sql_len": 1024000,
            "disorder_ratio": 0,
            "disorder_range": 1000,
            "timestamp_step": 1,
            "start_timestamp": "2020-10-01 00:00:00.000",
            "sample_format": "csv",
            "sample_file": "./sample.csv",
69
            "tags_file": "",
70 71
            "columns": [
                {"type": "INT", "count": 4}
72
            ],
73
            "tags": [
74
                {"type": "INT", "count": 1},
75 76
                {"type": "BINARY", "len": 16}
            ]
77 78 79 80 81 82 83 84 85 86 87 88
        }

        stables = []
        stables.append(stb)

        db = {
            "dbinfo": db,
            "super_tables": stables
        }

        insert_data = {
            "filetype": "insert",
89
            "cfgdir": "/etc/perf",
90 91 92 93 94 95 96 97 98 99
            "host": "127.0.0.1",
            "port": 6030,
            "user": "root",
            "password": "taosdata",
            "thread_count": 10,
            "thread_count_create_tbl": 10,
            "result_file": "./insert_res.txt",
            "confirm_parameter_prompt": "no",
            "insert_interval": 0,
            "num_of_records_per_req": 30000,
100
            "databases": [db]
101 102
        }

103 104 105 106 107 108 109 110 111 112 113 114
        insert_json_file = f"/tmp/insert.json"

        with open(insert_json_file, 'w') as f:
            json.dump(insert_data, f)
        return insert_json_file

    def getCMDOutput(self, cmd):
        cmd = os.popen(cmd)
        output = cmd.read()
        cmd.close()
        return output

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    def getBuildPath(self):
        selfPath = os.path.dirname(os.path.realpath(__file__))

        if ("community" in selfPath):
            projPath = selfPath[:selfPath.find("community")]
        else:
            projPath = selfPath[:selfPath.find("tests")]

        for root, dirs, files in os.walk(projPath):
            if ("taosdemo" in files):
                rootRealPath = os.path.dirname(os.path.realpath(root))
                if ("packaging" not in rootRealPath):
                    buildPath = root[:len(root) - len("/build/bin")]
                    break
        return buildPath

    def insertData(self):
        buildPath = self.getBuildPath()
        if (buildPath == ""):
P
Ping Xiao 已提交
134 135 136
            print("taosdemo not found!")
            sys.exit(1)
            
137 138 139 140 141 142 143 144 145 146 147
        binPath = buildPath + "/build/bin/"

        os.system(
            "%staosdemo -f %s > taosdemoperf.txt 2>&1" %
            (binPath, self.generateJson()))
        self.createTableTime = self.getCMDOutput(
            "grep 'Spent' taosdemoperf.txt | awk 'NR==1{print $2}'")
        self.insertRecordsTime = self.getCMDOutput(
            "grep 'Spent' taosdemoperf.txt | awk 'NR==2{print $2}'")
        self.recordsPerSecond = self.getCMDOutput(
            "grep 'Spent' taosdemoperf.txt | awk 'NR==2{print $16}'")
148
        self.commitID = self.getCMDOutput("git rev-parse --short HEAD")
149 150
        delay = self.getCMDOutput(
            "grep 'delay' taosdemoperf.txt | awk '{print $4}'")
151
        self.avgDelay = delay[:-4]
152 153
        delay = self.getCMDOutput(
            "grep 'delay' taosdemoperf.txt | awk '{print $6}'")
154
        self.maxDelay = delay[:-4]
155 156
        delay = self.getCMDOutput(
            "grep 'delay' taosdemoperf.txt | awk '{print $8}'")
157 158 159
        self.minDelay = delay[:-3]

        os.system("[ -f taosdemoperf.txt ] && rm taosdemoperf.txt")
160

161
    def createTablesAndStoreData(self):
162
        cursor = self.conn2.cursor()
163

164 165
        cursor.execute("create database if not exists %s" % self.dbName)
        cursor.execute("use %s" % self.dbName)
166
        cursor.execute("create table if not exists taosdemo_perf (ts timestamp, create_table_time float, insert_records_time float, records_per_second float, commit_id binary(50), avg_delay float, max_delay float, min_delay float, branch binary(50), type binary(20))")
167
        print("==================== taosdemo performance ====================")
168 169 170 171 172
        print("create tables time: %f" % float(self.createTableTime))
        print("insert records time: %f" % float(self.insertRecordsTime))
        print("records per second: %f" % float(self.recordsPerSecond))
        print("avg delay: %f" % float(self.avgDelay))
        print("max delay: %f" % float(self.maxDelay))
173
        print("min delay: %f" % float(self.minDelay))
174 175 176
        cursor.execute("insert into taosdemo_perf values(now, %f, %f, %f, '%s', %f, %f, %f, '%s', '%s')" %
            (float(self.createTableTime), float(self.insertRecordsTime), float(self.recordsPerSecond), 
            self.commitID, float(self.avgDelay), float(self.maxDelay), float(self.minDelay), self.branch, self.type))
177 178
        cursor.close()

179 180 181
        cursor1 = self.conn.cursor()
        cursor1.execute("drop database if exists %s" % self.insertDB)
        cursor1.close()
182

183 184 185 186 187
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-c',
        '--commit-id',
188
        action='store',
189 190 191 192 193 194 195 196 197
        type=str,
        help='git commit id (default: null)')
    parser.add_argument(
        '-d',
        '--database-name',
        action='store',
        default='perf',
        type=str,
        help='Database name to be created (default: perf)')
198 199 200 201 202 203 204 205 206 207 208 209 210 211
    parser.add_argument(
        '-b',
        '--git-branch',
        action='store',
        default='master',
        type=str,
        help='git branch (default: master)')
    parser.add_argument(
        '-T',
        '--build-type',
        action='store',
        default='glibc',
        type=str,
        help='build type (default: glibc)')
212 213
    args = parser.parse_args()

214
    perftest = taosdemoPerformace(args.commit_id, args.database_name, args.git_branch, args.build_type)
215
    perftest.insertData()
216
    perftest.createTablesAndStoreData()