【问题标题】:Tomcat server causing broken pipe for big payloadsTomcat 服务器导致大负载的管道损坏
【发布时间】:2019-09-08 11:08:27
【问题描述】:

我制作了一个简单的 spring-boot 应用程序,它为所有请求返回一个静态 json 响应。

当应用收到带有大负载(~5mb json,1 TP)的请求时,客户端会收到以下错误:

java.net.SocketException: Broken pipe (Write failed)
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:155)

我已尝试增加所有可能的限制 - 这是我的 tomcat 设置:

spring.http.multipart.max-file-size=524288000
spring.http.multipart.max-request-size=524288000
spring.http.multipart.enabled=true
server.max-http-post-size=10000000
server.connection-timeout=30000
server.tomcat.max-connections=15000
server.tomcat.max-http-post-size=524288000
server.tomcat.accept-count=10000
server.tomcat.max-threads=200
server.tomcat.min-spare-threads=200

我能做些什么来让这个简单的弹簧启动只用一个控制器成功处理这样的有效负载?

这个 springboot 应用程序和发送大负载的客户端在具有 16gb 内存的 8 核机器上运行。所以资源应该不是问题。

【问题讨论】:

    标签: apache spring-boot tomcat


    【解决方案1】:

    这是因为控制器在没有使用请求正文的情况下返回响应。 因此,服务器在收到请求后立即关闭连接,而不会消耗完整的请求正文。客户端还没有完成发送请求,服务器在此之前关闭了连接。

    解决方案: 1. 阅读代码中的完整请求正文 2.将tomcat的maxSwallowSize设置为更高的值(默认:2mb) server.tomcat.max-swallow-size=10MB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-17
      • 2020-03-06
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多