222 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Python
		
	
	
	
 | 
						||
###################################################################
 | 
						||
#           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 sys
 | 
						||
import taos
 | 
						||
import threading
 | 
						||
import time
 | 
						||
from datetime import datetime
 | 
						||
import numpy as np
 | 
						||
 | 
						||
 | 
						||
class MyThread(threading.Thread):
 | 
						||
 | 
						||
    def __init__(self, func, args=()):
 | 
						||
        super(MyThread, self).__init__()
 | 
						||
        self.func = func
 | 
						||
        self.args = args
 | 
						||
 | 
						||
    def run(self):
 | 
						||
        self.result = self.func(*self.args)
 | 
						||
 | 
						||
    def get_result(self):
 | 
						||
        try:
 | 
						||
            return self.result   # 如果子线程不使用join方法,此处可能会报没有self.result的错误
 | 
						||
        except Exception:
 | 
						||
            return None
 | 
						||
 | 
						||
 | 
						||
class MetadataQuery:
 | 
						||
    def initConnection(self):
 | 
						||
        self.tables = 100
 | 
						||
        self.records = 10
 | 
						||
        self.numOfTherads = 5
 | 
						||
        self.ts = 1537146000000
 | 
						||
        self.host = "127.0.0.1"
 | 
						||
        self.user = "root"
 | 
						||
        self.password = "taosdata"
 | 
						||
        self.config = "/etc/taos"
 | 
						||
        self.conn = taos.connect(
 | 
						||
            self.host,
 | 
						||
            self.user,
 | 
						||
            self.password,
 | 
						||
            self.config)
 | 
						||
 | 
						||
    def connectDB(self):
 | 
						||
        return self.conn.cursor()
 | 
						||
 | 
						||
    def createStable(self):
 | 
						||
        print("================= Create stable meters =================")
 | 
						||
        cursor = self.connectDB()
 | 
						||
        cursor.execute("drop database if exists test")
 | 
						||
        cursor.execute("create database test")
 | 
						||
        cursor.execute("use test")
 | 
						||
        cursor.execute('''create table if not exists meters (ts timestamp, speed int) tags(
 | 
						||
                    tgcol1 tinyint, tgcol2 smallint, tgcol3 int, tgcol4 bigint, tgcol5 float, tgcol6 double, tgcol7 bool, tgcol8 binary(20), tgcol9 nchar(20),
 | 
						||
                    tgcol10 tinyint, tgcol11 smallint, tgcol12 int, tgcol13 bigint, tgcol14 float, tgcol15 double, tgcol16 bool, tgcol17 binary(20), tgcol18 nchar(20),
 | 
						||
                    tgcol19 tinyint, tgcol20 smallint, tgcol21 int, tgcol22 bigint, tgcol23 float, tgcol24 double, tgcol25 bool, tgcol26 binary(20), tgcol27 nchar(20),
 | 
						||
                    tgcol28 tinyint, tgcol29 smallint, tgcol30 int, tgcol31 bigint, tgcol32 float, tgcol33 double, tgcol34 bool, tgcol35 binary(20), tgcol36 nchar(20),
 | 
						||
                    tgcol37 tinyint, tgcol38 smallint, tgcol39 int, tgcol40 bigint, tgcol41 float, tgcol42 double, tgcol43 bool, tgcol44 binary(20), tgcol45 nchar(20),
 | 
						||
                    tgcol46 tinyint, tgcol47 smallint, tgcol48 int, tgcol49 bigint, tgcol50 float, tgcol51 double, tgcol52 bool, tgcol53 binary(20), tgcol54 nchar(20))''')
 | 
						||
        cursor.close()
 | 
						||
 | 
						||
    def createTablesAndInsertData(self, threadID):
 | 
						||
        cursor = self.connectDB()
 | 
						||
        cursor.execute("use test")
 | 
						||
        base = threadID * self.tables
 | 
						||
 | 
						||
        tablesPerThread = int(self.tables / self.numOfTherads)
 | 
						||
        for i in range(tablesPerThread):
 | 
						||
            cursor.execute(
 | 
						||
                '''create table t%d using meters tags(
 | 
						||
                %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d',
 | 
						||
                %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d',
 | 
						||
                %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d',
 | 
						||
                %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d',
 | 
						||
                %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d',
 | 
						||
                %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d')''' %
 | 
						||
                (base + i + 1, (base + i) %
 | 
						||
                 100, (base + i) %
 | 
						||
                    10000, (base + i) %
 | 
						||
                    1000000, (base + i) %
 | 
						||
                    100000000, (base + i) %
 | 
						||
                    100 * 1.1, (base + i) %
 | 
						||
                    100 * 2.3, (base + i) %
 | 
						||
                    2, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    10000, (base + i) %
 | 
						||
                    1000000, (base + i) %
 | 
						||
                    100000000, (base + i) %
 | 
						||
                    100 * 1.1, (base + i) %
 | 
						||
                    100 * 2.3, (base + i) %
 | 
						||
                    2, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    10000, (base + i) %
 | 
						||
                    1000000, (base + i) %
 | 
						||
                    100000000, (base + i) %
 | 
						||
                    100 * 1.1, (base + i) %
 | 
						||
                    100 * 2.3, (base + i) %
 | 
						||
                    2, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    10000, (base + i) %
 | 
						||
                    1000000, (base + i) %
 | 
						||
                    100000000, (base + i) %
 | 
						||
                    100 * 1.1, (base + i) %
 | 
						||
                    100 * 2.3, (base + i) %
 | 
						||
                    2, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    10000, (base + i) %
 | 
						||
                    1000000, (base + i) %
 | 
						||
                    100000000, (base + i) %
 | 
						||
                    100 * 1.1, (base + i) %
 | 
						||
                    100 * 2.3, (base + i) %
 | 
						||
                    2, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    10000, (base + i) %
 | 
						||
                    1000000, (base + i) %
 | 
						||
                    100000000, (base + i) %
 | 
						||
                    100 * 1.1, (base + i) %
 | 
						||
                    100 * 2.3, (base + i) %
 | 
						||
                    2, (base + i) %
 | 
						||
                    100, (base + i) %
 | 
						||
                    100))
 | 
						||
            for j in range(self.records):
 | 
						||
                cursor.execute(
 | 
						||
                    "insert into t%d values(%d, %d)" %
 | 
						||
                    (base + i + 1, self.ts + j, j))
 | 
						||
        cursor.close()
 | 
						||
 | 
						||
    def queryWithTagId(self, threadId, tagId, queryNum):
 | 
						||
        print("---------thread%d start-----------" % threadId)
 | 
						||
        query = '''select tgcol1, tgcol2, tgcol3, tgcol4, tgcol5, tgcol6, tgcol7, tgcol8, tgcol9,
 | 
						||
                tgcol10, tgcol11, tgcol12, tgcol13, tgcol14, tgcol15, tgcol16, tgcol17, tgcol18,
 | 
						||
                tgcol19, tgcol20, tgcol21, tgcol22, tgcol23, tgcol24, tgcol25, tgcol26, tgcol27,
 | 
						||
                tgcol28, tgcol29, tgcol30, tgcol31, tgcol32, tgcol33, tgcol34, tgcol35, tgcol36,
 | 
						||
                tgcol37, tgcol38, tgcol39, tgcol40, tgcol41, tgcol42, tgcol43, tgcol44, tgcol45,
 | 
						||
                tgcol46, tgcol47, tgcol48, tgcol49, tgcol50, tgcol51, tgcol52, tgcol53, tgcol54
 | 
						||
                from meters where tgcol{id} > {condition}'''
 | 
						||
        latancy = []
 | 
						||
        cursor = self.connectDB()
 | 
						||
        cursor.execute("use test")
 | 
						||
        for i in range(queryNum):
 | 
						||
            startTime = time.time()
 | 
						||
            cursor.execute(query.format(id=tagId, condition=i))
 | 
						||
            cursor.fetchall()
 | 
						||
            latancy.append((time.time() - startTime))
 | 
						||
        print("---------thread%d end-----------" % threadId)
 | 
						||
        return latancy
 | 
						||
 | 
						||
    def queryData(self, query):
 | 
						||
        cursor = self.connectDB()
 | 
						||
        cursor.execute("use test")
 | 
						||
 | 
						||
        print("================= query tag data =================")
 | 
						||
        startTime = datetime.now()
 | 
						||
        cursor.execute(query)
 | 
						||
        cursor.fetchall()
 | 
						||
        endTime = datetime.now()
 | 
						||
        print(
 | 
						||
            "Query time for the above query is %d seconds" %
 | 
						||
            (endTime - startTime).seconds)
 | 
						||
 | 
						||
        cursor.close()
 | 
						||
        # self.conn.close()
 | 
						||
 | 
						||
 | 
						||
