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
相关产品推荐
相关产品推荐

