TCP服务器压测出现[Errno 111] Connection refused问题求助
TCP服务器高并发负载测试出现Connection refused错误
我正在为TCP服务器搭建负载测试任务,需求是每个客户端连接服务器、发送消息后立即关闭连接(无需等待响应)。单个客户端测试正常,但使用Locust将客户端规模扩至1000时,开始收到[Errno 111] Connection refused错误,错误趋势如下图所示:

复现问题的测试代码
Rust TCP服务器代码
use chrono::Local; use tokio::io::AsyncReadExt; use tokio::net::TcpListener; use std::error::Error; #[tokio::main] async fn main() -> Result<(), Box<dyn Error>> { let addr = "0.0.0.0:5102".to_string(); let listener = TcpListener::bind(&addr).await?; let now = Local::now(); println!("{} -> Server started ...", now.format("%Y-%m-%d %T")); println!("Listening on: {}", addr); loop { let (mut socket, _) = listener.accept().await?; tokio::spawn(async move { let mut buf = vec![0; 1024]; loop { let n = socket .read(&mut buf) .await .expect("failed to read data from socket"); if n == 0 { return; } let now = Local::now(); print!("{} -> ", now.format("%Y-%m-%d %T")); for c in buf[0..n].iter() { print!("{}", format!("{:X}", c)); } println!(""); } }); } }
Cargo配置文件
[package] name = "tcp_server_rust" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] tokio = { version = "1", features = ["full"] } chrono = "0.4.27"
Locust测试脚本
import time import socket from locust import User, task, between, events ENV = "host.docker.internal:5102" def success(rq_type, name, r_size, r_time): events.request.fire( request_type=rq_type, name=name, response_time=r_time, response_length=r_size, exception=None, ) def failure(rq_type, name, r_size, r_time, exception): events.request.fire( request_type=rq_type, name=name, response_time=r_time, response_length=r_size, exception=exception ) class TCP_locust(): request_type = "TCP" def send_message(self) -> None: """Locust: Envia apenas um login""" name = "Send Message" start_time = time.time() sock = socket.socket() err = "" r_size = 0 [host, port] = ENV.split(":") try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, int(port))) except socket.error as exc: err = f"Create, con: {exc}" if err == "": try: sock.sendall(b"test") except socket.error as exc: err = f"Send: {exc}" sock.close() response_time = (time.time() - start_time) * 1000 if not err: success(self.request_type, name, r_size, response_time) else: failure(self.request_type, name, r_size, response_time, err) class TCPClient(User): abstract = True def __init__(self, environment): super().__init__(environment) self.client = TCP_locust() class TCP_User(TCPClient): wait_time = between(1, 5) @task def micodus_send_position(self): self.client.send_message()
Docker Compose配置(启动10个Locust Worker)
version: '3' services: master: image: locustio/locust ports: - "8089:8089" - "5557:5557" volumes: - ./:/mnt/locust command: -f /mnt/locust/locustfile.py --master --users 3000 --spawn-rate 100 --host "host.docker.internal:5102" worker: image: locustio/locust volumes: - ./:/mnt/locust command: -f /mnt/locust/locustfile.py --worker --master-host host.docker.internal network_mode: "host"
启动命令
docker compose up -d --build --scale worker=10
补充说明
我测试过C#、Rust、Python编写的不同TCP服务器,均出现相同问题。最初使用Python自带线程测试时也有该问题,切换到Locust是为了收集数据并更好地控制测试。
注:上述服务器和脚本并非我实际测试所用,仅用于隔离问题以便分析。
内容的提问来源于stack exchange,提问作者Leonardo Guarezi
相关产品推荐
相关产品推荐

