当前位置: 首页 > 知识库问答 >
问题:

Tomcat 8多部分请求执行时间较长

柳豪
2023-03-14

我有一个spring boot应用程序(war)托管在Tomcat8上。在我们的应用程序中,我们有很少的api是多部分请求,其中一个api经常用于推送大小在10到20KB左右的文件。

随着请求不断增长,tomcat处理这些多部分请求的时间过长。我之所以说tomcat是因为,我已经在应用程序中启用了调试日志和springhtml" target="_blank">安全程序,并且处理请求和安全程序需要大约200ms。

我所讨论的请求来自另一个系统,该系统在任何情况下只发送两个请求,并且只有在得到响应后才会发送下一个请求。

在峰值负载时间,这些请求大约需要20-30秒来响应。其中我的应用程序日志只有200-300毫秒。

我已经用默认设置配置了tomcat,并且只修改了连接器以使用NIO1和SSL。

这是我的连接器配置

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" sslProtocol="TLS" 
clientAuth="false" keystorePass="secret" keystoreType="PKCS12" 
keystoreFile="path_to_pfx" SSLEnabled="true" secure="true" scheme="https"
/>

有人遇到过这样的问题吗?我一直在查看tomcat文档和谷歌,但没有找到任何线索。

我尝试增加池的缓冲区大小,但这也没有帮助。

共有1个答案

裘臻
2023-03-14

这是Tomcat文档的节选:

每个传入请求都需要一个线程来维持该请求的持续时间。如果接收到的同时请求比当前可用的请求处理线程所能处理的多,则将创建额外的线程,直到配置的最大值(maxThreads属性的值)。如果接收到更多的同时请求,它们将堆叠在连接器创建的服务器套接字中,直至配置的最大值(acceptCount属性的值)。任何进一步的同时请求都将收到“连接被拒绝”错误,直到有可用的资源来处理它们。

通常,使用像Nginx这样的反向代理是一个很好的实践,因为缓慢的连接会显著降低应用程序的速度。即使我认为你的程序不是这样的。

我认为调试Tomcat、启用调试日志级别或者甚至将Tomcat源代码添加到您的路径中并将断点放在相关位置或者使用像NewRelic这样的检测工具来查看部署内部发生了什么是一个好主意。

 类似资料:
  • 在 php-fpm 中有 max_execution_time 这个选项,用来限定请求最大执行时间。 imi 提供了一个中间件,用以支持设置最大请求执行时间,如果超时可以做提前返回结果的处理。 使用方法 启用 在服务器配置 beans 节中配置中间件ExecuteTimeoutMiddleware: [ 'HttpDispatcher' => [ 'middle

  • 问题内容: 我有一个API端点,必须向其发送多部分HTTP请求,该请求由两部分组成(文件系统文件)和(JSON对象)。 经过一些研究,我发现了如何在AngularJS中执行多部分请求: 1) 该函数最初具有以下形式: 此实现的结果是,请求的各个部分没有设置。 Blob ,对象看起来像这样(有点混乱,基本上第一部分是of ,第二个): 第二种方法为请求的每个部分设置了正确的内容,但没有为部分设置任何

  • 当我尝试上传一个文件和标题时,我得到以下异常。我正在将Content-Type头设置为multipart/form-data。 我如何在Spring Security后面做文件上传?这个请求似乎从未被转换成MultiPartHttpServerRequest,所以它不起作用? 如果更改方法签名以采用@RequestParam MultipartFile,则会出现如下异常: ...但我在XML中配置

  • 我试图使一个宁静的控制器上传文件。我看到了这一点,做了这个控制器: 然后我用邮递员发送了一份pdf: 但服务器崩溃,出现以下错误: 我再次找到了这个,并添加了一个文件 不幸的是,它仍然抱怨同样的错误。

  • 问题内容: 我试图使一个宁静的控制器来上传文件。我已经看到 了,并做了这个控制器: and then i used postman to send a pdf: But the server crashes with the error: 我再次找到了这个,并添加了一个bean.xml文件 不幸的是,它仍然抱怨相同的错误。 问题答案: 当您将邮递员用于多部分请求时,请不要 在页眉中指定自定义Con