Created
January 29, 2025 05:10
-
-
Save DFilyushin/7f315d73baa40f49c392157f509b830f to your computer and use it in GitHub Desktop.
Clickhouse send some queries for load test
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import clickhouse_connect | |
import asyncio | |
import multiprocessing | |
import time | |
from datetime import datetime, timedelta | |
from random import randint | |
# Конфигурация подключения к ClickHouse | |
CLICKHOUSE_HOST = 'localhost' | |
CLICKHOUSE_PORT = 8123 | |
CLICKHOUSE_USER = 'default' | |
CLICKHOUSE_PASSWORD = 'password' | |
# Количество клиентов (процессов) | |
NUM_CLIENTS = 10 | |
# Количество запросов у одного клиента | |
QUERIES_PER_CLIENT = 10 | |
def get_random_query(): | |
random_date = datetime.isoformat(datetime.today() - timedelta(days=randint(1, 365)))[:10] | |
return f""" | |
SELECT map(base_fiat, toDecimal64(price_history,10)) AS rate_map | |
FROM | |
default.fiat_history | |
WHERE | |
fiat_code = 'RUB' | |
AND abs(dateDiff('second', date_history, parseDateTimeBestEffort('{random_date}'))) = ( | |
SELECT min(abs(dateDiff('second', date_history, parseDateTimeBestEffort('{random_date}')))) | |
FROM default.fiat_history WHERE fiat_code = 'USD') | |
""" | |
async def execute_query(client, query): | |
"""Асинхронное выполнение запроса""" | |
start_time = time.time() | |
result = client.query(query) | |
print(result.result_rows) | |
end_time = time.time() | |
return end_time - start_time | |
async def client_task(client_id): | |
client = clickhouse_connect.get_client( | |
host=CLICKHOUSE_HOST, | |
port=CLICKHOUSE_PORT, | |
username=CLICKHOUSE_USER, | |
password=CLICKHOUSE_PASSWORD | |
) | |
query_count = 0 | |
for i in range(QUERIES_PER_CLIENT): | |
query = get_random_query() | |
duration = await execute_query(client, query) | |
query_count += 1 | |
print(f"Client {client_id}, Query {i + 1}: {duration:.2f} seconds") | |
print(f"Client {client_id} finished. Total queries: {query_count}") | |
def run_client(client_id): | |
asyncio.run(client_task(client_id)) | |
if __name__ == "__main__": | |
start_time = time.time() | |
processes = [] | |
for i in range(NUM_CLIENTS): | |
p = multiprocessing.Process(target=run_client, args=(i,)) | |
processes.append(p) | |
p.start() | |
for p in processes: | |
p.join() | |
total_duration = time.time() - start_time | |
print(f"Total: {total_duration:.2f} seconds") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment