47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
|
|
"""TCP 压力测试客户端:模拟峰值负载,触发大量系统调用"""
|
||
|
|
|
||
|
|
import argparse
|
||
|
|
import socket
|
||
|
|
import time
|
||
|
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||
|
|
|
||
|
|
HOST = "127.0.0.1"
|
||
|
|
PORT = 8888
|
||
|
|
|
||
|
|
|
||
|
|
def send_once(index: int) -> bool:
|
||
|
|
try:
|
||
|
|
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
|
|
client.settimeout(5)
|
||
|
|
client.connect((HOST, PORT))
|
||
|
|
msg = f"stress_test_message_{index}_{time.time()}"
|
||
|
|
client.send(msg.encode("utf-8"))
|
||
|
|
client.recv(1024)
|
||
|
|
client.close()
|
||
|
|
return True
|
||
|
|
except Exception as exc:
|
||
|
|
print(f"请求 {index} 失败: {exc}")
|
||
|
|
return False
|
||
|
|
|
||
|
|
|
||
|
|
def run_stress(total: int, workers: int):
|
||
|
|
print(f"开始压力测试: {total} 次请求, {workers} 并发")
|
||
|
|
start = time.time()
|
||
|
|
success = 0
|
||
|
|
|
||
|
|
with ThreadPoolExecutor(max_workers=workers) as pool:
|
||
|
|
futures = [pool.submit(send_once, i) for i in range(total)]
|
||
|
|
for future in as_completed(futures):
|
||
|
|
if future.result():
|
||
|
|
success += 1
|
||
|
|
|
||
|
|
elapsed = time.time() - start
|
||
|
|
print(f"完成: 成功 {success}/{total}, 耗时 {elapsed:.2f}s, QPS={success/elapsed:.1f}")
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
parser = argparse.ArgumentParser(description="TCP 压力测试客户端")
|
||
|
|
parser.add_argument("-n", "--count", type=int, default=200, help="总请求数")
|
||
|
|
parser.add_argument("-w", "--workers", type=int, default=20, help="并发线程数")
|
||
|
|
args = parser.parse_args()
|
||
|
|
run_stress(args.count, args.workers)
|