if __name__ == '__main__':
 | 
						||
 | 
						||
    t = MetadataQuery()
 | 
						||
    t.initConnection()
 | 
						||
 | 
						||
    latancys = []
 | 
						||
    threads = []
 | 
						||
    tagId = 1
 | 
						||
    queryNum = 1000
 | 
						||
    for i in range(t.numOfTherads):
 | 
						||
        thread = MyThread(t.queryWithTagId, args=(i, tagId, queryNum))
 | 
						||
        threads.append(thread)
 | 
						||
        thread.start()
 | 
						||
    for i in range(t.numOfTherads):
 | 
						||
        threads[i].join()
 | 
						||
        latancys.extend(threads[i].get_result())
 | 
						||
    print("Total query: %d" % (queryNum * t.numOfTherads))
 | 
						||
    print(
 | 
						||
        "statistic(s): mean= %f, P50 = %f, P75 = %f, P95 = %f, P99 = %f" %
 | 
						||
        (sum(latancys) /
 | 
						||
         (
 | 
						||
            queryNum *
 | 
						||
            t.numOfTherads),
 | 
						||
            np.percentile(
 | 
						||
            latancys,
 | 
						||
            50),
 | 
						||
            np.percentile(
 | 
						||
            latancys,
 | 
						||
            75),
 | 
						||
            np.percentile(
 | 
						||
            latancys,
 | 
						||
            95),
 | 
						||
            np.percentile(
 | 
						||
            latancys,
 | 
						||
            99)))
 |