You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Locust测试Project Loom虚拟线程服务器时大量出现Connection reset by peer错误

问题原因与修复方案

核心原因

  • 响应未完全发送即关闭连接:你的handleRequest方法写完响应后直接关闭clientSocket,尽管PrintWriter启用了autoFlush=true,但高并发场景下,最后一段响应数据可能还留在输出缓冲区未发送,此时强制关闭Socket会导致TCP连接被重置,客户端触发ConnectionResetError。手动访问频率低,缓冲区有足够时间完成发送,所以没有问题。
  • 资源释放顺序错误:未按「先关闭输出流、再关闭Socket」的规范释放资源,也没有用try-with-resources自动管理资源,导致高并发下资源释放不彻底,放大了连接异常。
  • TCP连接状态堆积(次要):高频短连接创建关闭会产生大量TIME_WAIT状态连接,macOS默认TCP参数对这类连接的回收速度有限,会影响新连接的建立,但这不是主要触发因素。

修复代码

修改handleRequest方法,使用try-with-resources确保资源按正确顺序释放,并显式刷新输出流:

private static void handleRequest(Socket clientSocket) throws IOException {
    // try-with-resources自动管理Socket和PrintWriter,确保资源按顺序释放
    try (clientSocket; PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
        out.println("HTTP/1.1 200 OK");
        out.println("Content-Type: text/html");
        out.println(""); // 必须的响应头与体分隔空行
        out.println("<html><body><h1>Hello World!</h1></body></html>");
        out.flush(); // 显式刷新,确保所有数据发送至客户端
    }
}

额外优化(针对高并发场景)

在macOS终端执行以下命令调整TCP参数,加快TIME_WAIT连接回收:

sudo sysctl -w net.inet.tcp.msl=1000
sudo sysctl -w net.inet.tcp.finwait2_timeout=1000

内容的提问来源于stack exchange,提问作者jacobm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:42:53