我有一个spring boot应用程序(war)托管在tomcat 8上。在我们的应用程序中,我们有几个api是多部分请求,其中一个api经常用于推送大小约为10到20kb的文件。
随着请求的不断增长,tomcat处理这些由多个部分组成的请求的时间太长了。我说tomcat是这样的,因为我已经在我的应用程序中启用了调试日志以及Spring Security ,请求需要大约200毫秒才能处理请求和安全性。
我正在接受的请求来自另一个系统,该系统在任何情况下只发送2个请求,并且在收到响应后只发送下一个请求。
在峰值负载期间,这些请求总体上需要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条答案
按热度按时间o2rvlv0m1#
这是tomcat文档的摘录:
每个传入请求在该请求期间都需要一个线程。如果接收到的并发请求超过当前可用的请求处理线程所能处理的数量,则将创建额外的线程,直到配置的最大值(maxthreads属性的值)。如果接收到更多的同时请求,则这些请求将堆积在连接器创建的服务器套接字中,直至配置的最大值(acceptcount属性的值)。任何进一步的同时请求都将收到“连接被拒绝”错误,直到有可用的资源来处理这些错误。
一般来说,使用像nginx这样的反向代理是一个很好的做法,因为连接速度慢会大大降低应用程序的速度。尽管我认为你的计划不是这样。
我认为调试tomcat、启用调试日志级别,甚至将tomcat源代码添加到路径中,并在相关位置放置断点,或者使用诸如newrelic之类的检测工具来查看部署中的情况是一个好主意。