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)))
 |